Skip to main content
Glama
AstralVoidZ
by AstralVoidZ

ppsspp-dfx-mcp

一个把 PPSSPP 变成 AI 可调试目标的 MCP(Model Context Protocol)服务器。它把 PSP 模拟器的 WebSocket 调试器封装为面向 LLM agent 的工具面: 会话生命周期、内存读写、反汇编、断点、CPU 控制、输入自动化、截图、回放录制与诊断 脚本——并内建结构化契约、防御性错误分类法与任务级评估。

功能特性

  • 41 个静态工具,全部带结构化 inputSchema / outputSchema——没有无约束的 返回值,每个参数都有类型和说明。

  • 动态脚本工具:项目专属的诊断脚本通过 scripts.manifest.yaml 暴露为 ppsspp_script_<name> 工具,输入类型由脚本自带的 Pydantic model 决定; ppsspp_run_script 调用未暴露的脚本,ppsspp_list_scripts 查看清单—— 详见配置

  • 会话模型:支持多个并发 PPSSPP 会话、就绪探测(wait_ready)与楔死自愈 (resilient 启动)。

  • 面向 agent 的人体工学:组合工具(ppsspp_frame_snapshotppsspp_trace_memory_accessppsspp_batch_step)、session_id 自动解析、 防御性错误码([CODE] message 格式、CPU 冻结与连接断开的区分),错误文本内嵌 恢复建议。

  • 后台自动化:批量任务跑在独立的服务端任务上,不受 MCP 客户端工具调用超时的 影响;支持状态轮询、取消与注册表盘点(ppsspp_batch_list)。

  • 内建评估体系evals/):21 张场景卡 + 确定性门禁 + 对录制夹具的盲测 runner + 汇总报告——工具面按 agent 实际使用的方式被测试。

  • 诚实的协议面:能力只在其背后存在可用实现时才声明;刻意置 false 的开关 附有设计理由说明。

Related MCP server: mcp-ppsspp

环境要求

  • Python 3.14+,配合独立 venv(原因见下文)

  • 带 WebSocket 调试器的 PPSSPP 构建(服务器负责启动它,并连接 ws://<host>:<port>/debugger

  • 一个 MCP 客户端(ZCode、Claude Desktop、MCP Inspector 等)

安装

本服务器导入 MCP SDK v2(mcp.server.mcpserver),它无法与许多其他 MCP 服务器 锁定的 1.x mcp 包共存。请使用自带的引导脚本创建独立 venv:

# 在本目录执行——创建 .venv/ppsspp-dfx-mcp 并安装(editable,含 dev 依赖):
python scripts/check_env.py --bootstrap

# 校验解释器 / SDK 版本 / 包导入:
python scripts/check_env.py --check

把服务器注册到你的 MCP 客户端。本目录已附带可直接使用的 .mcp.json——让客户端 读取它,或按同样的结构内联:

{
  "mcpServers": {
    "ppsspp-dfx": {
      "command": ".venv/ppsspp-dfx-mcp/Scripts/python.exe",
      "args": ["-m", "ppsspp_dfx_mcp"],
      "cwd": "${CLAUDE_PROJECT_DIR}"
    }
  }
}

cwd 必须是同时存放 .venv/.ppsspp-dfx/ 配置的目录(独立检出时即仓库根)。 POSIX 上请用 .venv/ppsspp-dfx-mcp/bin/python 代替 Scripts/python.exe

不要在客户端与服务器之间插入包装脚本:Windows 上 os.execvCreateProcess + 父进程等待(不是 POSIX 进程替换),多一层会让最内层服务器 立即读到 stdin EOF 并静默退出——表面现象只是 -32000: Connection closed

使用

.venv/ppsspp-dfx-mcp/Scripts/python -m ppsspp_dfx_mcp   # Windows
.venv/ppsspp-dfx-mcp/bin/python -m ppsspp_dfx_mcp        # POSIX

然后直接给 agent 派任务:"启动模拟器加载这个 ISO,告诉我当前 PC"——服务器 负责会话启动、就绪探测与状态读取。工具描述遵循 PURPOSE / USAGE / BEHAVIOR / RETURNS 约定,错误路径内嵌恢复指引,agent 无需 示例即可自助。

配置

环境变量(全部可选):

变量

默认值

说明

PPSSPP_DFX_LOG_LEVEL

INFO

日志级别

PPSSPP_DFX_LOG_FORMAT

text

日志格式(textjson

PPSSPP_DFX_RATE_LIMIT

60

单工具限流(次/分钟,0 为关闭)

PPSSPP_DFX_WS_HOST

127.0.0.1

PPSSPP WebSocket 主机

PPSSPP_DFX_WS_PORT

12345

PPSSPP WebSocket 端口

PPSSPP_DFX_EXE_PATH

(来自 yaml)

PPSSPP 可执行文件路径

PPSSPP_DFX_SESSIONS_PATH

~/.ppsspp-dfx/sessions.json

会话状态路径

项目级 YAML 配置位于 .ppsspp-dfx/config/(相对工作目录):

  • project.yamlppsspp_exe 路径与项目元数据

  • addresses.yaml — 命名地址常量(同时为内存向导的 completions 能力提供候选)

  • scripts.manifest.yaml — 诊断脚本清单。每个条目带机器可读的 statusmigrated = 可运行,skeleton = 方法体返回 not_implemented)。标记 exposed: true 的脚本在启动时注册为 ppsspp_script_<name> 工具——skeleton 除外,preflight 会拒绝它们。ppsspp_reload_scripts 将动态工具注册表与清单 重新同步(无需重启),并报告声明与注册的对账结果。

独立部署快速开始

三份配置文件的开箱模板见 examples/——从这里开始,不要从零手写 YAML:

mkdir -p .ppsspp-dfx/config
cp examples/project.yaml examples/addresses.yaml \
   examples/scripts.manifest.yaml .ppsspp-dfx/config/
# 然后编辑 .ppsspp-dfx/config/project.yaml:把 ppsspp_exe 指向你的
# 带 WebSocket 调试器的 PPSSPP 构建;把 addresses.yaml 里的 PLACEHOLDER
# 地址替换为你自己逆向得到的值。

首次会话前需要知道的两件事:

  • 没有 scripts.manifest.yaml 服务器仍能启动,但所有 ppsspp_script_* 工具会 静默消失——即使 scripts: 列表为空也请保留模板(check_env.py --check 报的正是这个警告)。

  • 配置为空且无占位值时,服务器侧一切功能可用;只有会话启动需要真实的 ppsspp_exe(或 PPSSPP_DFX_EXE_PATH),地址常量也只有在你提供自己游戏的 数值后才有意义。

协议面

initialize 握手时声明——且声明实际注册的能力(SDK 从请求处理器 是否存在来推导各项能力,所以这里出现的每一项背后都有可用实现):

能力

声明

说明

tools

41 个静态工具 + 动态 ppsspp_script_<name>

resources

ppsspp://game-stateppsspp://registers(快照)

prompts

memory-breakpoint-wizardmemory-trace-wizard

completions

两个内存向导的 address 参数,候选来自 addresses.yaml

logging

协议修订 2026-07-28 移除了 logging/setLevel

tasks

仅 SDK 2.2.0 的类型定义,无服务器端实现

tools.list_changedresources.subscribe 刻意置 false。SDK 2.2.0 的 MCPServer 没有暴露握手期设置 notification_options 的入口,声明它们等于承诺 一个服务器发不出的通知。现有替代:

  • ppsspp_reload_scripts报告变化内容(exposed_added / exposed_removed),agent 无需通知通道即可响应。

  • 服务器 instructions 字符串告诉新 agent 工具面包含什么。

若未来 SDK 开放了该入口,翻转开关并补上 send_*_list_changed 调用即可——L2 契约测试(tests/unit/l2_mcp_contract/test_capabilities_contract.py)断言当前 的 false 状态并会失败,这是设计信号:该决策需要重新审视,而非回归。

返回形态

图像类工具ppsspp_screenshotppsspp_dump_textureppsspp_dump_clut)返回拆成两半的 CallToolResult

  • content — 一个携带像素的 ImageContent 块。

  • structuredContent — 仅元数据(file_path / size_bytes / format,加上 modewidthheightempty 等各工具自有字段)。图像的 base64 副本 不在这个通道里——那会膨胀 schema,且重复 content 已承载的内容。

每个工具都声明结构化 outputSchema——没有工具返回无约束对象或 items 为空的 数组。ppsspp_run_scriptinput 参数是唯一注册在案的例外:其形状由被调用的 脚本决定,因此只描述而不约束。

错误处理

当被模拟的 CPU 冻结(死循环 / HLE 阻塞 / GPU 管线停滞)时,服务器返回 CPU_FREEZE_SUSPECTED 而不是笼统的 WS_DISCONNECTED——区分"PPSSPP 进程还 活着但 CPU 冻结"与"进程已死 / WebSocket 断开"。

CPU_FREEZE_SUSPECTED 的建议处理:

  • 不要重启会话——PPSSPP 还在运行。

  • ppsspp_screenshot 截取当前画面辅助诊断。

  • 尝试 step(action='resume')(对真正的死循环可能无效)。

  • hle.thread.list 查看线程状态(可能暴露 HLE 阻塞)。

  • 在当前 PC 处用 ppsspp_disassemble 检查指令流。

相关错误码:WS_DISCONNECTED(PID 已死,真断开)、WS_TIMEOUT(带票据的 RPC 超时,保守默认)、CPU_STATE_ERROR(当前 CPU 状态不适合该操作)。错误 文本始终以 [CODE] 开头,agent 可编程分类;存在下一步的地方都内嵌了恢复建议。

故障排查速查表

症状

原因 / 修复

-32000: Connection closed(无任何信息)

MCP 客户端与服务器之间有包装脚本:Windows 上 os.execv 实为 CreateProcess + 父进程等待(非 POSIX 替换),内层 server 的 stdin 立即 EOF 静默退出。去掉中间层,直接以 venv 解释器为 command(见安装

check_env 报「独立 venv 缺失」

.venv/ 被 gitignore 排除,新 clone 必然没有。运行 python scripts/check_env.py --bootstrap

mcp SDK 版本不满足 / 导入期崩溃

系统 Python 的 mcp 包常被其他 MCP server 钉在 1.x,与 SDK v2 不可调和。不要全局安装——用 check_env.py --bootstrap 建独立 venv

ppsspp_script_* 工具全部消失(服务器正常启动)

.ppsspp-dfx/config/scripts.manifest.yaml 缺失——缺失仅告警不阻断,动态工具静默清空。从 examples/ 拷贝三份模板修复(check_env.py --check 会提示)

[PPSSPP_NOT_FOUND]

PPSSPP 可执行文件未配置。设 PPSSPP_DFX_EXE_PATH,或 .ppsspp-dfx/config/project.yamlppsspp_exe(优先级 env > yaml)

找不到 .ppsspp-dfx/config

配置目录按 cwd 发现(无父级上溯)。从含 .ppsspp-dfx/ 的目录启动,或设 PPSSPP_DFX_CONFIG_DIR 指向它

WebSocket 连接失败 / WS_DISCONNECTED

PPSSPP 未运行、端口不对,或未启用 WebSocket debugger。check_env.py --check 验证环境,ppsspp_session(action='get') 验证会话

工具调用挂起 / 超时(WS_TIMEOUT

PPSSPP 主循环负责 dispatch WebSocket 请求:UI 卡死、模态对话框弹出或模拟暂停时请求不会被处理。先截图确认 UI 状态

boot 阶段 [BOOT_TIMEOUT]

启动楔死疑似。start(resilient=true) 会隔离 GPU 后端黑名单(仅重命名 FailedGraphicsBackends.txt,不删除)并自愈重启(≤2 次重试)

read_u32 返回 IR_ENCODING_DETECTED

读到的是 JIT-IR 代码而非 MIPS 指令。改用 ppsspp_disassemble

已知限制

诚实声明协议面的边界——以下各项均已在对应工具的描述中标注,此处汇总:

  • 无存档 API:PPSSPP 的 WebSocket debugger 不暴露 savestate.* 事件, 服务器无法提供存档保存/加载。用 PPSSPP 的 UI 快捷键(F1-F8 存档槽)。

  • 帧推进只有指令级stepcpu.stepInto。整帧推进的替代:在 vblank 处理器设断点后 resume

  • analog 摇杆是持久共享态send_analog 写入后保持到下次写入,无自动复位。

  • VRAM 直读截图不可靠:直读 VRAM 与 GPU 渲染输出不同步,颜色可能失真; 默认走 render 通道。source='output' 在部分游戏上有崩溃风险,仅在 render 通道空帧回退时使用。

  • replay 时钟锚定:replay 时间线使用录制会话 boot 时刻的绝对游戏时钟, 只能在全新 boot 后按 boot 对齐序列注入(工具返回体带对齐序列说明)。

  • 保护地址段写入需显式 force=true:内核内存与 top.prx 代码段默认拒绝 写入/汇编码——这是防误写设计,不是限制性 bug。

  • 会话状态单写者~/.ppsspp-dfx/sessions.json 跨进程共享会话登记, 并发多个 MCP 服务器实例指向同一路径时后写覆盖。

开发

文档/注释规范与测试工作流见 CONTRIBUTING.md。要点:

# 全量测试套件(单元 + 契约 + 集成;约 1500 个测试):
.venv/ppsspp-dfx-mcp/Scripts/python -m pytest tests -q

# 工具签名/描述变更后重新生成工具面基线(与变更同笔提交):
.venv/ppsspp-dfx-mcp/Scripts/python scripts/dump_tool_surface.py

evals/ 目录承载盲测评估体系(场景卡、确定性门禁、runner、报告)——见 evals/README.md

许可证

MIT

Available Tools

41 tools
ppsspp_analyze_logA
Read-onlyIdempotent

PURPOSE: Filter a PPSSPP log file for ERROR / WARNING / CRASH lines.

USAGE: log_path optional (defaults to the server-mirrored PPSSPP broadcast log at .ppsspp-dfx/output/ppsspp.log, written while a session runs); filter optional (keyword); session_id optional.

BEHAVIOR: READ-ONLY. Reads and filters a log file. Does not contact PPSSPP.

RETURNS: {log_path, matches: [{line_no, text}...], count, filter}.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoAdditional keyword to filter for (in addition to ERROR/WARNING/CRASH). Case-sensitive substring match.
log_pathNoPath to the log file to analyze. S3 whitelist: must be a file under the server-managed .ppsspp-dfx tree (.ppsspp-dfx/output/ or .ppsspp-dfx/config/); arbitrary filesystem paths are rejected. If None, reads the server-mirrored PPSSPP broadcast log (.ppsspp-dfx/output/ppsspp.log — the running game's own ERROR/WARNING lines, captured while a session runs).
session_idNoOptional session ID (reserved for future use; ignored).

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of matches.
filterYesUser-supplied keyword filter.
matchesYesMatching log lines.
log_pathYesPath to the log file (or '(default)' if from launcher).

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already mark it read-only and non-destructive, but the description adds valuable behavioral context: it explicitly says 'READ-ONLY', 'Does not contact PPSSPP', and clarifies that it only reads and filters a log file. This goes beyond the annotations and removes any ambiguity about side effects.

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 well-structured with PURPOSE, USAGE, BEHAVIOR, and RETURNS sections. Every section is short, informative, and front-loaded with the tool's core purpose. No filler or redundant explanation.

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 read-only log filter tool, the description covers the purpose, default path, optional filter behavior, side-effect-free behavior, and return shape. The rich parameter schema and output schema cover the remaining details, making the definition complete for an agent to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents each parameter well, including defaults, whitelist restrictions, and case sensitivity. The description summarizes defaults but does not add substantial new parameter semantics beyond what the schema provides.

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?

Description states a specific verb ('Filter'), a specific resource ('PPSSPP log file'), and explicit line types (ERROR/WARNING/CRASH). It clearly distinguishes this from the many sibling PPSSPP tools, none of which are log-filtering tools.

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 gives clear usage context: log_path is optional with a documented default, filter is an optional keyword, and session_id is reserved. It does not explicitly state when not to use it or compare against alternatives, but the tool's function is unique among siblings and the usage section is concrete.

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

ppsspp_assembleA
Destructive

PURPOSE: Assemble MIPS instruction(s) and write the resulting bytes to memory.

USAGE: session_id + address + code ('

' or ';' separated — PPSSPP assembles one line per call so the tool loops; armips-style ';' comments are NOT supported here).

BEHAVIOR: DESTRUCTIVE. Protected ranges (kernel, top.prx code) need force=true. A partial write is reported with an error directing you to disassemble and inspect.

RETURNS: {address, code, bytes_written, response, text}.
ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesMIPS assembly source. May be a single instruction ('nop', 'addiu r5, r0, 0x10') or multiple instructions separated by '\n' or ';'. The assembler is PPSSPP's built-in MIPS encoder.
forceNoSet to True to write assembled bytes to protected code-section addresses (kernel memory < 0x08800000 or top.prx code section 0x08804000-0x08D34000). Writing to these ranges without force=True raises ToolError to prevent accidental crashes.
addressYesTarget address where assembled bytes will be written, as a hex string (e.g. '0x08804000'). Must be a valid MIPS-aligned address for the ISA.
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
codeYesAssembly source string passed in.
textYesUnified text representation: 'Assembled N bytes → 0x{ADDR:08X}'.
addressYesTarget address, hex string (e.g. '0x08804000').
responseYesRaw PPSSPP WebSocket response.
bytes_writtenYesNumber of bytes written. Best-effort: derived from response['bytes'] length when available, else 0.

TDQS

A4.5/5.0
Behavior5/5

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

The description explicitly labels the operation DESTRUCTIVE, matching the destructiveHint annotation, and adds concrete protection details: kernel and top.prx ranges require force=true and partial writes surface an error instructing disassembly. This goes well beyond the annotation's single boolean.

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?

Four labeled sections (PURPOSE, USAGE, BEHAVIOR, RETURNS) front-load the most important information and keep it to a compact block. No filler sentences.

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 full schema coverage and an output schema, the description covers invocation, formatting, destructive behavior, protected ranges, partial-failure behavior, and return shape. The only gap is explicit sibling differentiation, which is already penalized under usage guidelines and does not make the definition incomplete for invocation.

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 100%, so the baseline is 3; the description adds value by clarifying that code may contain newline or semicolon separators, that armips-style comments are unsupported, and that force is required for protected ranges. It does not add address/session_id semantics, but the schema already documents those.

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 opens with a specific action ('Assemble MIPS instruction(s)') and a clear resource ('write the resulting bytes to memory'). This differentiates it from ppsspp_write_memory (raw writes) and ppsspp_disassemble (reading) without requiring the agent to open 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 Guidelines3/5

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

The USAGE section specifies the required inputs (session_id, address, code) and code formatting ('\n' or ';' separated, no armips comments), and explains that the tool loops because PPSSPP assembles one line per call. However, it never names sibling alternatives like ppsspp_write_memory or states when to choose this over them; usage is implied rather than explicitly routed.

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

ppsspp_batch_cancelA

PURPOSE: Request cancellation of a queued or running background batch job.

USAGE: batch_id from ppsspp_batch_step(background=true).

BEHAVIOR: STATE-CHANGE. Cancels the detached task; the job's own finally block releases the session lock, so subsequent tool calls are free to use the session immediately. The abort happens at the current step boundary (a press finishes, a mid-wait cuts within ~1s). Cancelling an already-finished job is an error — check ppsspp_batch_status first if unsure.

RETURNS: {batch_id, status, note} — poll ppsspp_batch_status for the terminal state.

ParametersJSON Schema
NameRequiredDescriptionDefault
batch_idYesJob id returned by ppsspp_batch_step(background=true).

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYes
statusYes
batch_idYes

TDQS

A4.3/5.0
Behavior4/5

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

The description goes beyond annotations by detailing the asynchronous abort behavior: the job's finally block releases the session lock, enabling immediate use. It specifies timing ('step boundary', 'mid-wait cuts within ~1s') and error conditions (cancelling finished job is error). This adds significant behavioral context that annotations do not capture, such as the non-instant cancellation and lock release semantics.

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 tightly structured with clear sections (PURPOSE, USAGE, BEHAVIOR, RETURNS). Every sentence contributes: purpose states the action, usage gives the source of the parameter, behavior explains side effects and timing, and returns tells what to poll. 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?

The tool is a cancel operation with one parameter and a well-defined output schema. The description provides all necessary context: what to pass, what happens on cancellation (lock release, timing), error conditions, and guidance to poll status. Since output schema is present, return values don't need elaboration. The description fully compensates for the tool's complexity.

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

Parameters3/5

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

The schema already provides 100% coverage for the single parameter (batch_id) with a clear description. The tool description repeats the same source ('batch_id from ppsspp_batch_step(background=true)'), adding no new meaning. Since schema does the heavy lifting, a baseline of 3 is appropriate.

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 precise verb ('cancel') with a specific resource ('queued or running background batch job'). It clearly distinguishes from siblings by stating the scope ('background batch job') and referencing the providing tool 'ppsspp_batch_step(background=true)'. This prevents confusion with other batch tools like status or list.

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 explicitly states when to use it: to cancel a queued or running background job, and how to obtain the batch_id. It also mentions a caveat: cancelling an already-finished job is an error, and advises checking ppsspp_batch_status first. However, it does not explicitly state when NOT to use it or name alternatives, though the sibling list is large and the specific scope is clear.

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

ppsspp_batch_listA
Read-onlyIdempotent

PURPOSE: Survey all background batch jobs currently retained by the registry — the list companion to ppsspp_batch_status / ppsspp_batch_cancel.

USAGE: no parameters. Use it to recover a batch_id after the submit response was lost (e.g. client timeout) or to survey background activity before touching the session.

BEHAVIOR: Lock-free registry read — never opens the WS transport and never waits for the per-session lock. Jobs appear in submission order; finished jobs beyond the retention window (retention_jobs, in job count) are already evicted and absent. READ-ONLY.

RETURNS: {jobs: [{batch_id, session_id, status: queued|running|completed|failed|cancelled, executed, total, error, result_present}], retention_jobs}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobsYesAll retained jobs, in submission order
retention_jobsYesFinished-job retention window (in job count): finished jobs beyond the oldest this many are evicted and absent from jobs

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, it discloses meaningful behavior: 'Lock-free registry read — never opens the WS transport and never waits for the per-session lock,' plus ordering and retention eviction semantics. This adds real operational context the annotations do not provide.

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 organized into PURPOSE, USAGE, BEHAVIOR, and RETURNS sections. Every sentence carries useful information, including the return shape and retention behavior, with no filler or repetition.

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 list tool with annotations already declaring safety and idempotence, the description covers all needed context: when to call it, ordering, eviction, what is returned, and its relationship to sibling tools. Nothing essential 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?

There are zero parameters and the schema is empty with 100% coverage, so the baseline is 4. The description correctly reinforces 'no parameters' and explains why that is sufficient for the tool's list-survey purpose.

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 names a specific verb and resource: 'Survey all background batch jobs currently retained by the registry.' It also explicitly positions itself as the 'list companion' to ppsspp_batch_status / ppsspp_batch_cancel, which distinguishes it from those sibling tools.

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 concrete when-to-use guidance: 'recover a batch_id after the submit response was lost' or 'survey background activity before touching the session.' It does not explicitly state when not to use it versus status/cancel, but the context is clear enough, so this is one step below full exclusion guidance.

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

ppsspp_batch_statusA
Read-onlyIdempotent

PURPOSE: Poll the state and progress of a background batch job without touching the session.

USAGE: batch_id from ppsspp_batch_step(background=true).

BEHAVIOR: Lock-free registry read — never opens the WS transport and never waits for the per-session lock, so it is safe to call while a background batch (or any other tool) owns the session. Executed-step count updates as steps complete; 'completed' carries the full foreground-shaped result. READ-ONLY.

RETURNS: {batch_id, session_id, status: queued|running|completed|failed|cancelled, executed, total, error, result, retention_jobs}.

ParametersJSON Schema
NameRequiredDescriptionDefault
batch_idYesJob id returned by ppsspp_batch_step(background=true).

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorYesError message if failed/cancelled
totalYesTotal steps in the batch
resultYesFinal ppsspp_batch_step-shaped response; present once the batch completed
statusYes'queued' / 'running' / 'completed' / 'failed' / 'cancelled' (protocol Tasks mapping: 'queued'→'working')
batch_idYesJob id
executedYesSteps executed so far
session_idYesSession the batch runs on
retention_jobsYesFinished-job retention window of the registry (in job count, not seconds): completed/failed/cancelled jobs beyond the oldest this many are evicted. Precursor of the protocol-level Task ttl.

TDQS

A4.5/5.0
Behavior5/5

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

The description goes well beyond the readOnly/idempotent annotations by disclosing the lock-free registry read behavior, that it never opens the WS transport, and that it is safe during session-owning operations. It also explains how executed-step counts update and what 'completed' contains.

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?

Clearly sectioned PURPOSE, USAGE, BEHAVIOR, and RETURNS makes the content scannable and front-loaded. Every section contributes distinct, useful information without repetition.

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 one simple parameter, strong annotations, and a full RETURNS breakdown, the description gives the agent everything needed to call the tool correctly and interpret its result.

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

Parameters3/5

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

Schema description coverage is 100%, and the single parameter's schema description already explains that batch_id is returned by ppsspp_batch_step(background=true). The description reinforces this but adds little beyond the schema's own documentation.

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 PURPOSE line states a specific verb and resource: polls the state and progress of a background batch job. It also clarifies what it does not do ('without touching the session'), distinguishing it from other batch tools like ppsspp_batch_cancel and ppsspp_batch_list.

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?

USAGE explicitly tells the agent where to get batch_id (from ppsspp_batch_step(background=true)), giving clear invocation context. It also explains when it is safe to call, though it does not explicitly contrast it with alternatives.

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

ppsspp_batch_stepA

PURPOSE: Execute an ordered automation sequence of press / wait / state_probe / screenshot steps in one call, optionally on a detached background task that outlives the client timeout.

USAGE: session_id + steps:[{type: press|wait|state_probe|screenshot, ...}]; on_failure='continue'|'abort' (default continue); background=false|true.

BEHAVIOR: STATE-CHANGE. Foreground (default) holds the session lock for the whole batch; frames are 60fps wall-clock equivalents; sequences estimated >25s are rejected up-front with BATCH_BUDGET_EXCEEDED (the MCP client aborts tool calls at ~30s, killing the remaining steps server-side). Per-step MCP progress is reported when the client requests it. background=true validates and submits instantly, returns {action:'submitted', batch_id,...}, keeps the session lock for the batch duration, and reports progress via ppsspp_batch_status. If any foreground step fails the whole call is isError BATCH_STEP_FAILED — inspect results[] per step. Screenshots are auto-skipped during replay recording.

RETURNS: foreground {total, executed, succeeded, failed, skipped, recording_mode, results[], aborted}; background {action:'submitted', batch_id, session_id, total, estimated_s, hint}.

ParametersJSON Schema
NameRequiredDescriptionDefault
stepsYesOrdered list of step dicts to execute. Each step must have a 'type' field. Supported types: - press: {type:'press', button:'cross', duration:30} - wait: {type:'wait', frames:60} - state_probe: {type:'state_probe', names:'game_mode', samples:1} - screenshot: {type:'screenshot', source:'render'}
backgroundNoRun on a detached server task that survives the MCP client's ~30s tool-call timeout (default false). Foreground calls exceeding the 25s budget are rejected with BATCH_BUDGET_EXCEEDED; background calls return a batch_id immediately — poll ppsspp_batch_status for progress and the final result, cancel via ppsspp_batch_cancel. Background jobs have no per-step MCP progress notifications; use the status poll.
on_failureNoWhat to do when a step fails (default 'continue'). 'continue' keeps running subsequent steps; 'abort' stops the batch immediately. Screenshot steps that are skipped due to recording mode are NOT failures.continue
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalNoTotal steps in the batch
actionNoAlways 'run'
failedNoSteps with status='failure'
abortedNoWhether batch aborted early on failure
resultsNoPer-step results, in order
skippedNoSteps with status='skipped'
executedNoSteps actually executed (excludes skipped)
succeededNoSteps with status='success'
abort_reasonNoEmpty if not aborted
recording_modeNoWhether session was recording a replay when batch ran

TDQS

A4.4/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false), the description discloses substantial behavioral detail: 'STATE-CHANGE,' session-lock hold duration, the 25s/30s budget-timeout interaction and BATCH_BUDGET_EXCEEDED error, per-step MCP progress semantics, foreground isError behavior with BATCH_STEP_FAILED, background immediate-submit semantics, and screenshot auto-skip during replay recording. This richly exceeds what the annotations convey.

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 long but organized into labeled PURPOSE/USAGE/BEHAVIOR/RETURNS sections that front-load the core intent and make scanning easy. The BEHAVIOR section is dense with critical operational facts that have no home in the schema, so its length is justified. Minor redundancy exists between USAGE and the already-rich schema parameter descriptions.

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 tool with this complexity — four step types, two execution modes, timeout interactions, and failure semantics — the description is complete: error codes, return shapes for both foreground and background, lock behavior, and routing to status/cancel siblings are all present. With a 100%-coverage schema and an output schema present, nothing an agent needs to select and invoke this tool correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3 and the schema already documents every parameter thoroughly, including examples in the steps array and timeout context in background. The description's USAGE/RETURNS lines summarize this structure but add no meaning beyond the schema — the 60fps frame detail, budget rejection, and polling routes all also appear in the 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?

The PURPOSE line names a specific verb+resource: 'Execute an ordered automation sequence of press / wait / state_probe / screenshot steps in one call,' which immediately differentiates it from single-step siblings like ppsspp_press_button, ppsspp_wait_frames, and ppsspp_screenshot. It also names the optional detached-background mode, so an agent knows both what the tool does and how it differs from related tools.

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 USAGE line gives the required call shape (session_id + steps, on_failure, background), and the background parameter explicitly routes the agent to ppsspp_batch_status for polling and ppsspp_batch_cancel for cancellation, naming the sibling alternatives. However, it never explicitly says 'for a single press/wait/screenshot use the dedicated single-step tool,' so the when-not-to-use guidance is implied rather than stated.

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

ppsspp_breakpointA

PURPOSE: Set, remove, update, and list CPU execution breakpoints and memory watchpoints.

USAGE: action + session_id; set/remove/update manage CPU exec breakpoints (address required); mem_set/mem_remove/mem_update manage memory watchpoints (size 1/2/4+, read/write flags); list/mem_list take no address.

BEHAVIOR: MUTATING. Reliable hits need CPUCore=2 (IR Interpreter). mem_remove resolves the watchpoint's real size via mem_list first (address+size matching); mem_update merges existing read/write/change unconditionally (PPSSPP zero-omits omitted bools). CPU set/remove return no data — the tool follows with a list for verification.

RETURNS: {action, address, enabled, breakpoints[]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
logNoLog flag (update / mem_set / mem_update only; None = don't change). For mem_set, defaults to False when None.
readNoTrigger on read access (mem_set only; None defaults to True). For mem_update, passing read triggers a merge query — omit to leave read unchanged.
sizeNoMemory breakpoint watch size in bytes (mem_set / mem_remove / mem_update; default 4). Fixed-width watches use 1/2/4; larger sizes are passed through to PPSSPP as a range watch. PPSSPP matches memory breakpoints by address+size pair, so remove/update must pass the exact size recorded at set time.
writeNoTrigger on write access (mem_set only; None defaults to True). For mem_update, passing write triggers a merge query — omit to leave write unchanged.
actionYesBreakpoint operation. Valid values: CPU breakpoint actions: - 'set': add a CPU execution breakpoint (requires address; enabled? defaults to True; condition? optional). - 'remove': delete a CPU breakpoint by address. - 'list': list all current CPU breakpoints. - 'update': update a CPU breakpoint's enabled/log/condition/log_format (requires address; all other params optional). Memory breakpoint actions: - 'mem_set': add a memory access breakpoint (requires address; size?/read?/write?/enabled?/log?/condition?/log_format?). - 'mem_remove': delete a memory breakpoint by address. Delete semantics are STRICT: removing a non-existent memcheck is an ERROR (unlike ppsspp_state_observer action=clear, which is idempotent-ok — F-5 contract, 2026-09-08). - 'mem_list': list all current memory breakpoints. - 'mem_update': update a memory breakpoint's enabled/log/condition/log_format (requires address).
addressNoBreakpoint address, as a hex string (e.g. '0x08804000'). Required for set / remove / update / mem_set / mem_remove / mem_update; ignored for list / mem_list.0x0
enabledNoBreakpoint enable flag. For action='set' / 'mem_set', defaults to True when None. For action='update' / 'mem_update', None means 'don't change'. Ignored for remove / list actions.
conditionNoBreak condition expression (set / update / mem_set / mem_update; None = don't send).
log_formatNoLog format string (update / mem_set / mem_update only; None = don't change).
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
actionYes'set' / 'remove' / 'list' / 'update' / 'mem_set' / 'mem_remove' / 'mem_list' / 'mem_update'.
addressYesBreakpoint address, hex string (e.g. '0x08804000'); '0x00000000' for list / mem_list.
enabledYesEnabled flag (set / mem_set / update / mem_update only).
breakpointsYesBreakpoint list (list / mem_list only).

TDQS

A4.9/5.0
Behavior5/5

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

The description is marked 'MUTATING' and explains important behavioral details: 'Reliable hits need CPUCore=2 (IR Interpreter)', 'mem_remove resolves the watchpoint's real size via mem_list first', and 'mem_update merges existing read/write/change unconditionally (PPSSPP zero-omits omitted bools)'. It also notes that CPU set/remove return no data. These are critical behavioral insights beyond the annotations, which are minimal (no readOnly, no idempotent, no destructive hints). The description compensates fully.

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 well-structured with labeled sections (PURPOSE, USAGE, BEHAVIOR, RETURNS). It is compact yet information-dense, with each sentence serving a purpose. The front-loaded PURPOSE and USAGE sections quickly orient the agent. 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?

Given the tool's complexity (10 parameters, multiple actions), the description covers essential aspects: purpose, usage patterns, behavioral caveats (CPUCore requirement, size matching, merge semantics), and return shape. The output schema exists, so return details are already structured. The description is complete enough for an agent to call the tool correctly without surprises.

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 100%, so the schema documents all parameters in detail. The description adds a summary of action semantics and the crucial note about size matching for remove/update. It also clarifies that for mem_update, passing read/write triggers a merge query. This adds meaning beyond the schema, especially the merger behavior and size matching caveat. A slight deduction because not all parameters are described in the description, but the schema is thorough.

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 clearly states the tool's purpose: 'Set, remove, update, and list CPU execution breakpoints and memory watchpoints.' It uses specific verbs and resources, distinguishing between CPU execution breakpoints and memory watchpoints. The sibling tools are mostly unrelated (memory read/write, stepping, etc.), so this tool stands out as the breakpoint manager.

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?

The description explicitly instructs how to use the tool: 'action + session_id', and details which actions manage which type of breakpoint. It also notes that 'list/mem_list take no address' and that 'CPU set/remove return no data—the tool follows with a list for verification.' This gives clear usage context and differentiates between CPU and memory variants, though it doesn't explicitly mention when to choose this over siblings, but the purpose is unique enough.

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

ppsspp_convert_addressA
Read-onlyIdempotent

PURPOSE: Convert an address between IDA and PPSSPP address spaces (offset ±0x08804000).

USAGE: address required; mode optional ('auto' default / 'ida_to_ppsspp' / 'ppsspp_to_ida'); session_id optional.

BEHAVIOR: READ-ONLY. Pure arithmetic on the address; no PPSSPP contact.

RETURNS: {original, converted, mode, top_base_ppsspp, top_base_ida}.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoConversion mode. 'auto' (default) infers from value: if address >= top_base.ppsspp, treats as ppsspp_to_ida; else ida_to_ppsspp.auto
addressYesAddress to convert, as a hex string (e.g. '0x08804000').
session_idNoOptional session ID (reserved for future use; ignored).

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeYesConversion mode used ('ida_to_ppsspp'/'ppsspp_to_ida').
originalYesInput address, hex string (e.g. '0x08804000').
convertedYesOutput address, hex string (e.g. '0x08804000').
top_base_idaYestop.prx IDA base address, hex string.
top_base_ppssppYestop.prx PPSSPP base address, hex string.

TDQS

A4.2/5.0
Behavior4/5

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

Description adds READ-ONLY and 'Pure arithmetic' beyond annotations (which already state readOnlyHint). It further clarifies no PPSSPP contact, which is not visible in annotations, adding genuine behavioral context.

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?

Uses minimal sections with clear labels; every sentence is informativeigator. The core purpose is front-loaded, and it avoids repetition of schema details.

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?

Given the tool's simplicity, the description covers purpose, usage, behavior, and return values. With output schema present, return format is already documented. The only slight gap is not explicitly describing the 'auto' inference logic in the description, but that is covered by the schema.

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

Parameters3/5

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

Schema already includes detailed descriptions for all parameters (coverage 100%), so description doesn't need to explain them. However, the description does specify the offset (0x08804000) and mode inference logic, which adds context beyond the schema's enum list.

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 ('convert') and resource ('address between IDA and PPSSPP address spaces') with exact offset. Without opening the schema it is clear what this tool does, and it is distinguishable from siblings like ppsspp_read_memory.

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?

Explains the required parameter (address) and the optional mode parameter with its auto detection behavior. It does not explicitly state when to choose this tool over alternatives, but given the tool's uniqueness (address conversion vs. memory ops), implied usage is clear enough.

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

ppsspp_disassembleA
Read-onlyIdempotent

PURPOSE: Disassemble N MIPS instructions at a given address.

USAGE: address required; session_id optional when exactly one session is active; count optional (default 10).

BEHAVIOR: READ-ONLY. Calls memory.disasm via WebSocket. Does not modify memory or CPU state.

RETURNS: {address, count, instructions: [{address, text}...]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNoNumber of instructions to disassemble. Capped at 100 to prevent oversized responses.
addressYesStarting address for disassembly, as a hex string (e.g. '0x08804000').
session_idNoActive session ID; omit to auto-resolve when exactly one session is active.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of instructions disassembled.
addressYesStarting address, hex string (e.g. '0x08804000').
instructionsYesList of disasm line dicts (text + address).

TDQS

A4.3/5.0
Behavior4/5

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

The description states READ-ONLY, notes that it calls memory.disasm via WebSocket, and explicitly guarantees no modification to memory or CPU state. Annotations already carry readOnly/destructive/idempotent hints, so this adds implementation-level context and a state-safety guarantee rather than merely repeating structured data. No contradiction with annotations.

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?

Four labeled sections (PURPOSE, USAGE, BEHAVIOR, RETURNS) front-load the most important facts and keep every sentence purposeful. The description is compact, scannable, and free of filler or unnecessary repetition of the full 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?

The description covers the call's purpose, parameter requirements, behavioral safety, and return shape in a few lines. Since an output schema is present and annotations already cover safety, nothing essential for correct invocation is missing; the only mild omission is explicit tool-alternative guidance.

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

Parameters3/5

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

Schema coverage is 100%, with all three parameters already described in the input schema. The description restates requiredness and defaults for address, count, and session_id, but it does not add new parameter semantics beyond what the schema already provides, so the high-coverage baseline 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 opens with a specific action and resource: 'Disassemble N MIPS instructions at a given address.' It clearly states the operation, the target, and the count parameter, which distinguishes it from write-oriented siblings like ppsspp_assemble and search-oriented tools like ppsspp_search_disasm.

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 USAGE section gives practical parameter guidance: address is required, session_id is optional only when one session is active, and count has a default. It does not explicitly name alternatives or state when not to use this tool, but the purpose and parameter conditions make the intended call context clear, so it falls just short of full alternative routing.

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

ppsspp_dump_clutA
Read-onlyIdempotent

PURPOSE: Dump the currently-bound CLUT palette as an image plus metadata.

USAGE: session_id. Only the CURRENTLY bound palette can be captured — no VRAM-address targeting.

BEHAVIOR: READ-ONLY. An empty capture raises CAPTURE_EMPTY — advance to a scene that uses the palette and retry.

RETURNS: structuredContent metadata (file_path/size_bytes/format); the image itself arrives as an ImageContent block.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
formatYes
file_pathYes
size_bytesYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'READ-ONLY'. It adds valuable behavioral context beyond annotations by disclosing that an empty capture raises CAPTURE_EMPTY and advising to advance to a relevant scene and retry. The RETURNS section also clarifies how output is delivered.

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 tightly organized into four labeled sections, each carrying distinct information: purpose, usage, behavior, and returns. Every sentence earns its place, and the most important facts are front-loaded. There is no fluff or redundancy beyond a harmless READ-ONLY restatement of the annotation.

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 single-parameter, read-only tool with an output schema and rich annotations, this description covers everything an agent needs: what it does, its key limitation, its error mode, and the shape of its result. No critical information is missing for selecting or invoking the tool correctly.

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

Parameters3/5

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

The input schema already documents session_id with 100% coverage, so the description need not repeat it. The description only mentions 'session_id' as a usage label and adds no deeper meaning about its format or constraints. This matches the baseline for high schema coverage.

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 names a specific action ('Dump'), a concrete resource ('currently-bound CLUT palette'), and the output form ('image plus metadata'). It further distinguishes the tool from address-targeted dumps by explicitly saying 'no VRAM-address targeting', making its scope unmistakable even among many siblings.

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 USAGE section provides clear context: it takes a session_id and can only capture the currently-bound palette. It does not explicitly name alternative tools or state when-not-to-use it, but the restriction against VRAM-address targeting gives an agent actionable guidance about the tool's limits.

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

ppsspp_dump_textureA
Read-onlyIdempotent

PURPOSE: Dump the currently-bound GPU texture as an image plus metadata.

USAGE: session_id. Only the CURRENTLY bound texture — no VRAM-address targeting.

BEHAVIOR: READ-ONLY. An empty capture raises CAPTURE_EMPTY — enter a scene that renders and retry.

RETURNS: structuredContent metadata (level/file_path/size_bytes/format); the image itself arrives as an ImageContent block.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNoTexture mipmap level (default 0). PPSSPP captures the currently-bound texture — it does NOT support capture by VRAM address.
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
levelYesTexture mipmap level dumped.
formatYesImage format ('png' or 'jpeg').
file_pathYesPath where image was saved.
size_bytesYesDecoded image size in bytes.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already provide readOnlyHint, idempotentHint, and destructiveHint. The description adds valuable behavioral context beyond these: it declares READ-ONLY, details an error condition (CAPTURE_EMPTY) and prescribes a retry action, and explains the return format (structuredContent metadata plus ImageContent block). This exceeds the baseline needed when annotations are present.

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 compact and well-structured with bolded section labels (PURPOSE, USAGE, BEHAVIOR, RETURNS). Each sentence serves a distinct function—purpose, usage constraint, behavior/error, and output format—with zero 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?

Given this is a simple tool with an output schema and annotations already covering safety and idempotency, the description provides all essential operational context: how to invoke it (session_id), what it captures (currently bound texture), what errors may occur and how to recover, and what output to expect. Nothing critical is missing for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully documents both parameters. The description repeats that session_id is required and clarifies texture selection behavior, but this is largely redundant with the schema's own parameter descriptions. It adds minimal semantic value beyond the 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?

The description clearly states a specific verb and resource: 'Dump the currently-bound GPU texture as an image plus metadata.' It distinguishes itself from siblings by explicitly noting it targets only the currently bound texture and not VRAM addresses, making it easy to differentiate from tools like ppsspp_screenshot or ppsspp_dump_clut.

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 provides clear context: it requires a session_id and only operates on the currently bound texture, explicitly excluding VRAM-address targeting. However, it does not name alternative tools or explicitly state when to use this tool over siblings, leaving some inferencing to the agent.

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

ppsspp_evaluateA
Read-onlyIdempotent

PURPOSE: Evaluate a debugger expression (register names, hex literals, simple arithmetic).

USAGE: session_id + expression. No '*addr' dereference syntax — read memory with read_u32 instead.

BEHAVIOR: READ-ONLY. Pauses/resumes the CPU internally.

RETURNS: {expression, value, response, text}.

ParametersJSON Schema
NameRequiredDescriptionDefault
expressionYesDebugger expression to evaluate. Examples: 'r5 + 0x10', 'pc', 'r5 + r6'. The supported syntax is whatever PPSSPP's expression evaluator accepts. Note: PPSSPP's evaluator does NOT support dereference syntax like '*0x08804000' — use read_u32 / read_bytes instead to read memory at an address.
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYesUnified text representation: '{EXPR} = 0x{VAL:X}' when value is an int, or '{EXPR} = {value!r}' otherwise.
valueYesEvaluated value (int) if numeric, else None.
responseYesRaw PPSSPP WebSocket response.
expressionYesThe expression evaluated.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description's 'READ-ONLY' label mostly repeats structured data. However, 'Pauses/resumes the CPU internally' adds a meaningful behavioral side effect beyond the annotations exceptional. This helps an agent understand why a seemingly safe read may still briefly affect execution state.

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 compact and well-organized into PURPOSE, USAGE, BEHAVIOR, and RETURNS. Every line carries meaningful operational information without redundancy or fluff. The most important constraints are front-loaded.

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?

Given the two parameters, high schema coverage, and rich annotations, the description provides everything needed to invoke the tool correctly: purpose, required inputs, a behavioral side effect, an alternative for an unsupported use case, and the return shape. Nothing essential is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and the expression parameter already documents supported syntax, examples, and the no-dereference caveat. The description's 'session_id + expression' adds no new semantic value beyond the schema. There is no coverage gap for the description to compensate for, so baseline 3 is appropriate.

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 opens with a specific verb and resource: 'Evaluate a debugger expression', and enumerates the accepted operand classes ('register names, hex literals, simple arithmetic'). It also separates itself from memory-reading tools by explicitly stating dereference syntax is not supported and pointing to read_u32 instead.

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 'USAGE' line indicates that session_id and expression are required. More importantly, the exclusion 'No '*addr' dereference syntax — read memory with read_u32 instead' gives an explicit when-not-to-use rule and names the alternative. It does not cover all possible alternatives among the many sibling tools, but the key routing edge case is handled.

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

ppsspp_frame_snapshotA

PURPOSE: One-call paused scene snapshot — pause (unless already paused), capture pc + registers + optional named probes, then resume.

USAGE: session_id; probes = optional comma-separated state_observer registry names; want_registers default true. Prefer this over a manual pause + query(registers) + resume sequence.

BEHAVIOR: STATE-CHANGE. The session lock is held for the whole call (pause→capture→resume is short). A CPU we paused is resumed before returning; an already-paused CPU stays paused. A failing capture never leaves the game frozen.

RETURNS: {was_stepping, resumed, pc, trust_level, registers, probes} — registers/probes keys are ALWAYS present; they carry null when opted out (want_registers=false / probes omitted) — F-8 nullable-key contract, 2026-09-08.

ParametersJSON Schema
NameRequiredDescriptionDefault
probesNoOptional comma-separated state_observer registry probe names to capture alongside the CPU state (empty = none).
session_idYesActive session ID.
want_registersNoInclude the full CPU register dump (GPR/FPU/VFPU).

Output Schema

ParametersJSON Schema
NameRequiredDescription
pcNoProgram counter, hex string (high trust).
probesNostate_observer capture block (when requested).
resumedNoTrue when the tool resumed a CPU it had paused (an already-paused CPU is left paused).
registersNoFull GPR/FPU/VFPU register dump (when requested).
trust_levelNosafe_get_pc trust level.
was_steppingNoTrue when the CPU was already paused at entry.

TDQS

A4.5/5.0
Behavior5/5

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

The description explicitly discloses that this is a state-changing operation, that the session lock is held for the whole call, that a paused CPU is resumed before returning, that an already-paused CPU stays paused, and that a failing capture never leaves the game frozen. These details go well beyond the sparse annotations and are exactly the behavioral context an agent needs.

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 organized into short labeled sections — PURPOSE, USAGE, BEHAVIOR, RETURNS — and every sentence adds distinct information. There is no filler despite covering multiple facets of the tool's behavior.

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 state-changing, multi-step tool with an output schema, the description covers purpose, invocation parameters, lock and resume semantics, failure behavior, and the exact return shape including the nullable-key contract. Nothing an agent needs to safely call this tool is missing.

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

Parameters3/5

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

The input schema already documents all three parameters at 100% coverage, so the baseline is 3. The description reinforces defaults and semantics (optional probes, want_registers default true) but mostly mirrors the schema rather than adding new parameter-level meaning. The nullable-key contract is valuable but is return behavior, not parameter semantics.

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 precise composite operation: pause (unless already paused), capture PC + registers + optional probes, then resume. This clearly distinguishes it from a manual pause/query/resume sequence and from sibling tools like get_pc or query. The verb and resource are specific and 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 gives explicit invocation guidance and directly recommends this tool over a manual pause + query(registers) + resume sequence, which is the natural alternative. It does not enumerate all sibling exclusions, but the usage context is clear enough for an agent to know when to choose this combined snapshot action.

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

ppsspp_get_pcA
Read-onlyIdempotent

PURPOSE: Safely read the current Program Counter.

USAGE: session_id optional when exactly one session is active.

BEHAVIOR: READ-ONLY. Pauses CPU temporarily for read consistency, then resumes. trust_level='high'.

RETURNS: {pc, trust_level}.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idNoActive session ID; omit to auto-resolve when exactly one session is active.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pcYesProgram counter value, hex string (e.g. '0x08804000').
trust_levelYesTrust annotation. Lowercase enum value: 'high' (stepping-verified) / 'medium' / 'low'.

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint), the description reveals that the CPU is paused temporarily for read consistency and then resumed, and that trust_level='high' is returned. This adds meaningful behavioral context that annotations alone do not provide.

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 compact and well-organized into PURPOSE, USAGE, BEHAVIOR, and RETURNS sections. Each line carries distinct information with 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 one-parameter read-only getter with full schema coverage and an output schema, the description covers session resolution, CPU pause/resume behavior, and trust_level. Nothing needed to invoke it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents that session_id is optional and omitting it auto-resolves when exactly one session is active. The description's USAGE line essentially restates this, adding no new semantic meaning.

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 opens with a specific verb and resource: 'Safely read the current Program Counter.' This unambiguously identifies the operation and its target, and clearly distinguishes it from sibling tools like read_memory, disassemble, or write_register.

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 USAGE line only addresses the optional session_id parameter ('optional when exactly one session is active') rather than explaining when to prefer this tool over alternatives. Selection guidance is implied by the PURPOSE statement, but no explicit when/when-not or alternative routing is provided.

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

ppsspp_gpu_recordA
Read-onlyIdempotent

PURPOSE: Capture the next rendered frame's GE command stream as a binary dump file.

USAGE: session_id. The CPU must be RUNNING — a paused GPU never flips a frame; the MCP pre-probe converts that into a clean CPU_STATE_ERROR.

BEHAVIOR: READ-ONLY. Captures to a binary file under output/gpu_dumps/ (not JSON).

RETURNS: {size_bytes, file_path, raw, text}.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawYesRaw `gpu.record.dump` response metadata from PPSSPP.
textYesUnified text representation: 'dumped {N} bytes → {file_path}'.
file_pathYesLocal file path where the dump was auto-saved (.ppsspp-dfx/output/gpu_dumps/<timestamp>.dump). Empty if the dump was empty or save failed.
size_bytesYesSize of the decoded GE command dump in bytes. 0 if PPSSPP returned no data (e.g., no game running, or timeout).

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description reveals the output destination (output/gpu_dumps/), the binary (non-JSON) format, and the MCP pre-probe error conversion. It explicitly says READ-ONLY, which is consistent with annotations, and adds meaningful behavioral context not visible in the schema.

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 organized into four compact labeled sections (PURPOSE, USAGE, BEHAVIOR, RETURNS) and front-loads the key facts. Every sentence carries operational value with no 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?

For a single-parameter tool with a rich annotation set and an existing output schema, the description covers purpose, precondition, output behavior, and return shape. An agent has enough information to invoke it correctly and understand the result without looking up additional context.

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

Parameters3/5

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

Schema coverage is 100% and the session_id parameter is already documented as 'Active session ID.' The description only repeats 'session_id' in USAGE without adding extra syntax, validation, or format semantics, so the baseline of 3 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: 'Capture the next rendered frame's GE command stream as a binary dump file.' This clearly identifies the tool's operation and distinguishes it from sibling GPU tools like ppsspp_gpu_stats or ppsspp_screenshot.

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 states the only required input, session_id, and gives an explicit precondition: the CPU must be RUNNING, with a concrete explanation of why and the resulting CPU_STATE_ERROR. It does not name alternative sibling tools, but the when-to-use condition is unambiguous.

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

ppsspp_gpu_statsA
Read-onlyIdempotent

PURPOSE: Query GPU counters — fps, vblanks per second, timing info.

USAGE: session_id. The CPU must be RUNNING; paused, the MCP pre-probe returns CPU_STATE_ERROR instead of hanging — which doubles as the cheapest paused-CPU probe.

BEHAVIOR: READ-ONLY.

RETURNS: {fps, vblanks_per_second, info, timing, raw, text}.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fpsYesFrames per second. None if PPSSPP didn't return it (e.g., no game running, or response shape differs).
rawYesRaw `gpu.stats.get` response from PPSSPP.
infoYesGPU info dict (vendor / name / version, etc.).
textYesUnified text representation: 'fps={FPS} vblanks={VBLANKS} info_keys={N} timing_keys={N}'.
timingYesGPU timing dict (frame / block / vertex timing, etc.).
vblanks_per_secondYesVBlanks per second. None if PPSSPP didn't return it.

TDQS

A4.5/5.0
Behavior5/5

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

Discloses a behavioral trait not covered by annotations: the MCP pre-probe returns CPU_STATE_ERROR when paused instead of hanging, which also doubles as a probe. The READ-ONLY statement is consistent with annotations and adds no contradiction, while the error behavior is genuinely additional context.

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 well-structured with PURPOSE, USAGE, BEHAVIOR, and RETURNS sections, each contributing value. Front-loaded with the purpose and behavior, it avoids filler while including a dense but useful note about the paused-CPU probe.

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 single-parameter, read-only, idempotent tool with an output schema, the description covers purpose, usage condition, error behavior, and return fields. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

The schema already fully documents the only parameter, session_id ('Active session ID.'), with 100% coverage. The description merely restates 'session_id' in the USAGE section without adding new semantic meaning, so the baseline of 3 is appropriate.

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?

Description states a specific verb ('Query GPU counters') and the exact metrics returned (fps, vblanks per second, timing info), leaving no ambiguity about the resource and action. It clearly differentiates from the sibling ppsspp_gpu_record by focusing on stats/query rather than recording.

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?

Provides explicit usage conditions: 'The CPU must be RUNNING' and explains the paused-CPU behavior (CPU_STATE_ERROR instead of hanging), including a clever secondary use as a cheapest paused-CPU probe. However, it does not name alternatives, so it falls short of full when-to-use vs. when-not-to-use guidance.

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

ppsspp_healthA
Read-onlyIdempotent

PURPOSE: Probe MCP server liveness and readiness without contacting PPSSPP. Use this before any session-dependent tool to verify the server is up.

USAGE: No parameters.

BEHAVIOR: READ-ONLY. Reads in-memory server counters (uptime, registered tool count, active session count). Does not contact PPSSPP and does not modify any state.

RETURNS: Dict with status ('ok'/'degraded'), version, python_version, pydantic_version, uptime_s, tool_count, session_count.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesServer status: 'ok' when all subsystems healthy; 'degraded' when sessions.json is inaccessible/corrupted but server is otherwise functional.
versionYesMCP server version.
uptime_sYesServer uptime in seconds.
tool_countYesNumber of registered MCP tools.
session_countYesNumber of active sessions.
session_errorYesWhen status='degraded', describes the sessions.json issue (e.g. 'FileNotFoundError: ...' or 'JSONDecodeError: ...'). None when sessions.json is healthy.
python_versionYesPython interpreter version.
pydantic_versionYesPydantic version.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description's added value is explaining exactly what it reads ('in-memory server counters') and that it 'does not contact PPSSPP and does not modify any state.' This goes beyond the annotations and gives the agent a concrete picture of the tool's behavior.

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 organized into clear labeled sections (PURPOSE, USAGE, BEHAVIOR, RETURNS) and every sentence carries key information. It is front-loaded with the purpose and usage, and contains no 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?

For a simple health-check tool with zero parameters and an output schema, the description fully covers purpose, usage, behavior, and return format. It even includes the possible status values and specific return fields. Nothing an agent needs to invoke it correctly 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 and schema coverage is 100% (trivially). The description explicitly states 'No parameters,' which is all that is needed. The baseline of 4 for zero parameters 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?

Description states a specific verb ('probe'), resource ('MCP server liveness and readiness'), and explicitly differentiates from siblings by saying 'without contacting PPSSPP' and 'Use this before any session-dependent tool'. An agent can clearly distinguish this health-check tool from the many PPSSPP interaction tools.

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 an explicit when-to-use instruction: 'Use this before any session-dependent tool to verify the server is up.' It also implies not to use it for PPSSPP state checks via 'without contacting PPSSPP', but does not name specific alternative tools or provide a when-not-to-use list, so it falls short of the full 5.

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

ppsspp_hold_buttonsA

PURPOSE: Hold a combination of PSP buttons until a subsequent call changes the state.

USAGE: session_id + buttons required (pipe-separated combination, e.g. 'cross|circle'). Valid names: cross / circle / triangle / square / up / down / left / right / start / select / ltrigger / rtrigger.

BEHAVIOR: STATE-CHANGE. Sets button-held state in PPSSPP; persists until next hold_buttons / send_analog call.

RETURNS: {buttons}.

ParametersJSON Schema
NameRequiredDescriptionDefault
buttonsYesButton combination string. Multiple buttons separated by '|' (e.g. 'cross|circle'). Held until released (send an empty combination or use press_button to clear). Valid names: cross / circle / triangle / square / up / down / left / right / start / select / ltrigger / rtrigger.
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
buttonsYesButton combination string (e.g. 'cross|circle').

TDQS

A4/5.0
Behavior4/5

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

The description explicitly identifies the operation as a STATE-CHANGE and reveals that the held state persists until a subsequent hold_buttons or send_analog call, which is meaningful behavior beyond the annotation hints. It does not contradict the annotations (readOnlyHint=false is consistent with setting state), though it could add more detail about release semantics.

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 compact and uses labeled PURPOSE, USAGE, BEHAVIOR, and RETURNS sections that are easy to scan. Every line adds operational information, 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 two-parameter tool with complete schema documentation and an output schema, the description covers purpose, usage, state persistence, and return shape. It is slightly less complete because the explicit method to release (empty combination / press_button) is left to the schema rather than stated in the description.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already documents the button names, separator, and release behavior. The description essentially restates the format and required params without adding meaning beyond the schema, so it earns the baseline rather than a higher score.

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 action ('Hold') and resource ('combination of PSP buttons') and clarifies the distinguishing persistence behavior via 'until a subsequent call changes the state.' It does not explicitly name related sibling tools like ppsspp_press_button, so it is clear but lacks explicit sibling differentiation.

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?

USAGE describes required parameters and the pipe-separated button format, and BEHAVIOR explains that the hold persists until another hold_buttons/send_analog call, giving clear context for when to use a hold rather than a momentary input. It does not explicitly say when-not-to-use or name alternatives, 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.

ppsspp_list_addressesA
Read-onlyIdempotent

PURPOSE: List the project's known address constants from addresses.yaml — the single source of truth; never guess hex addresses.

USAGE: optional section filter; an unknown section returns an error listing the valid ones.

BEHAVIOR: READ-ONLY. Int values ≥0x1000 are returned as hex strings that can be pasted straight into address parameters.

RETURNS: {sections, count, section_filter}.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectionNoOptional section filter (e.g. 'known_functions', 'state_probes', 'top_base'). If omitted, returns all sections.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
sectionsYes
section_filterYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint/idempotentHint annotations, the description discloses that integer values ≥0x1000 are returned as paste-ready hex strings and that unknown sections produce an error listing valid sections. This is useful non-obvious behavior that helps an agent predict tool output.

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 compact, front-loaded with the purpose, and organized into clear PURPOSE/USAGE/BEHAVIOR/RETURNS sections. Every sentence carries distinct information without 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?

Given the single optional parameter, available output schema, and annotations covering read-only/idempotent behavior, the description fully covers what an agent needs: purpose, filter semantics, error behavior, return format, and result shape.

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 schema already documents the optional section parameter with examples, and coverage is 100%. The description adds meaningful detail beyond the schema by clarifying that the returned hex values can be plugged directly into address parameters and that invalid sections yield a helpful error.

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 identifies a specific verb and resource: 'List the project's known address constants from addresses.yaml'. It also positions the tool as 'the single source of truth; never guess hex addresses', which clearly separates it from siblings like read_memory or convert_address.

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 explains the optional section filter and error behavior for unknown sections, giving clear operating context. It stops short of explicitly naming when-not-to-use or comparing against alternatives, so it earns a 4 rather than a 5.

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

ppsspp_list_scriptsA
Read-onlyIdempotent

PURPOSE: List diagnostic scripts declared in .ppsspp-dfx/config/scripts.manifest.yaml.

USAGE: category optional filter (eboot / state / p0ab / ndx / memory / misc / recipe).

BEHAVIOR: READ-ONLY. Reads the in-memory manifest registry (loaded at startup). Does not execute any script.

RETURNS: {scripts: [ScriptEntryView...], count, category}.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoOptional category filter. Valid values: eboot / state / p0ab / ndx / memory / misc / recipe. If omitted, all manifest entries are returned.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of entries returned.
scriptsYesManifest entries (filtered by category if requested).
categoryYesCategory filter applied (None = no filter).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds valuable behavioral context by stating that the tool reads the in-memory manifest registry loaded at startup and does not execute any script. This goes beyond the structured annotations and clarifies the side-effect-free nature.

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 compact, front-loaded with purpose, and uses clear labeled sections (PURPOSE, USAGE, BEHAVIOR, RETURNS). Every sentence contributes useful information with 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 low-complexity read-only listing tool with one optional parameter and an output schema, the description is complete. It covers what the tool does, the filter options, behavioral guarantees, and the return envelope. Nothing needed for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the input schema fully documents the category parameter and its valid values. The description repeats this information and adds a return-shape hint, but it does not provide meaningful new semantics beyond what the schema already includes.

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 ('List') and a precise resource (diagnostic scripts declared in .ppsspp-dfx/config/scripts.manifest.yaml). It is clearly distinct from sibling tools like ppsspp_run_script and ppsspp_reload_scripts, and the 'Does not execute any script' note reinforces what this tool is for.

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 'USAGE' section explains the optional category filter and its valid values, but it does not explicitly say when to choose this tool over siblings or when not to use it. The intended use is implied rather than stated, and no alternatives are mentioned.

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

ppsspp_memory_mapA
Read-onlyIdempotent

PURPOSE: Get the PPSSPP memory region map (user / kernel / VRAM ranges).

USAGE: session_id.

BEHAVIOR: READ-ONLY.

RETURNS: {ranges[], mapping, text}.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYesUnified text representation: one line per range, formatted as '0x{ADDR:08X}-0x{END:08X} {TYPE}/{subtype} {NAME}'.
rangesYesMemory ranges from `memory.mapping`. Each entry has 'type' (ram/vram/sram), 'subtype' (primary/mirror), 'name', 'address', and 'size'.
mappingYesRaw `memory.mapping` response.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, and the description's 'READ-ONLY' line is redundant. It does add useful return-shape context ('{ranges[], mapping, text}') and the region taxonomy, but no deeper behavioral details about pagination, errors, or session requirements.

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?

Four labeled one-line sections deliver purpose, usage, behavior, and return shape with zero filler. The purpose is front-loaded and every sentence contributes meaningful 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?

For a tool with a single documented parameter, strong annotations, and an output schema, the description covers the essential contract needed to call it correctly. Missing sibling guidance is a minor secondary concern, not a completeness gap.

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

Parameters3/5

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

Schema coverage is 100%, and the session_id parameter is already documented as 'Active session ID.' The description merely repeats 'session_id' without adding semantic details such as format, validity, or how a session is obtained.

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: 'Get the PPSSPP memory region map (user / kernel / VRAM ranges)'. It clearly distinguishes from sibling memory tools such as read_memory or disassemble by focusing on memory region ranges rather than contents.

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?

The 'USAGE: session_id' line only restates the parameter requirement and gives no contextual guidance. It does not mention when to choose this tool over related siblings like read_memory, memory_info_search, or convert_address, nor does it state any exclusions or prerequisites.

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

ppsspp_press_buttonA

PURPOSE: Simulate a single PSP button press for a duration.

USAGE: session_id + button required; duration optional (default 10 frames). Valid button names: cross / circle / triangle / square / up / down / left / right / start / select / ltrigger / rtrigger.

BEHAVIOR: STATE-CHANGE. Sends input events to PPSSPP. Button state returns to released after the duration elapses.

RETURNS: {button, duration}.

ParametersJSON Schema
NameRequiredDescriptionDefault
buttonYesButton name. Valid: cross / circle / triangle / square / up / down / left / right / start / select / ltrigger / rtrigger.
durationNoPress duration in frames (default 1).
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
buttonYesButton name pressed.
durationYesPress duration in frames.

TDQS

A4.1/5.0
Behavior4/5

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

The description explicitly states 'STATE-CHANGE' and that 'Button state returns to released after the duration elapses,' adding behavioral context beyond the annotations (readOnlyHint=false, etc.). It clarifies the non-idempotent nature and auto-release behavior, which is valuable.

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 tightly structured with PURPOSE, USAGE, BEHAVIOR, and RETURNS sections. Purpose is front-loaded, and each section is concise with no wasted words. It earns its place and is easy to scan.

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?

The description covers purpose, usage, behavior, and return format. The output schema exists, so return values are also documented. The only gap is the conflicting default duration, but that's a schema/description mismatch rather than a missing aspect. Overall, it is complete enough for correct invocation.

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

Parameters2/5

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

Schema coverage is 100%, so the schema already documents parameters. However, the description incorrectly states 'default 10 frames' while the schema specifies 'default 1' – a factual contradiction that could mislead the agent. It also redundantly lists button names already in the schema, adding no new value.

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 clearly states a specific action: 'Simulate a single PSP button press for a duration.' This distinguishes it from siblings like hold_buttons (which holds multiple buttons) and send_analog (analog input). The purpose is 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?

The USAGE section specifies required parameters (session_id, button) and optional duration, plus valid button names. It provides clear operational context but does not explicitly compare with alternatives like hold_buttons or send_analog. However, the purpose is specific enough that an agent can infer when to use it.

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

ppsspp_queryA
Read-onlyIdempotent

PURPOSE: Aggregate game-state queries — game_state, registers (all or one), backtrace, threads, modules, and function-list management (funcs/func_scan/func_add/func_remove).

USAGE: action + session_id; 'register' needs name; func_scan/func_remove need address; top_n defaults to 100 (pass 0 for the full list — hle.func.list can reach 700+KB).

BEHAVIOR: READ-ONLY. Lookups only — func_add/func_remove mutate the debugger function list. backtrace/threads/func_* REQUIRE the CPU paused (pause first, or use get_pc); RUNNING-state PC/isCurrent is LOW trust.

RETURNS: {action, data, trust_level} — data shape depends on the action.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFunction name (func_add only; ignored by func_remove because PPSSPP's hle.func.remove protocol does not accept a name parameter).
top_nNoLimit the number of entries returned for 'funcs' / 'func_scan' actions (default 100). 0 = no limit — hle.func.list can reach 700+KB, pass 0 only when the full list is genuinely needed.
actionYesQuery action. Valid values: - 'game_state': PPSSPP game status (paused / game title). - 'registers': all CPU registers (GPR + FPU + VFPU). - 'register': single register by name (MIPS ABI name like 'a0'/'v0'/'t9', or 'pc'/'hi'/'lo'). - 'backtrace': HLE call stack (thread optional). - 'threads': PSP thread list (safe: stepping → query → resume). - 'modules': list all loaded HLE modules. - 'funcs': list registered HLE function tracking entries. - 'func_scan': scan HLE functions in a 64KB range starting at address (requires address; CPU must be stepping). - 'func_add': add HLE function tracking (name? and/or address?). - 'func_remove': remove HLE function tracking (address required; PPSSPP protocol only accepts address, no name).
threadNoThread ID (backtrace action only; None = current).
addressNoFunction address as a hex string (e.g. '0x08804000'). Required for func_remove and func_scan.0x0
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesRaw result payload.
textYesUnified text representation. Populated for action='registers' with grouped '── GPR ──' / '── FPU ──' / '── VFPU ──' headers and ' name = 0xVAL' lines. Empty for other actions (use the structured `data` field).
actionYes'game_state' / 'registers' / 'backtrace' / 'threads' / 'modules' / 'funcs' / 'func_scan' / 'func_add' / 'func_remove'.
trust_levelYesTrust annotation (threads + pc only). Lowercase enum value: 'high' (stepping-verified) / 'medium' / 'low'.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses that func_add/func_remove mutate the debugger function list despite the read-only framing, warns that running-state PC/isCurrent is low trust, and describes the return envelope {action, data, trust_level}. Annotations already cover the broad read-only/destructive safety profile, so this added context is meaningful.

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?

Four labeled sections (PURPOSE, USAGE, BEHAVIOR, RETURNS) pack a lot of information into about 70 words with no filler. The purpose and usage are front-loaded, and every sentence adds operational 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?

For a multi-action tool with 6 parameters and an output schema, the description covers purpose, invocation pattern, per-action requirements, prerequisites, and return shape. The per-action details are in the schema's enum descriptions, and the description fills the gaps around state requirements and payload size.

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 100% and the schema already documents every parameter, so the baseline is 3. The description adds cross-parameter dependencies ('register' needs name, func_scan/func_remove need address) and the top_n=0 size warning/hle.func.list 700+KB note, which are not inferable from individual property descriptions.

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 high-level operation ('aggregate game-state queries') and enumerates all ten concrete actions it dispatches (game_state, registers, backtrace, threads, modules, func_*). This makes it clearly distinguishable from sibling tools like ppsspp_read_memory or ppsspp_get_pc without needing to inspect their schemas.

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?

Provides concrete usage constraints: 'register' needs a name, func_scan/func_remove need an address, and the paused-CPU requirement for backtrace/threads/func_* with a 'pause first, or use get_pc' hint. It does not explicitly name alternative tools or state when-not-to-use, so it stops short of the highest bar.

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

ppsspp_read_memoryA
Read-onlyIdempotent

PURPOSE: Read memory (read_bytes / read_u32 / read_string) or scan a region for a byte pattern.

USAGE: action; session_id optional when exactly one session is active; address as '0x' hex string; read_bytes ≤65536 per call (split larger reads); scan takes pattern (hex/ascii, ≤4096B) + start_addr/end_addr (≤256MiB) + chunk_size.

BEHAVIOR: READ-ONLY. Unreadable scan blocks are skipped silently. read_u32 on JIT-IR code returns IR encoding (IR_ENCODING_DETECTED) — disassemble code instead. read_string is ASCII-only (use read_bytes + Shift-JIS decode for game text).

RETURNS: {action, address, value, size, text, file} — value is the match list for scan. read_bytes has output=value (default; byte list + hex text) / hex (text only, value=null) / file (paths + 64-byte preview; payload saved under .ppsspp-dfx/output/memory_reads/).

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNoNumber of bytes to read (read_bytes only).
actionYesRead action. Valid values: - 'read_bytes': read raw bytes (requires address + size). - 'read_u32': read a 32-bit unsigned int (requires address). - 'read_string': read a string (requires address). - 'scan': scan memory for a pattern (requires pattern + start_addr + end_addr). Optional max_results (default 100).
lengthNo(deprecated, ignored) PPSSPP memory.readString does not accept a length parameter. Kept for backward schema compatibility.
outputNoPayload channel for read_bytes (ignored by other actions). 'value' (default) returns the byte list inline plus a hex dump in `text`. 'hex' keeps only the hex dump in `text` (value=null) — roughly half the characters. 'file' saves raw bytes + hex dump under .ppsspp-dfx/output/memory_reads/ and returns the paths plus a 64-byte preview — use for reads near the 65536-byte cap.value
addressNoStarting address for read_bytes/read_u32/read_string, as a hex string (e.g. '0x08804000'). Ignored for scan (use start_addr).0x0
max_lenNoMaximum string length in bytes for read_string (0 = default cap 4096). Always uses read_bytes + local NUL scan — PPSSPP memory.readString is never called (its strnlen scans to memory end and a giant response can kill the WebSocket). Values are clamped to 65536. Ignored for other actions.
patternNoPattern to scan for (scan only). Interpreted according to `pattern_type`: 'hex' (default) expects even-length hex digits like 'AABBCCDD'; 'ascii' treats the string as literal ASCII bytes like 'hello'.
end_addrNoScan end address, exclusive (scan only), hex string (same format as `address`).0x0
chunk_sizeNoBytes per read request during scan (scan only, default 4096). Larger values reduce round-trips but increase per-read latency.
session_idNoActive session ID; omit to auto-resolve when exactly one session is active.
start_addrNoScan start address, inclusive (scan only), hex string (same format as `address`).0x0
max_resultsNoMaximum number of matches to return (scan only, default 100).
pattern_typeNoHow to interpret `pattern` (scan only). 'hex' (default) decodes as hex string; 'ascii' encodes the pattern string as literal ASCII bytes.hex

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileYesAbsolute path of the saved raw-byte file when read_bytes ran with output='file' (hex dump sits beside it as <file>.hex.txt); empty string otherwise.
sizeYesNumber of bytes read (read_bytes), or number of matches (scan). Unused for read_u32 / read_string.
textYesUnified text representation following spec conventions: '0xADDR: VAL (0xVAL_HEX)' for read_u32, hex dump for read_bytes, repr for read_string, 'scan: N matches at 0xA1, 0xA2, ...' for scan.
valueYesRead value (int/str/list[int]/list[dict] depending on action).
actionYesRead action performed ('read_bytes'/'read_u32'/'read_string'/'scan').
addressYesStarting address, hex string (e.g. '0x08804000').

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnly/idempotent/non-destructive annotations, it discloses silent skipping of unreadable scan blocks, the IR_ENCODING_DETECTED sentinel for JIT-IR, ASCII-only string handling, and the exact return payload fields. No annotation contradiction exists.

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 PURPOSE/USAGE/BEHAVIOR/RETURNS structure front-loads the core capability and packs each sentence with operational detail; there is no filler and the caveats are placed where they are likely to be consulted.

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 13-parameter memory tool with rich annotations, the description covers invocation, limits, return shape, and edge cases; nothing needed to call it correctly appears 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?

With 100% schema coverage, the description still adds meaning: byte-size limits, split-large-read guidance, scan range and chunk-size trade-offs, max_len's 4096 cap and NUL-scan behavior, and output-mode selection guidance for near-cap reads.

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 ('Read memory') and enumerates the four concrete actions (read_bytes, read_u32, read_string, scan), clearly distinguishing the read/scan scope from write, assemble, and disassemble siblings.

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 explicit operational constraints (size cap, split larger reads, scan region limits, chunk_size) and one direct routing cue: use disassemble instead of read_u32 on JIT-IR code. It does not broadly compare this tool to all read-related siblings, but the guidance provided is concrete and actionable.

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

ppsspp_reload_scriptsA
Idempotent

PURPOSE: Manually reload the script manifest YAML and clear the script module cache.

USAGE: No parameters.

BEHAVIOR: MUTATING. Re-reads the manifest file and invalidates cached script modules. Reversible: re-reading an unchanged file produces an equal registry. When the exposed tool set ACTUALLY changes (tools added or removed), the server notifies the client with a tool-list-changed notification so cached tools/list results are invalidated; a no-op reload sends nothing.

RETURNS: {reloaded_count, exposed_count, manifest_path, scripts: [ScriptEntryView...]}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
scriptsYesAll entries after reload (post-reload snapshot).
exposed_addedYesScript names newly registered by this reload's sync.
exposed_countYesNumber of exposed scripts (exposed=true) after reload.
manifest_pathYesAbsolute path to the manifest YAML.
reloaded_countYesTotal script entries after reload (manifest-wide).
exposed_removedYesScript names unregistered by this reload's sync.
restart_requiredYesTrue when some registration changes could not be applied at runtime (SDK limitation) and a server restart is needed to fully reconcile exposed tools.
exposed_registeredYesNumber of exposed scripts ACTUALLY registered as dynamic tools after the reload sync (F4/F5: declared != registered is now surfaced instead of silently diverging).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate idempotentHint=true, readOnlyHint=false, destructiveHint=false, openWorldHint=false. The description adds important behavioral details: MUTATING behavior, clears cache, and the exact notification semantics (tool-list-changed notification when exposed tool set changes). It also explains reversibility. This goes beyond annotations to clarify the side-effect profile and client notification, which is valuable.

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 well-structured with clear sections for PURPOSE, USAGE, BEHAVIOR, and RETURNS. It is dense but every sentence adds value: purpose, parameter count, behavior specifics, and return format. It is front-loaded with the main purpose and then explains nuances without 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?

Given the tool's simplicity (no parameters) and the presence of an output schema that defines the return shape, the description is complete. It provides the purpose, usage, behavior, and return summary. The annotations cover safety and idempotence. There is nothing an agent needs to know to call this tool correctly that 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 0 parameters, and the schema is empty. The description clearly states 'No parameters.' Since there are no parameters to disambiguate, the description fully handles parameter semantics. The schema provides no property documentation, but the description compensates by confirming the absence of parameters.

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 clearly states the tool's specific action: manually reload the script manifest YAML and clear the script module cache. The verb 'reload' and resource 'script manifest' and 'script module cache' are explicit. It is distinct from siblings like 'list_scripts' or 'run_script' which involve different actions.

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 indicates this is a manual reload action, implying it is used when the user manually changes the script manifest or wants to refresh without waiting for automatic updates. It does not explicitly contrast with alternatives, but the context is clear that this is for manual intervention. No when-not-to-use is stated, but the tool's niche is well understood.

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

ppsspp_replayA

PURPOSE: Aggregate PPSSPP replay subsystem — record input sequences, execute them, and save/load .ppr recordings.

USAGE: action + session_id; actions: begin/abort/flush/execute/status/time_get/time_set/save/load/wait_complete; execute needs version + base64_input; time_set needs value; save/load take a bare file name (always under output/replays/).

BEHAVIOR: STATE-CHANGE. Recording requires the CPU RUNNING (real input timing); screenshots are rejected while recording. Replay timelines use ABSOLUTE game-clock timestamps anchored at the RECORDING session's boot — a replay only injects correctly when a fresh boot's clock is aligned to them: execute/load ONLY loads the event table and returns t0_s / estimated_end_s + the boot-aligned sequence (reset -> wait_ready -> wait boot+estimated_end_s -> abort); it does NOT play by itself. executing/saving NEVER clear on their own — only abort clears them — so wait_complete times out on any un-aborted replay; completion = the timeline estimate + explicit abort. execute/load auto-abort a live executing/saving state first (R4). restore_rtc defaults to False: setting it rewinds the game-visible wall clock of the RUNNING session and pollutes every in-game timer (R2); when needed, set it before the boot-aligned reset.

RETURNS: {action, executing, saving, version, size, base64, base_rtc, data} — execute/load data carries t0_s, estimated_end_s, event_count and boot_aligned_sequence; fields depend on the action.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueNoBase RTC value in seconds (uint32). Required for action='time_set'; ignored for all other actions.
actionYesReplay operation. Valid values: - 'begin': begin/resume recording. - 'abort': abort any recording or execution. - 'flush': flush recorded data (returns version + base64). - 'execute': execute a replay (requires version + base64_input). ONLY loads the event table — follow the boot-aligned sequence in the response (reset + wait + abort) or input never injects (U7 root cause). - 'status': query {executing, saving}. - 'time_get': get base RTC. - 'time_set': set base RTC (requires value). WARNING: rewinds the game-visible wall clock on the RUNNING session — pollutes every in-game timer (R2). - 'save': flush + time_get + write .ppr file (requires file_path: bare file name under output/replays/). - 'load': read .ppr + execute (requires file_path; same containment). Returns t0_s / estimated_end_s and the boot-aligned sequence. - 'wait_complete': poll replay.status until executing=False — NOTE: executing never clears on its own (only abort clears it), so this always times out on an un-aborted replay; kept for recording-completion checks and backwards compatibility.
versionNoReplay format version (from a prior replay.flush). Required for action='execute'; ignored for all other actions.
file_pathNoBare .ppr file NAME (no directory parts) for action='save' / action='load'. The file is always placed under the server-managed directory .ppsspp-dfx/output/replays/ — absolute paths and path separators are rejected. Required for save / load; ignored for all other actions.
session_idYesActive session ID.
timeout_msNoTotal timeout in milliseconds for action='wait_complete' (default 10000 = 10s). Ignored for all other actions.
interval_msNoPolling interval in milliseconds for action='wait_complete' (default 100ms). Ignored for all other actions.
restore_rtcNoWhether to restore base_rtc via replay.time_set before execute when action='load' (default False; R2). true sets the game-visible wall clock back to the recording moment — pollutes EVERY timer of the running session (attract timeouts, clocks, cooldowns) because game time = rtcBaseTime + elapsed. Only use for deterministic replays, and prefer setting it BEFORE the reset of the boot-aligned sequence so the game boots on the shifted base. Ignored for all other actions.
base64_inputNoBase64-encoded replay data (from a prior replay.flush). Required for action='execute'; ignored for all other actions.
session_noteNoOptional human-readable note embedded in the .ppr file when action='save'. Ignored for all other actions.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesRaw PPSSPP response dict (echoed for diagnostic / future field extraction). Empty dict when no additional fields.
sizeYesRecording size in bytes from `replay.flush`. 0 when the action does not return a size.
actionYesReplay action executed: 'begin' / 'abort' / 'flush' / 'execute' / 'status' / 'time_get' / 'time_set' / 'save' / 'load' / 'wait_complete'.
base64YesBase64-encoded recording payload from `replay.flush`, or the input payload passed to `replay.execute`. Empty string when the action does not carry a payload.
savingYesTrue if a replay recording is in progress. After `begin` → True; after `flush` or `abort` → False.
versionYesRecording format version from `replay.flush` (currently 1). 0 when the action does not return a version.
base_rtcYesBase RTC timestamp (seconds) from `replay.time.get` / `replay.time.set`. 0 when the action does not return it.
executingYesTrue if a replay is currently executing. Drives `wait_complete`'s exit condition (polls until False).
wait_iterationsYesNumber of `replay.status` polls performed by `wait_complete` before exiting. 0 for non-wait actions.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations are only generic flags (readOnlyHint false, etc.), so the description carries the burden and delivers richly. It discloses that this is a state-changing tool, that recording requires the CPU running, that executing/saving never clear on their own, that execute/load auto-abort live state, and that restore_rtc rewinds the game-visible wall clock and pollutes in-game timers. These are exactly the behavioral traps an agent needs to avoid.

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 long but well-organized into PURPOSE, USAGE, BEHAVIOR, and RETURNS, with critical warnings front-loaded in the BEHAVIOR section. Some redundancy with the schema exists, but for a tool with ten actions and many side-effect caveats, the density is justified and every section earns its place.

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 complex multi-action stateful tool, this description covers the complete calling contract: required fields per action, file containment, boot-aligned replay sequence, return payload shape, and side-effect warnings. An output schema exists for return values, and the description still supplies the non-obvious execution model, making it fully adequate for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description restates which parameters each action requires, but the schema already documents those dependencies in detail. It adds little new parameter-level meaning beyond the schema, though its behavioral caveats around execute/load and wait_complete are valuable context.

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 ('Aggregate PPSSPP replay subsystem') and enumerates its core responsibilities: record input sequences, execute them, and save/load .ppr recordings. This clearly distinguishes it from the sibling input tools like ppsspp_press_button and ppsspp_hold_buttons, which are for live input rather than replay.

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?

Provides explicit usage structure: action plus session_id, required parameters per action, and file-name containment rules. It also gives important when-not guidance, such as 'execute/load ONLY loads the event table... it does NOT play by itself' and warns that wait_complete always times out on an un-aborted replay. It stops short of explicitly naming sibling alternatives for routing, but the action-level guidance is strong.

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

ppsspp_run_scriptA

PURPOSE: Invoke a manifest-registered diagnostic script by name with validated input.

USAGE: name (see ppsspp_list_scripts; skeleton scripts return not_implemented); input dict validated against the script's Pydantic model; session_id required when the script declares requires_ppsspp (missing → SESSION_NOT_FOUND).

BEHAVIOR: STATE-CHANGE. Runs manifest-registered script code. Unknown names → SCRIPT_NOT_FOUND.

RETURNS: {name, output, output_model}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesScript name (must appear in manifest).
inputNoScript input as a JSON dict. Validated against the script's Pydantic Input model. Pass {} for scripts with no required fields.
session_idNoOptional session ID. Enforced by this tool for scripts with requires_ppsspp=true (fails with SESSION_NOT_FOUND when none resolves). Priority: this parameter > an optional session_id field on the script's Input model.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYesScript name that was executed.
outputYesScript output (serialized Pydantic Output model).
output_modelYesPydantic Output model class name (for type introspection).

TDQS

A4.5/5.0
Behavior4/5

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

The description explicitly declares 'STATE-CHANGE', matching the annotations (readOnlyHint=false, idempotentHint=false). It adds behavioral context beyond annotations by naming error codes (SCRIPT_NOT_FOUND, SESSION_NOT_FOUND) and noting that skeleton scripts are non-functional. While it doesn't detail what state changes occur, the description covers the critical edge cases and the fact that it runs arbitrary registered code.

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 exceptionally well-structured with clear PURPOSE, USAGE, BEHAVIOR, and RETURNS sections. It is concise, with every sentence providing necessary information and no filler. The front-loaded purpose statement immediately tells the agent what the tool does.

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 tool that runs scripts with three parameters, an output schema, and a rich set of sibling tools, the description is complete. It covers how to obtain valid names, handles the session_id requirement, describes error behavior, and specifies the return shape. The agent has everything needed to call it correctly without additional lookups.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters (name, input, session_id) are already well-documented in the schema. The description adds marginal value by referencing ppsspp_list_scripts for name discovery and clarifying the session_id priority, but these are largely restatements of schema hints. The baseline of 3 is appropriate because the schema carries the load, and the description does not meaningfully enhance parameter meaning beyond that.

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 ('Invoke') and resource ('manifest-registered diagnostic script') with validated input, clearly distinguishing it from siblings like ppsspp_list_scripts (which lists scripts) and ppsspp_reload_scripts (which reloads). It even notes that skeleton scripts return not_implemented, further disambiguating expected behavior.

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?

The USAGE section explicitly tells the agent to get the script name from ppsspp_list_scripts, mentions that skeleton scripts return not_implemented, and clarifies the session_id requirement with the error SESSION_NOT_FOUND when missing. It also implies when not to use the tool (for skeleton scripts) without being verbose.

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

ppsspp_screenshotA
Read-onlyIdempotent

PURPOSE: Capture the framebuffer as an image (ImageContent) plus metadata.

USAGE: session_id optional when exactly one session is active; source='render' (default; empty frames auto-fall back to VRAM — colors unreliable there) or 'output' (CRASH-RISK, do not use); mutually exclusive with the deprecated mode param.

BEHAVIOR: READ-ONLY. An empty capture returns empty=true instead of an error — advance to a rendered scene and retry.

RETURNS: structuredContent metadata (mode/source/size_bytes/width/height/file_path/format/empty); the image itself arrives as an ImageContent block. The auto-saved PNG/JPG path is in file_path.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoDEPRECATED — use `source` instead. Legacy Win32 / VRAM fallback paths. 'auto' = three-tier fallback (wm_command → printwindow → vram). 'wm_command' / 'printwindow' / 'vram' = the specific strategy. Mutually exclusive with `source`.
sourceNoCapture source (new, preferred). 'render' = with_stepping + gpu.buffer.renderColor (default when neither source nor mode is given). 'output' = gpu.buffer.screenshot (CRASH-RISK on some games). Mutually exclusive with `mode`.
session_idNoActive session ID; omit to auto-resolve when exactly one session is active.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeYesCapture mode used. Echoes the caller's `mode` value ('auto'/'wm_command'/'printwindow'/'vram') on the deprecated path, or the `source` value ('render'/'output') on the new path.
emptyYesTrue when the capture produced no pixels (size_bytes=0 and no ImageContent). Agents can branch on this instead of parsing size_bytes heuristics — mirrors dump_texture's CAPTURE_EMPTY error.
widthYesImage width in pixels (0 if unknown).
formatYesImage format ('png' or 'jpeg').
heightYesImage height in pixels (0 if unknown).
sourceYesThe `source` parameter value when the new path was taken, or None when the deprecated `mode` path was used.
file_pathYesPath where image was saved.
size_bytesYesDecoded image size in bytes.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the readOnly/idempotent/destructive annotations, it discloses the render-to-VRAM auto-fallback, unreliable colors on VRAM, crash risk of 'output', and the empty=true instead of error behavior. These are precisely the behavioral traits that affect invocation and interpretation of results.

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?

Organized into PURPOSE, USAGE, BEHAVIOR, and RETURNS with each sentence carrying distinct information and no filler. The critical caveats are near the top and easy to scan.

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 annotations covering safety and an output schema covering metadata, the description adds exactly what is needed: purpose, source selection rules, empty-capture semantics, and how the image is returned and where it is saved. No critical invocation detail 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 coverage is 100%, so the schema already documents the parameters, but the description adds operationally important semantics: source default plus fallback behavior, the 'output' risk warning, mode deprecation and exclusivity, and the single-active-session condition for omitting session_id.

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, resource, and output: captures the framebuffer as an ImageContent plus metadata. The purpose is clear, but it does not explicitly distinguish itself from close siblings such as ppsspp_frame_snapshot or ppsspp_dump_texture.

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?

Provides actionable usage conditions: session_id may be omitted when exactly one session is active, source='render' is the safe default, and source='output' is explicitly marked crash-risk and not to be used. It explains mutual exclusivity with the deprecated mode param, though it does not name alternative tools for when this tool should be avoided.

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

ppsspp_search_disasmA
Read-onlyIdempotent

PURPOSE: Loop-search disassembly for a substring, collecting matching instructions with context.

USAGE: session_id + match (a leading '$' is stripped); start address; end=0 wraps the search around the whole region; max_results default 100.

BEHAVIOR: READ-ONLY.

RETURNS: {address, match, end, results[{address, text, name, params}], text}.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoEnd address for the search range, as a hex string (e.g. '0x08810000'). If 0 or equal to `address`, PPSSPP performs a loop search (wraps around memory).0x0
matchYesCase-insensitive substring to search for in the disassembly text (e.g., 'jal', 'addiu', 'lw r5'). May include '$' register prefix (e.g. 'jr $ra') — automatically stripped before forwarding to PPSSPP (PPSSPP register names have no '$' prefix). Required by PPSSPP's memory.searchDisasm event.
addressYesStarting address for the disassembly search, as a hex string (e.g. '0x08804000').
session_idYesActive session ID.
max_resultsNoMaximum number of matches to collect (default 100). PPSSPP returns only the first match per call; the tool loops from each match address+4 until no more matches, this cap is reached, or a loop is detected.

Output Schema

ParametersJSON Schema
NameRequiredDescription
endYesEnd address, hex string. '0x00000000' or equal to `address` means loop search.
textYesUnified multi-line text representation. Each line is '0x{ADDR:08X}: {text}'.
matchYesCase-insensitive substring matched.
addressYesStarting address for the search, hex string (e.g. '0x08804000').
resultsYesList of disasm line dicts (address / text / name / params).

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description repeats 'READ-ONLY.' It also discloses loop/wrap behavior and match collection, but these details are already in the schema's parameter descriptions, so the description adds little new behavioral context beyond the annotations.

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 uses four labeled one-line sections (PURPOSE, USAGE, BEHAVIOR, RETURNS) and front-loads the purpose. Every line earns its place, and there is no fluff or redundant elaboration.

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 the detailed input schema covering all parameters, the read-only/idempotent annotations, and an output schema present, the description gives enough operational context including defaults, wrap behavior, and return envelope. An agent has all needed information to select and invoke this tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, and every parameter already has thorough semantic explanation (e.g., end=0 wrap behavior, '$' stripping, max_results loop mechanism). The description's USAGE line merely summarizes these details without adding further meaning, so the baseline of 3 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 opens with a specific verb and resource: 'Loop-search disassembly for a substring, collecting matching instructions with context.' This makes the tool's function immediately clear and inherently differentiates it from siblings like ppsspp_disassemble (one-shot disassembly) and ppsspp_memory_info_search (searching memory values rather than disassembly text).

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 USAGE section provides concrete invocation guidance: required session_id and match, leading '$' stripping, start address, end=0 wrap-around, and max_results default. It does not explicitly name alternatives or state when not to use this tool, but the context is clear enough to proceed.

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

ppsspp_send_analogA

PURPOSE: Send an analog stick position (x, y in [0, 255], 128 = center).

USAGE: session_id + x + y required. 0 = full left / up, 255 = full right / down.

BEHAVIOR: STATE-CHANGE. Sets analog stick position; persists until next send_analog call.

RETURNS: {x, y}.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesAnalog X coordinate in [0, 255] (128 = center). 0 = full left, 255 = full right.
yYesAnalog Y coordinate in [0, 255] (128 = center). 0 = full up, 255 = full down.
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
xYesX coordinate in [0, 255] (128 = center).
yYesY coordinate in [0, 255] (128 = center).

TDQS

A4.2/5.0
Behavior4/5

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

The BEHAVIOR section explicitly labels this as a STATE-CHANGE operation, states that the position persists until the next send_analog call, and notes that it is not idempotent in effect. This adds meaningful context beyond the annotations (which only say readOnlyHint=false, idempotentHint=false) by explaining the persistence semantics.

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 compact and well-structured with clear PURPOSE, USAGE, BEHAVIOR, and RETURNS sections. Every sentence earns its place, and the most important information (what the tool does and required parameters) is front-loaded.

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?

The description covers purpose, usage, behavior, and return value. With an output schema present and full parameter schema coverage, nothing critical is missing. It could slightly improve by noting whether the analog position resets on session end, but this is a minor gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully documents all three parameters. The description adds a concise summary of the coordinate system but does not add new information beyond what the schema provides. Baseline 3 is appropriate.

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 ('Send') and resource ('analog stick position'), and precisely defines the coordinate semantics (x, y in [0, 255], 128 = center). It clearly distinguishes this from sibling input tools like ppsspp_press_button and ppsspp_hold_buttons by focusing on analog state rather than discrete button presses.

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 USAGE section explicitly lists required parameters (session_id + x + y) and explains the value mapping (0 = full left/up, 255 = full right/down). It does not explicitly name alternative tools or when-not-to-use conditions, but the purpose is specific enough that an agent can infer when to use it versus siblings.

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

ppsspp_sessionA

PURPOSE: Start / stop / inspect PPSSPP debug sessions — action=start / stop / get / wait_ready; wait_ready blocks until the emulated CPU is up.

USAGE: action='start' needs iso_path (pass wait_ready=true to block until the CPU is up in the same call); stop/get/wait_ready need session_id. Call wait_ready AFTER start and BEFORE any memory tool — PPSSPP answers WebSocket before the CPU boots. start(resilient=true) self-heals boot wedges (blacklist quarantine + relaunch with the same session_id, ≤2 retries).

BEHAVIOR: STATE-CHANGE. start spawns a PPSSPP subprocess + WS debugger; stop terminates it (never taskkill the process yourself); wait_ready polls the probe lock-free and fails [BOOT_TIMEOUT] on wedge suspicion; get is read-only.

RETURNS: SessionResponse {session_id, iso_path, pid, ws_url, created_at, last_active_at, exec_count, ws_connected, recovered, ppsspp_version} — or, for wait_ready, {action, ready, elapsed_s, probe_addr, probe_value, note}.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesSession operation. Valid values: - 'start': launch a new PPSSPP session (requires iso_path). Set wait_ready=true to block until the emulated CPU is up (same probe/budget semantics as 'wait_ready'). - 'stop': terminate an existing session (requires session_id). - 'get': query session health (requires session_id). - 'wait_ready': block until the emulated CPU has started (requires session_id). Call this after 'start' BEFORE any memory/disassembly tool — PPSSPP answers WebSocket before the ISO finishes booting, and early reads fail with 'CPU not started'.
iso_pathNoAbsolute path to the ISO file (required when action=start).
resilientNoaction=start only: self-healing boot — on wedge evidence (CPU-ready probe exhausted, handshake never accepted, process died) the launcher is torn down, the GPU-backend failure blacklist is quarantined (rename), and the session relaunches with the SAME session_id up to 2 retries; the response carries recovered=N (0 = first launch). Exhaustion raises [BOOT_TIMEOUT]. Ignored in fake mode.
timeout_sNoBoot budget in seconds (action=wait_ready, action=start with wait_ready=true, or the per-attempt CPU-ready budget when action=start with resilient=true; default 75, clamped to [1, 300]).
probe_addrNoHex address polled by the readiness probe (action=wait_ready, action=start with wait_ready=true, or the resilient-start gate; default '0x08804000', the project's top.prx load base).0x08804000
session_idNoSession ID (required when action=stop / get / wait_ready).
wait_readyNoaction=start only: block until the emulated CPU is ready before returning (same probe/budget as action=wait_ready; raises [BOOT_TIMEOUT] on wedge suspicion). Fake test mode is ready immediately. Default false keeps the historical two-call flow.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pidNoPPSSPP process PID (None if stopped).
ws_urlNoWebSocket URL (ws://host:port/debugger).
iso_pathNoAbsolute path to the ISO file.
restoredNoF-6(a): 1 when this session was restored from sessions.json (a previous server run left it behind) rather than started fresh in this process — its game state may be stale.
recoveredNoH2: resilient-start relaunch count (0 = the first launch succeeded; >0 means the game state was reset by a wedge heal — breakpoints need re-arming).
created_atNoISO 8601 timestamp of session creation.
exec_countNoNumber of tool calls made against this session.
session_idNoSession UUID-like identifier.
ws_connectedNoTrue if WebSocket is currently connected.
last_active_atNoISO 8601 timestamp of last tool call.
ppsspp_versionNoPPSSPP build fingerprint captured from the version handshake (None until the session transport binds).

TDQS

A4.8/5.0
Behavior5/5

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

Beyond annotations, the description details state-change semantics: start spawns a subprocess and WS debugger, stop terminates it, wait_ready polls a probe and fails with [BOOT_TIMEOUT], and get is read-only. It also discloses the self-healing quarantine and relaunch behavior with the same session_id, adding substantial behavioral context that annotations alone do not provide.

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 long but well-organized into PURPOSE, USAGE, BEHAVIOR, and RETURNS sections, and every sentence carries actionable detail. It is appropriately sized for a multi-action tool, though it could be trimmed slightly without losing meaning.

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?

Given the tool's complexity (7 parameters, 4 actions, self-healing behavior), the description covers start, stop, get, and wait_ready flows, return shapes, failure modes, and ordering prerequisites. The output schema exists and the RETURNS section states what each response contains, so 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.

Parameters4/5

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

Input schema already covers all parameters at 100%, so the baseline is 3. The description adds value by tying parameters to behavior ('wait_ready=true to block until the CPU is up in the same call', resilient self-heals with up to 2 retries) and by giving operational warnings like 'never taskkill the process yourself'. This goes beyond simple parameter repetition, though the schema already does heavy lifting.

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?

Description opens with 'PURPOSE: Start / stop / inspect PPSSPP debug sessions' and enumerates action values start/stop/get/wait_ready, giving a precise verb-resource mapping. It differentiates from the sibling ppsspp_session_list by focusing on lifecycle operations rather than listing sessions.

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?

Usage section explicitly states which action requires which parameter ('action='start' needs iso_path', 'stop/get/wait_ready need session_id'), and gives ordering guidance ('Call wait_ready AFTER start and BEFORE any memory tool'). It even warns against taskkilling and explains resilient mode's retry behavior, leaving no ambiguity about when or how to use the tool.

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

ppsspp_session_listA
Read-onlyIdempotent

PURPOSE: List all active PPSSPP sessions.

USAGE: No parameters. Idle sessions (>30 min) are auto-GC'd as a side effect.

BEHAVIOR: READ-ONLY. Reads the session manager's in-memory session dict. The idle-GC side effect reaps stale sessions but does not mutate the caller's state.

NOT a per-session status probe: for session health use ppsspp_smoke_test; for CPU/game state use ppsspp_get_pc or ppsspp_query(game_state). Reader tools whose session_id is optional auto-resolve when exactly one session is active, so you normally do NOT need to call this first just to obtain an ID.

RETURNS: {sessions: [SessionResponse...], count}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of sessions.
sessionsYesActive sessions.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, and the description reinforces this with 'READ-ONLY.' Crucially, it discloses a subtle side effect beyond what annotations can express: idle sessions (>30 min) are auto-GC'd, and it preemptively clarifies this 'does not mutate the caller's state.' The description also names the exact data source (in-memory session dict) and the return shape, adding meaningful context without contradicting the annotations.

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 organized into labeled sections (PURPOSE, USAGE, BEHAVIOR, NOT, RETURNS) that make it highly scannable. Every sentence carries distinct information: scope, side effect, read-only behavior, sibling routing, the 'do I need this for an ID?' question, and return format. There is no redundancy or 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?

For a zero-parameter, read-only list tool with an output schema, the description is complete: purpose, side effects, alternatives, return shape, and even the most likely misuse (calling it just to resolve a session ID) are all covered. Nothing an agent needs to correctly select and invoke this 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?

With 0 parameters, the rubric baseline is 4, and the empty schema needs no compensation. The description explicitly states 'No parameters' and adds relevant selection context about session_id auto-resolution in sibling reader tools. It adds modest value beyond the schema but there is no parameter to elaborate on, so 4 is appropriate.

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 PURPOSE section states a specific verb and resource: 'List all active PPSSPP sessions.' It goes further by explicitly distinguishing itself from siblings: 'NOT a per-session status probe,' naming ppsspp_smoke_test, ppsspp_get_pc, and ppsspp_query as the correct tools for those needs. An agent can select this tool without opening any 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?

The description gives explicit when-to-use and when-not-to-use guidance with named alternatives: use ppsspp_smoke_test for session health, ppsspp_get_pc/ppsspp_query for CPU/game state, and it warns that session_id-optional reader tools auto-resolve when one session is active, so 'you normally do NOT need to call this first just to obtain an ID.' Nothing is left to inference.

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

ppsspp_smoke_testA
Read-onlyIdempotent

PURPOSE: Four-point session health check — iso_loaded, cpu_running, ws_connected, game_mode_valid.

USAGE: session_id. NOT an ISO boot-acceptance test — use session wait_ready + analyze_log for boot triage.

BEHAVIOR: READ-ONLY. Battery of probes.

RETURNS: {checks[{name, passed, detail}], overall_status}.

ParametersJSON Schema
NameRequiredDescriptionDefault
checksNoSubset of checks to run (default: all). Valid values: 'iso_loaded', 'cpu_running', 'ws_connected', 'game_mode_valid'.
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
checksYesPer-check results.
overall_statusYes'pass' if all checks passed, else 'fail'.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint, and the description reinforces this with 'READ-ONLY. Battery of probes.' It adds useful context about the operation's nature and describes the return shape, which goes beyond what annotations alone convey.

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 compact and well-structured with clear PURPOSE, USAGE, BEHAVIOR, and RETURNS sections. Every sentence earns its place and the key purpose is front-loaded.

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 read-only health-check tool, the description covers what it does, how to invoke it, what it is not for, alternatives, and the return shape. The output schema also exists, so nothing an agent needs to call this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents session_id and the optional checks subset with valid values. The description only restates session_id and adds no parameter meaning beyond the schema, so the baseline of 3 is appropriate.

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 ('health check') and resource (session) and enumerates the four concrete checks. It explicitly distinguishes itself from an ISO boot-acceptance test and names the sibling tools to use instead, so an agent can tell it apart from related session/diagnostic tools.

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?

Provides a clear usage context: pass a session_id for a four-point session health check. It explicitly says when NOT to use it ('NOT an ISO boot-acceptance test') and points to alternatives ('use session wait_ready + analyze_log for boot triage').

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

ppsspp_state_observerA

PURPOSE: Named memory-probe registry plus running-state observation — register probes once, then sample them cheaply every loop.

USAGE: action + session_id for observe; register needs name + address (+size 1/2/4, description); observe takes comma-separated names and samples.

BEHAVIOR: STATE-CHANGE. register/clear mutate the registry; observe is reliable while RUNNING. The registry is PROCESS-wide (shared across sessions), seeded from addresses.yaml state_probes, and is NOT re-seeded after clear within the same process. Delete semantics are IDEMPOTENT: clearing an unknown probe name succeeds (ok), unlike ppsspp_breakpoint mem_remove which rejects missing targets (F-5 contract, 2026-09-08).

RETURNS: {registered|probes|observations, count, success_count, failure_count} — shape depends on the action.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoProbe name. Required for action='register'; optional for action='observe' (comma-separated names; omit to observe all registered probes). Ignored for list / clear.
sizeNoRead width in bytes (1 = u8, 2 = u16, 4 = u32). Default 4. Used by action='register'. Ignored for all other actions (probe's stored size is used at observe time).
namesNoComma-separated probe names for action='observe'. If empty, all registered probes are observed. Ignored for all other actions.
actionYesObserver operation. Valid values: - 'register': add a probe to the runtime registry (requires name + address; optional size default 4, optional description). - 'list': list all registered probes. - 'observe': read current value of named probe(s) (optional names — omit to observe all); optional samples (default 1) for multi-sample median. - 'clear': clear the runtime registry.
addressNoAbsolute runtime address to read, as a hex string (e.g. '0x08804000'). Required for action='register'; ignored for all other actions.0x0
samplesNoNumber of samples to take per probe for action='observe' (default 1). If >1, samples are taken with a short yield between reads; the final value is the last read (caller can inspect stability by comparing samples externally).
session_idYesActive session ID.
descriptionNoOptional human-readable note for action='register'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesRaw PPSSPP echo (reserved)
countYesProbe count (register/list/clear) or observation count (observe)
actionYesObserver action executed
probesYesAll probes (action=list only)
registeredYesProbe added (action=register only)
observationsYesPer-probe readings (action=observe only)
failure_countYesFailed observations (action=observe only)
success_countYesSuccessful observations (action=observe only)

TDQS

A4.5/5.0
Behavior5/5

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

Without relying on annotations, the description discloses side effects (register/clear mutate registry), process-wide sharing, seeding from addresses.yaml, and non-reseeding after clear. It also details idempotent clear semantics and contrasts with ppsspp_breakpoint mem_remove, going far beyond the sparse annotations.

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?

Four labeled sections (PURPOSE, USAGE, BEHAVIOR, RETURNS) front-load the most important selection and invocation information. Each sentence earns its place with minimal 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?

The description captures the registry lifecycle, cross-session scope, idempotency exception, and return envelope shape; combined with the output schema this gives an agent everything needed to call the tool safely. The only minor gap is a lack of explicit sibling-selection guidance, but that does not undermine completeness for correct invocation.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3; the description adds only a condensed action-parameter summary and does not introduce semantics absent from the schema. The samples behavior and per-action parameter roles are already fully described in the input 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?

Opens with a PURPOSE line that names a specific mechanism (named memory-probe registry) and a distinct use case (register once, sample cheaply every loop). This differentiates it from sibling memory tools like ppsspp_read_memory and ppsspp_breakpoint.

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 USAGE section gives action-parameter mappings (register needs name+address, observe takes names+samples), which is clear operational context. It does not explicitly state when to prefer this tool over siblings or list exclusions, so it stops short of full differentiation.

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

ppsspp_stepA

PURPOSE: Aggregate CPU step + run-state control (into / over / out, pause, resume, reset, run_until, next_hle).

USAGE: action='into' / 'over' / 'out' / 'pause' / 'resume' / 'reset' / 'next_hle' take only session_id (optional when exactly one session is active); 'run_until' requires address.

BEHAVIOR: STATE-CHANGE. Advances or changes CPU run state. 'reset' reboots the game (lost in-memory state). 'run_until' sets a temp breakpoint and resumes.

RETURNS: {action, address}.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesCPU step / run-state operation. Valid values: - 'into': step into (including delay slot). - 'over': step over (skip function calls). - 'out': step out of current function. - 'pause': pause CPU (enter stepping mode). - 'resume': resume CPU (exit stepping mode). - 'reset': reset the game (reboot). - 'run_until': run until the specified address is reached (requires address). - 'next_hle': step to next HLE callback.
addressNoTarget address, as a hex string (e.g. '0x08804000'). Required for action='run_until'; ignored for all other actions.0x0
session_idNoActive session ID; omit to auto-resolve when exactly one session is active.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pcYesProgram counter after step, hex string. For into/over/out/run_until/next_hle this comes from the cpu.stepping broadcast. For pause, extracted via safe_get_pc after CPU enters stepping. '0x00000000' for resume/reset (no trustworthy PC available).
ticksYesCPU ticks at step completion (0.0 for pause/resume/reset).
actionYes'into' / 'over' / 'out' / 'pause' / 'resume' / 'reset' / 'run_until' / 'next_hle'.
reasonYesStep reason from cpu.stepping broadcast (e.g. 'cpu.stepInto'). Empty for pause/resume/reset.
addressYesTarget address for run_until, hex string (e.g. '0x08804000'); '0x00000000' for other actions.
related_addressYesRelated address for temporary breakpoints, hex string. '0x00000000' when absent.

TDQS

A4.3/5.0
Behavior4/5

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

The description goes beyond the annotations by explicitly warning that 'reset' reboots the game and loses in-memory state, and that 'run_until' sets a temporary breakpoint and resumes execution. This is meaningful behavioral disclosure for a state-changing tool, though pause/resume side effects are not detailed.

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 tightly organized into PURPOSE, USAGE, BEHAVIOR, and RETURNS, with no filler. The most important behavioral caveat is surfaced early, and each sentence earns its place.

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?

Given the 3 parameters, full schema coverage, annotations, and an output schema, the description supplies everything needed to select and invoke the tool: purpose, invocation constraints, state-change behavior, and return shape. The only notable omission is explicit alternative routing, which is a usage-guidelines concern rather than a completeness gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully documents action, address, and session_id. The description usefully summarizes the action-to-parameter relationship but largely duplicates what the schema says, keeping it at the baseline for high coverage.

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 opens with a concrete purpose ('Aggregate CPU step + run-state control') and enumerates all supported actions, so an agent knows exactly what operations the tool covers. This precise operation set distinguishes it from sibling tools like batch_step, breakpoint, or press_button without needing to name them.

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 explicit action-dependent invocation rules: most actions require only session_id, run_until requires address, and session_id is optional when exactly one session is active. However, it does not mention when to prefer alternative tools such as batch_step or wait_breakpoint, so it stops short of full guidance.

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

ppsspp_trace_memory_accessA

PURPOSE: One-call answer to 'what code reads/writes this address' — arm a memory breakpoint, wait for the hit, capture pc (+registers/backtrace), remove the breakpoint, and resume.

USAGE: session_id + hex address; access='read'|'write'|'read_write' (default read); size 1/2/4 (default 4); timeout_s default 30; want_registers/want_backtrace optional. Game must be RUNNING (call after session wait_ready).

BEHAVIOR: MUTATING. Arms a temporary breakpoint and always removes it (list-verified real-size removal). The lock is held only for arm/capture/cleanup — the wait is lock-free (concurrent reads OK). Do NOT run other breakpoint/step tools during the wait: the first cpu.stepping broadcast wins. An already-paused CPU short-circuits (nothing can hit). Error paths still remove the breakpoint and resume.

RETURNS: {hit, already_paused, address, access, timeout_s, hits:[{pc, related_address, reason, ticks, mem_hits?, registers?, backtrace?}], bp_removed, resumed, note}. reason/related_address may be null on some builds; mem_hits is the attribution counter.

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNoWatch size in bytes: 1, 2, or 4 (default 4).
accessNoAccess kind to trap: 'read', 'write', or 'read_write' (default 'read').read
addressYesAddress to trace, as a hex string (e.g. '0x08A0D000').
timeout_sNoWait budget in seconds (default 30, clamped to [0.5, 300]). On timeout: hit=false, breakpoint removed.
session_idYesActive session ID.
want_backtraceNoInclude the HLE backtrace in the hit (CPU is paused at the hit, so the trace is valid).
want_registersNoInclude the full CPU register dump in the hit.

Output Schema

ParametersJSON Schema
NameRequiredDescription
hitYesTrue when at least one access was captured.
hitsYesCaptured hits (pc/related_address hex strings; 'registers' / 'backtrace' included when requested).
noteYesOptional human context (e.g. cleanup caveats).
accessYesAccess kind traced: 'read' / 'write' / 'read_write'.
addressYesTraced address, hex string.
resumedYesTrue when the tool resumed the CPU it had seen running at arm time (a hit pauses the CPU; the tool restores it).
timeout_sYesThe wait budget that was applied.
bp_removedYesTrue when the tool's memory breakpoint is confirmed gone (list-verified) — always true on normal return.
already_pausedYesTrue when the CPU was already paused at arm time — nothing can hit while paused, so no breakpoint was armed.

TDQS

A4.7/5.0
Behavior5/5

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

The BEHAVIOR section is exemplary: it discloses that the tool MUTATES by arming a temporary breakpoint, guarantees the breakpoint is always removed even on error paths, explains the lock is only held for arm/capture/cleanup, and warns about the first-broadcast-wins race. This adds substantial behavioral context beyond the annotations, which are all false and provide no safety or mutation hints.

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 organized into PURPOSE, USAGE, BEHAVIOR, and RETURNS sections, making it scannable for an agent. Although long, nearly every sentence carries non-obvious operational detail, and the most important purpose and usage constraints are front-loaded.

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 tool with 7 parameters and complex runtime behavior, the description covers inputs, preconditions, concurrency hazards, cleanup guarantees, and the full return shape. The RETURNS field enumerates the result object with nested hit fields, so nothing essential is missing even without viewing the output schema.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3; the schema already documents defaults, ranges, and behavior for each parameter. The description mostly restates access types, size 1/2/4, timeout_s, and optional flags without adding new parameter-level meaning. It does add some context, like needing a running session, but this is more usage guidance than parameter semantics.

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 opens with a specific purpose: 'One-call answer to what code reads/writes this address', and spells out the operational sequence (arm breakpoint, wait, capture pc, remove breakpoint, resume). This clearly differentiates it from sibling tools like ppsspp_breakpoint, ppsspp_step, and ppsspp_wait_breakpoint by framing it as a complete trace operation rather than a component.

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?

The USAGE section explicitly states required inputs, optional flags, and a critical precondition: 'Game must be RUNNING (call after session wait_ready).' It also gives a clear exclusion rule: 'Do NOT run other breakpoint/step tools during the wait: the first cpu.stepping broadcast wins.' This tells the agent exactly when and how to invoke the tool, and what to avoid.

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

ppsspp_wait_breakpointA
Read-only

PURPOSE: Block until a breakpoint hit (any kind) — replaces polling gpu_stats errors as a hit probe.

USAGE: session_id; timeout_s default 30. Arm a breakpoint first via ppsspp_breakpoint (set or mem_set). Use when you only need to know a hit happened; call ppsspp_trace_memory_access instead to capture the hit scene (registers/backtrace) in one step.

BEHAVIOR: READ-ONLY. Subscribes to the cpu.stepping broadcast and holds NO session lock — concurrent reads/observes keep working, but do NOT submit step/pause/resume during the wait. An already-paused CPU returns hit=true + already_paused=true with a high-trust pc (a manual pause is indistinguishable from a hit).

RETURNS: {hit, already_paused, timeout_s, pc, reason, related_address, ticks} — timeout returns hit=false (pollable, not an error); reason/related_address may be null on some builds.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeout_sNoWait budget in seconds (default 30, clamped to [0.5, 300]). On timeout the tool returns hit=false — NOT an error — so callers can poll.
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pcYesProgram counter at the hit, hex string.
hitYesTrue when the CPU entered stepping (breakpoint hit, or it was already paused when the tool was called).
ticksYesCoreTiming tick count at the hit.
reasonYescpu.stepping broadcast reason (e.g. 'breakpoint' / 'memory.breakpoint').
timeout_sYesThe wait budget that was applied.
already_pausedYesTrue when the CPU was found in stepping state at arm time — the hit happened before this tool call.
related_addressYesBroadcast relatedAddress, hex string (memory breakpoints: the accessed address).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true, and the description reinforces this with 'READ-ONLY' while adding substantial extra behavior: it subscribes to cpu.stepping, holds no session lock, warns against step/pause/resume during the wait, and explains the already-paused CPU edge case. This goes well beyond annotation coverage.

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 organized into PURPOSE, USAGE, BEHAVIOR, and RETURNS sections, front-loading the core purpose and keeping each sentence dense and relevant. Every section earns its place and no content is redundant with the 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?

The definition covers the prerequisite, the decision between this and trace_memory_access, the locking/concurrency warning, the paused-CPU edge case, timeout semantics, and return field nullability. This is complete for a blocking wait tool with no hidden caveats left for the agent to discover by trial and error.

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

Parameters3/5

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

Schema description coverage is 100%, with both session_id and timeout_s already described in detail including the default and clamping. The description's mention of 'session_id; timeout_s default 30' adds no meaningful information beyond the schema, so the baseline of 3 is appropriate.

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?

Purpose is precise: 'Block until a breakpoint hit (any kind)' names a specific verb, resource, and scope. It also differentiates itself from ppsspp_trace_memory_access and from polling gpu_stats, so an agent can distinguish it from closely related siblings.

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?

Explicitly states when to use it ('only need to know a hit happened'), names the alternative for richer capture, and gives a prerequisite ('Arm a breakpoint first via ppsspp_breakpoint'). It also explains timeout semantics as pollable rather than an error, leaving no ambiguity about acceptable usage.

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

ppsspp_wait_framesB
Idempotent

PURPOSE: Wait N frames (wall-clock sleep at 60 FPS by default) to let the emulator advance.

USAGE: session_id + frames required; interval optional (default 1/60 s).

BEHAVIOR: STATE-CHANGE. Sleeps the caller; emulator advances N frames. Session must be alive (validated before sleep).

RETURNS: {frames, elapsed_s}.

ParametersJSON Schema
NameRequiredDescriptionDefault
framesYesNumber of frames to wait (at 60 FPS, frames/60 seconds).
intervalNoPer-frame interval in seconds (default 1/60). Total wait = frames * interval.
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
framesYesNumber of frames waited.
elapsed_sYesWall-clock seconds elapsed.

TDQS

B3.4/5.0
Behavior1/5

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

The description explicitly says 'STATE-CHANGE' and that the emulator 'advances N frames,' while annotations declare idempotentHint=true. Repeatedly waiting N frames advances emulator state cumulatively, so this is an Annotation Contradiction.

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 tightly structured with labeled PURPOSE, USAGE, BEHAVIOR, and RETURNS sections, front-loading the key purpose and call contract. Every sentence is informative 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 simple three-parameter tool with an output schema, the description covers purpose, call requirements, behavioral effect, session validation, and return shape. It is nearly complete, but the unresolved idempotency contradiction could confuse an agent about repeated-call semantics.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents frames, interval, and session_id. The description restates required fields and the default 1/60 s interval but adds no substantial meaning beyond the schema, meeting only the baseline for fully documented parameters.

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?

PURPOSE states a specific operation—'Wait N frames'—with timing semantics ('wall-clock sleep at 60 FPS by default') and the intended effect ('let the emulator advance'). This clearly identifies the tool's role and distinguishes it from sibling stepping or breakpoint-wait operations.

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 specifies the required arguments ('session_id + frames required; interval optional') and the default interval, which tells an agent how to invoke it. However, it does not explain when to prefer this tool over siblings like ppsspp_step, ppsspp_batch_step, or ppsspp_wait_breakpoint, nor does it state any exclusions or alternatives.

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

ppsspp_write_memoryA
Destructive

PURPOSE: Write u8/u16/u32 or raw bytes to memory.

USAGE: session_id + address ('0x' hex) + data + format ('u8'|'u16'|'u32'|'bytes'; bytes accepts hex or base64).

BEHAVIOR: DESTRUCTIVE. Protected ranges (kernel, top.prx code) need force=true (PROTECTED_ADDRESS).

RETURNS: {address, format, bytes_written, value, text}.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesValue to write, as a string. For format='u8'/'u16'/'u32', a hex string (e.g. '0x00000001') or decimal string (e.g. '1'). For format='bytes', a hex string (e.g. 'AABBCCDD') or base64 string.
forceNoSet to True to write to protected code-section addresses (kernel memory < 0x08800000 or top.prx code section 0x08804000-0x08D34000). Writing to these ranges without force=True raises ToolError to prevent accidental crashes.
formatNoWrite format. 'u32' (default) writes a 32-bit int. 'u8'/'u16' write byte/halfword granules (byte patches). 'bytes' writes raw bytes (data is hex-decoded).u32
addressYesTarget address, as a hex string (e.g. '0x08804000').
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYesUnified text representation: 'Wrote 0xVAL → 0xADDR' for u32, 'Wrote N bytes → 0xADDR' for bytes.
valueYesFor format='u32', the value written as hex string (e.g. '0x00000001'); None for 'bytes'.
formatYes'u32' or 'bytes'.
addressYesTarget address, hex string (e.g. '0x08804000').
bytes_writtenYesNumber of bytes written.

TDQS

A3.9/5.0
Behavior4/5

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

The description explicitly labels the operation 'DESTRUCTIVE' and discloses that protected ranges (kernel, top.prx code) require force=true to avoid accidental crashes. This adds behavioral context beyond the annotations by describing the protected-range constraint and the consequence of not using force.

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 tightly organized into PURPOSE, USAGE, BEHAVIOR, and RETURNS sections. Every sentence carries meaningful information, with the destructive behavior and key constraint front-loaded.

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?

The description covers purpose, invocation requirements, behavioral risks, protected-range handling, and return shape. Combined with a rich schema and output schema, an agent has sufficient information to call the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents data, format, address, force, and session_id in detail. The description's usage line mostly restates this information, adding little beyond the 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?

The description states a specific action and resource: 'Write u8/u16/u32 or raw bytes to memory.' It clearly distinguishes from sibling tools like ppsspp_write_register and ppsspp_read_memory by specifying the resource (memory) and accepted formats.

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 an invocation formula ('session_id + address + data + format'), but no guidance on when to choose this tool over alternatives such as ppsspp_write_register or ppsspp_assemble. The only conditional guidance ('protected ranges ... need force=true') is about a parameter, not about tool selection.

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

ppsspp_write_registerA
Destructive

PURPOSE: Set a CPU register (GPR/FPU/VFPU names, plus pc/hi/lo).

USAGE: session_id + name (MIPS ABI names only — 'r5' normalizes to 'v1') + value (hex).

BEHAVIOR: DESTRUCTIVE. Pauses and resumes the CPU automatically (REQUIRED_STEPPING handled internally) — no manual pause needed.

RETURNS: {name, value, response, text}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCPU register name (MIPS standard names). GPRs: 'v0'/'v1'/'a0'-'a3'/'t0'-'t9'/'s0'-'s7'/'gp'/'sp'/'fp'/'ra'/'hi'/'lo'/'pc'. FPU: 'f0'-'f31'. VFPU: 'v0'-'v127'. Numeric aliases like 'r5' are NOT accepted by PPSSPP — use the MIPS standard name (e.g., 'a1' instead of 'r5'). Case-sensitive (lowercase by convention).
valueYesValue to write, as a hex string (e.g. '0x00000001'). Treated as an unsigned 32-bit int; values outside [0, 0xFFFFFFFF] are wrapped by PPSSPP.
session_idYesActive session ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYesRegister name (e.g., 'v0', 'a0', 'pc', 'hi', 'lo').
textYesUnified text representation: 'Wrote 0x{VAL:X} → {REG}'.
valueYesValue written, hex string (e.g. '0x00000001').
responseYesRaw PPSSPP WebSocket response (may be empty).

TDQS

A4.2/5.0
Behavior4/5

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

The description explicitly discloses that the tool is DESTRUCTIVE, which aligns with the destructiveHint annotation. It also adds valuable behavioral context beyond the annotations: it pauses and resumes the CPU automatically, and handles REQUIRED_STEPPING internally. This is exactly the kind of behavioral detail an agent needs to know before invoking a mutating tool.

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 compact and front-loaded: PURPOSE, USAGE, BEHAVIOR, RETURNS. Every section earns its place, and the most important information (destructive, auto-pause) is prominent. No filler or 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?

The description covers purpose, usage, behavior, and return value shape. The output schema exists, so return values are already documented. The only minor gap is that it doesn't explicitly state what happens on invalid register names or out-of-range values, but the schema already covers value wrapping. Overall, it's complete for a tool of this complexity.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all three parameters thoroughly. The description adds a bit of context (e.g., 'r5' normalizes to 'v1', value is hex) but mostly restates what the schema already says. Baseline 3 is appropriate because the schema does the heavy lifting.

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 ('Set') and resource ('CPU register'), and enumerates the exact register families (GPR/FPU/VFPU, plus pc/hi/lo). This clearly distinguishes it from sibling tools like ppsspp_write_memory, which writes to memory rather than registers.

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 gives explicit usage context: it requires session_id, name, and value, and notes that MIPS ABI names are required (with 'r5' normalizing to 'v1'). It also states that no manual pause is needed because stepping is handled internally. It doesn't explicitly name alternatives or when-not-to-use, but the context is clear enough for an agent to select it appropriately.

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. 41 tool updatesv0.1.0
    • First observedppsspp_analyze_log
    • First observedppsspp_assemble
    • First observedppsspp_batch_cancel
    • First observedppsspp_batch_list
    • First observedppsspp_batch_status
    • First observedppsspp_batch_step
    • First observedppsspp_breakpoint
    • First observedppsspp_convert_address
    • First observedppsspp_disassemble
    • First observedppsspp_dump_clut
    • First observedppsspp_dump_texture
    • First observedppsspp_evaluate
    • First observedppsspp_frame_snapshot
    • First observedppsspp_get_pc
    • First observedppsspp_gpu_record
    • First observedppsspp_gpu_stats
    • First observedppsspp_health
    • First observedppsspp_hold_buttons
    • First observedppsspp_list_addresses
    • First observedppsspp_list_scripts
    • First observedppsspp_memory_info_search
    • First observedppsspp_memory_map
    • First observedppsspp_press_button
    • First observedppsspp_query
    • First observedppsspp_read_memory
    • First observedppsspp_reload_scripts
    • First observedppsspp_replay
    • First observedppsspp_run_script
    • First observedppsspp_screenshot
    • First observedppsspp_search_disasm
    • First observedppsspp_send_analog
    • First observedppsspp_session
    • First observedppsspp_session_list
    • First observedppsspp_smoke_test
    • First observedppsspp_state_observer
    • First observedppsspp_step
    • First observedppsspp_trace_memory_access
    • First observedppsspp_wait_breakpoint
    • First observedppsspp_wait_frames
    • First observedppsspp_write_memory
    • First observedppsspp_write_register

TDQS

A3.8/5.0

Scored across 41 tools

Disambiguation3/5

Most tools have clear targets (memory, CPU, input, GPU), but several clusters overlap: ppsspp_query is a catch-all that competes with get_pc/frame_snapshot/state_observer, and breakpoint/wait_breakpoint/trace_memory_access plus step/batch_step have adjacent behaviors. The detailed usage text resolves most ambiguity, so an agent can pick correctly if it reads closely.

Naming Consistency3/5

All tools share the ppsspp_ snake_case prefix, which helps, but the internal convention varies: many are verb_noun (read_memory, press_button, dump_texture), while others are generic nouns or action-dispatch names (session, breakpoint, query, replay, step), and some are inverted (batch_cancel, memory_info_search). Still readable and predictable enough.

Tool Count2/5

41 tools is a large surface for agents to discover and keep straight, even though the server covers many subdomains (session, memory, CPU, input, GPU, replay, scripts, batch). Many tools could be consolidated further, and the count sits well above the 25-tool comfort threshold.

Completeness5/5

For a PPSSPP debugging/automation server, the surface is remarkably thorough: session lifecycle, memory read/write/scan/assemble, CPU stepping/breakpoints/tracing, input control, GPU capture, replay, batch jobs, scripts, and log analysis are all present. I don't see an obvious critical workflow dead end.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables AI agents to debug embedded systems by providing a comprehensive interface for GDB operations across multiple architectures like ARM and x86. It supports remote debugging via gdbserver or QEMU, allowing for detailed inspection of memory, registers, stack frames, and variables.
    31
    -
  • A
    license
    A
    quality
    B
    maintenance
    An MCP server that exposes PPSSPP — the PlayStation Portable emulator — to any MCP-compatible client (Claude Desktop, Claude Code, etc.) via PPSSPP's built-in WebSocket debugger interface. Read and write PSP memory, drive games with button input, capture screenshots, set CPU breakpoints, inspect MIPS Allegrex registers — all through a clean tool interface. No bridge plugin needed; PPSSPP's debugg
    23
    19 npm
    8
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to interact with GDB for debugging via the MCP protocol. Supports setting breakpoints, stepping through code, inspecting memory and registers, and more.
    86
    MIT