ruyi-workbench-oss (wangzhe04/ruyi-workbench-oss) is an MCP server listed on the M8ven Trust Index. It scores 56 out of 100, grade D. It declares 231 tools. No publisher has claimed this listing.
开源 Windows 本地 AI 工作台|OpenAI-compatible + Claude CLI,99 个桌面/Office 工具,可回退文件操作与可视化多 Agent 工作流。
Caution. Specific findings reduced this grade. They are listed on the page. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.
How we verified
Verified is a snapshot. Live keeps it current, and builds your track record.
⚡ Connect GitHub → continuous verification on every pushwhy connect →Who stands behind it
wangzhe04
Source: github_repo_search
Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →
Install from
The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.
These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.
sse_aa
sse_bb
sse_cc
remote_echoecho over http
sse_echoecho over sse
sse_new_tooladded later
echoEcho a message back
addAdd two numbers
screenshot_fullCapture a full-screen screenshot (fake)
diagnosticsReport optional module availability (fake)
write_docxWrite a fake .docx file (mirrors ACC write_document契约)
move_fileMove/rename a file (mirrors ACC move_file契约: source→destination)
copy_fileCopy a file (mirrors ACC copy_file契约: source→destination)
read_fileRead text file (mirrors ACC read_file契约)
write_fileWrite/append text file (mirrors ACC write_file契约)
write_documentWrite fake .docx (mirrors ACC write_document新形状:含 output_path)
write_excelWrite fake .xlsx (mirrors ACC write_excel契约)
write_pdfWrite fake .pdf (mirrors ACC write_pdf契约:非 .pdf 路径报错)
write_pptxWrite fake .pptx (mirrors ACC write_pptx契约:slides 规格)
excel_beautifyBeautify existing .xlsx (mirrors ACC excel_beautify契约)
excel_chartInsert chart into existing .xlsx (mirrors ACC excel_chart契约)
chart_imageRender chart .png (mirrors ACC chart_image契约)
image_resizeResize image (mirrors ACC image_resize契约:ok包络)
window_screenshotScreenshot a window (mirrors ACC window_screenshot契约:output_path 可选)
get_clipboard_imageRead clipboard image (mirrors ACC get_clipboard_image契约:save_path 可选)
delete_fileDelete a file (mirrors ACC delete_file契约)
slow_taskSleep ms then return (47b 桥超时契约测试件)
edit_filePartial edit via exact-string replacement (mirrors ACC edit_file契约:唯一性闸)
fetchFetch a URL with SSRF guard (mirrors ACC fetch契约, fake 不联网)
memory_saveSave a memory entry (mirrors ACC memory_save契约)
memory_readRead a memory entry (mirrors ACC memory_read契约)
memory_listList memory entries (mirrors ACC memory_list契约)
memory_deleteDelete a memory entry (mirrors ACC memory_delete契约)
sequential_thinkingRecord a thinking step (mirrors ACC sequential_thinking契约)
workbench_memory_listList/search confirmed Workbench Memory metadata for the current project and global scope. Use when the user asks what is remembered or the injected memory preflight/index is insufficient. This does not read full bodies.
workbench_memory_readRead one confirmed Workbench Memory entry by id. Read only entries relevant to the current request and verify stale facts against the workspace before relying on them.
workbench_memory_proposeSubmit one durable memory candidate for user review. It never saves directly: the user must confirm the card shown after the turn. Use when the user explicitly asks to remember something, or for a stable preference, confirmed project convention/decision, or verified recurring lesson that is not alre…
workbench_memory_relation_proposePropose a relation edge between two existing confirmed Workbench Memory entries (supports/contradicts/supersedes/derived_from). It never saves directly: the user must confirm the card after the turn. from/to must be memory ids that already exist in the same scope.
workbench_memory_revisePropose a revision to an existing confirmed Workbench Memory entry (name/description/type/body). It never saves directly: the user must confirm the card after the turn. Provide the suggested replacement values; unchanged fields may be omitted.
workbench_memory_relation_revokePropose revoking (deleting) an existing memory relation edge. It never deletes directly: the user must confirm the card after the turn. Use relationId from listMemoryRelations or a prior confirmed relation.
observation_recallRecall the original content of a tool result reduced during context compaction, using the rawRef embedded in its reduced view (format history:<turn>:<hash>:<index>:<hash>). When a user asks for an exact historical value/detail and a relevant earlier tool result is marked reduced or omitted, call thi…
permission_promptInternal: handles --permission-prompt-tool requests by asking the workbench UI to allow/deny a tool call.
powershell_runRun a one-shot PowerShell command on Windows. For a persistent/interactive terminal that keeps state across calls, use shell_start/shell_send instead.
shell_startStart a persistent PowerShell session (keeps cwd/vars/background processes across calls). Provider engine only. Returns {shellId}. Then drive it with shell_send / shell_poll.
shell_sendSend a line of input to a shell session and return the output that settles within timeoutMs (best-effort; long tasks: track with shell_poll). output is the increment since the last cursor.
shell_pollRead new output from a shell session since an absolute byte cursor. Returns {output, cursor, running, exitCode?, truncated?}. Pass the returned cursor back next time to tail incrementally.
shell_killTerminate a shell session and its process tree. CAUTION: any un-consumed buffered output of that session is lost, and any long-running command inside it is killed.
shell_listList active shell sessions: [{shellId,name,cwd,running,exitCode,startedAt,lastUsedAt,bytes}].
script_runRun a temporary PowerShell, Python, or Node script
file_readRead a local file. Char slice via offset/limit, or line mode via lineOffset (1-based) / lineLimit (returns cat -n style content with totalLines). Image/binary files are refused (use the vision channel).
file_writeWrite a local file
file_editReplace text in a local file
file_deleteDelete a local file (checkpointed first, so it can be rolled back). Directories are refused.
file_move移动或重命名一个文件(from→to)。已先存检查点,可一键撤销。默认不覆盖已存在的目标(overwrite=true 才覆盖)。仅支持单个文件,不支持文件夹;跨磁盘自动退化为复制+删除。
file_copy复制一个文件(from→to)。目标已存在时会先存检查点,可一键撤销。默认不覆盖(overwrite=true 才覆盖)。仅支持单个文件,不支持文件夹。
archive_zip把工作区内的文件/文件夹打包成一个 .zip(deflate 压缩,中文文件名正确保留)。dest 已存在时先存检查点,可撤销。单文件上限 100MB、总量上限 500MB,超限会人话拒绝。
archive_unzip把一个 .zip 解压到 destDir(支持 stored/deflate 两种压缩方式)。含越界路径(Zip Slip,如 ..\)的压缩包会被整包拒绝;符号链接条目会被跳过。条目数上限 2000、解压总量上限 500MB。覆盖已存在文件需 overwrite=true,覆盖前会存检查点。
http_download从一个 http(s) 网址下载文件保存到工作区内的 dest(内网/回环地址会被 SSRF 防护拒绝)。dest 已存在时先存检查点,可撤销。默认单文件上限 100MB(maxBytes 可调),Content-Length 与实际字节都会卡上限,超限拒绝。返回 {path, bytes, contentType}。
file_listList files under a directory
file_searchSearch text (regex, per line) in files under a directory. Optional context lines, relative-path glob filter, and per-file grouping.
globFind files by glob pattern (** crosses dirs, * within a segment, ? one char). Returns matches sorted by mtime (newest first).
browser_openOpen a URL or local HTML file in a new tab of the default browser. Never navigate or close the current Ruyi Workbench tab.
mcp_listList the currently configured built-in and external MCP connectors, their launch command, argument list, working directory, environment key names, and browser target. Secret environment values are never returned. Use this before changing tool/MCP configuration.
mcp_configureConfigure tools/MCP on the user's explicit request. Supports upsert/remove/enable of an external stdio MCP connector and changing the ai-computer-control browser target. This is an exec-tier persistent configuration change: inspect with mcp_list first, explain the diff, and rely on the permission pr…
office_openOpen a local Office document with the default application
desktop_screenshotCapture the primary Windows screen to a PNG file
keyboard_send_keysSend keystrokes to the active Windows application. CAUTION: keys go to whatever window currently has focus; SendKeys meta characters + ^ % ~ ( ) { } [ ] are live modifiers (e.g. ^s = Ctrl+S, %{F4} = Alt+F4). Confirm the focus target before sending, and prefer explicit app control over raw keys when …
project_snapshotReturn a compact project tree snapshot
git_statusShow the git status of a folder (current branch, ahead/behind, and how many files changed). Read-only. Returns a plain-language summary plus the raw porcelain status.
git_diffShow what changed in a git repo as a unified diff (the +added / -removed lines). Read-only. Use staged:true to see staged changes, path to limit to one file, contextLines to widen/narrow context.
git_logList recent git commits (hash, date, author, subject) as a table. Read-only. maxCount defaults to 10 (clamped 1..100); path limits history to one file.
git_commitSave a version: stage changes then create a git commit with the given message. This RUNS git hooks (pre-commit etc.), so it is an exec-tier action. If the repo has no Git identity configured, it returns a guiding error (it never invents a fake name/email).
dependency_inventoryInventory local dependency and runtime configuration files without installing anything
code_review_scanRun a lightweight offline code review scan for common security and quality risks
frontend_auditAudit frontend files for offline asset and UI polish issues
claude_md_auditFind and audit CLAUDE.md project memory files
docs_searchSearch local project documentation as an offline docs lookup
codebase_symbol_searchSearch a codebase for where a symbol (function/class/method/variable name) is defined and referenced, returning file-level definition/reference evidence grouped by file. Grep-level lexical scan (not AST/type-aware): it matches identifier occurrences by word boundary. Use when auditing or tracing whe…
debug_hypothesisAdvisory hypothesis/experiment/refutation ledger for structured debugging (bisect/elimination method). Tracks which hypotheses are pending/refuted/supported/confirmed so you can see how many remain unrefuted, catch repeated experiments, and avoid locking a root cause before excluding alternatives. I…
data_profileProfile a data file (CSV/TSV/JSON/JSONL/text log) into a machine-computed summary: row/column counts, per-column type, null/unique counts, numeric min/max/mean/median/std + IQR outlier count, and sample values. Use to replace eyeballing a large file with file_read when you need its structure, scale …
http_requestMake an HTTP request to a local or intranet endpoint for API debugging
web_searchSearch the web via the configured search backend (searxng/bing/brave/custom). Returns {results:[{title,url,snippet}]}. Use it for time-sensitive facts, external information, or anything that may have changed after your knowledge cutoff — search first, then answer. Then use web_fetch to read a promis…
web_fetchFetch a public web page over http/https and return its extracted main text + title. Follows redirects (≤3), 10s timeout, ≤2MB. Internal/loopback/metadata addresses are refused for safety. Offline, it serves a cached copy if one exists (fromCache:true). Use it to read a page found via web_search.
request_user_inputPause and ask the user one to three concise questions in the workbench UI. Prefer 2-5 concrete, mutually exclusive options whenever the answer can be enumerated; put the recommended option first and label it (Recommended). Choice questions include an Other typed fallback by default. Use text-only mo…
todo_writeRecord/replace the task list for the current turn (full replace each call). Use it to plan multi-step work and mark progress. items:[{id?,text,status:pending|in_progress|done}]. Drives the workbench step-bar.
mission_updateUpdate the long-running task ledger (Mission): mark milestones done/blocked, add milestones, or record evidence. Use it ONLY when a Mission is active for this session (the system prompt shows a <mission-ledger> block). action="update" merges; provide milestones:[{id,desc?,status:pending|done|blocked…
workbench_self_status只读查询本工作台自身的运行时状态:版本号、启动模式(exe/源码)、安装位置、数据目录、服务地址与实例标识、健康检查项、原生/ACC 工具数与技能/命令/Playbook/工作流数量,以及当前设置(引擎/端点/模型/权限模式/输出风格/界面语言,已做密钥掩码,绝不含 apiKey/token)。何时用:用户问「你是哪个版本/装在哪/端口是多少/数据目录在哪/当前用哪个模型和权限模式/有多少工具、技能、Playbook」,或你需要核对自身运行环境再回答时,调用本工具而不是凭记忆回答或猜测。何时别用:查询用户项目文件、工作区结构或桌面/浏览器状态时——那应改用 project_snapshot/f…
steward_self_status只读查询如意工作台自身状态,并附带管家自己的运行段(管家相关设置的掩码回显 + 收件箱状态:是否启用/是否在轮询/当前 inboxSeq/各类事件计数)。何时用:用户问「你是哪个版本/装在哪/端口多少/当前用哪个模型/管家开着吗/收件箱里攒了什么」,或你要核对自身运行环境再作答时。何时别用:查线程进度用 steward_thread_status,查费用用 steward_usage,查健康项细节用 steward_health;本工具不接受也不触碰任何用户文件路径。section 可选,缩小返回范围省上下文。
steward_threads_search按关键词检索线程(会话)——同时匹配标题与正文内容,返回命中线程的 id、所属事项、标题、类型、五态、最后一句助手原话(≤200 字,已中和)、更新时间与相关度分。何时用:用户提到某件事但没说是哪条线程(「上次那个爬虫的事怎么样了」),或你要在递话前先定位目标线程时。何时别用:你已经知道 sessionId 时直接用 steward_thread_status;要看线程里具体说了什么用 steward_thread_read。结果永不包含管家自己的会话。
steward_thread_status读一条线程的当前状态:五态(交办中/进行中/需要你/已收工/已停工)、当前动作与最近一步、待决摘要(类型 + 一句话)、权限档、引擎与模型、累计费用与 token、最后一句助手原话(≤200 字)。何时用:用户问「那条线在干嘛/卡在哪/花了多少钱」,或你要判断能不能递话、该不该替他答复待决之前。何时别用:要看具体对话内容用 steward_thread_read;要看班组(Agent 工作流)节点进度用 steward_runs_status。线程不存在返回 {ok:false,error:"not_found"}。
steward_thread_read按需深读一条线程最近若干回合的原话:用户说了什么、助手回了什么、调用了哪些工具(只给一行摘要与结果长度/rawRef,不给工具输出全文)。何时用:总览与 steward_thread_status 不够你判断下一步时,针对性读一条线程。何时别用:例行汇报——总览每回合都在,不必逐条深读;也不要用它来「补全上下文」批量扫线程,读取是记账的。配额:每回合最多 6 次、单次 ≤12000 字符、本次到访累计受 stewardReadBudgetChars 限制;超限返回 {ok:false,error:"quota_exceeded"} 或 {ok:false,error:"budget_excee…
steward_missions读【事项】清单:一个事项是跨会话的容器(一件事可以有好几条线程)。每条返回事项标题与目标、事项级聚合状态(任一线程需要你则事项就是需要你;全部收工才算收工)、验收项进度(已勾选/总数)、累计费用与预算、以及它下面每条线程的 id/标题/五态/权限档/最后一句。何时用:用户问「XX 那件事进展怎么样/还差什么/花了多少」,或你要在开新线程前决定它该并进哪个事项。何时别用:要看某一条线程自己在干嘛用 steward_thread_status;要看班组节点用 steward_runs_status。没有事项文件的线程会以「未归类」事项出现(derived:true),标题取线程标题——这不是错误,…
steward_runs_status读 Agent 班组运行(工作流 DAG)的概览:每个 run 的状态、节点完成进度、是否暂停/在等什么、累计费用。何时用:线程状态显示在跑班组,而用户问「跑到第几步了/卡住了吗」,或你要在 steward_run_action 之前确认 runId 与节点 id。何时别用:普通对话线程(没有班组)用 steward_thread_status 就够。省略 sessionId 时返回全部线程的班组概览(有界)。
steward_inbox_read读管家收件箱:五类归一化事件(需要你 needs_you / 失败 failed / 收工 done / 停滞 stalled / 预算 budget)按 inboxSeq 递增排列。何时用:每个回合开头拉取上次游标之后的新事件,决定该提议什么、该做什么。何时别用:它不是对话历史,也不是完整审计流——要看审计用 steward_audit_tail。传 since=上次拿到的最大 inboxSeq 做增量,不要每次从 0 全量拉。
steward_usage读用量与费用台账:按线程或按日汇总 token 与花费,并把管家自身开销(kind=aux、note=steward)单列。何时用:用户问「今天/这条线花了多少」,或你要在开新线程前核对预算。何时别用:要看单条线程的状态与最近一步用 steward_thread_status。金额按币种分列,不做汇率换算(诚实优先)。
steward_health读工作台健康检查项(体检):每项的 id、是否正常与一句话细节。何时用:用户说「怎么不好使了/是不是坏了」,或某条线程反复失败而你怀疑是环境问题时。何时别用:线程自身失败的原因在 steward_thread_status 的待决摘要与 steward_runs_status 里,不在这里。返回原始项,人话解释由你来说。
steward_audit_tail读审计时间线尾部(最近的工作台事件,已过既有脱敏)。何时用:用户问「刚才发生了什么/是谁改的/我批准过什么」,或你要为一个决定给出可查证的依据时。何时别用:找线程内容用 steward_threads_search;找待办事件用 steward_inbox_read。limit 夹取到 1..100。
steward_thread_new按【委托书】新开一条线程并立刻让它跑起来。委托书结构固定:brief.userText 是用户原话(逐字放在首条消息最前,绝不改写),你的补充(目标/验收项/相关文件/偏好/约束)经中和后放在其后的管家围栏里、总长 ≤1200 字。何时用:用户提出的是一件要动手做的新事(要读写文件、跑命令、联网、做东西)。何时别用:关于如意自身、事项、费用、设置的问题你直接回答,不要为此开线程;已有对口线程时改用 steward_thread_continue。本工具是管家唯一的「动世界」出口——你自己没有文件/shell/桌面工具,想动手就必须经由线程。返回 {ok,sessionId,missionId,…
steward_thread_continue把一句话递给一条已有线程。message 是【原话直递】——不改写、不加你的注解;有补充要说,先递原话再另行插话。工作台按目标线程【当前状态】自动选五条通道之一,你不用也不能指定:① 它正在等用户回答(待决 question)→ 这句话就是那道题的答案,直接答进去(channel:"answer",回执带 questionId;【不会】打断它的回合);② 它正在等你批准一个动作(待决 permission)→ 【不代答】,返回 {ok:false,error:"propose_required",reason:"pending_permission"},把它作为提议交给用户去批;③ 它已经排在…
steward_thread_rename给线程改一个更贴切的标题。何时用:自动命名明显词不达意,或用户说「把那条改叫 X」。何时别用:不要为了「整理」批量改名——标题是用户认线程的锚点。返回 {ok,sessionId,title,undoRef},undoRef 带旧标题可一键改回。
106 further tools are not listed here. The complete surface is in the source.
COMPACT_QUALITY_PROVIDERComSpecFAKE_MCP_NOTIFY_CAPTUREFAKE_MCP_OPTIONALFAKE_MCP_PID_CAPTUREMCP_SECRET_VARMCP_TEST_SECRETPORT_VARRUYI_BATCH_REPSRUYI_HOME数据目录默认 ~/.win-claude-workbench(存量兼容),可用环境变量 覆盖。RUYI_JOURNAL_GLOBAL_MAX_BYTESRUYI_NO_LISTENRUYI_REAL_CONFIGRUYI_REAL_MODELRUYI_REAL_OUTRUYI_RG_PATH项目文本搜索始终可用:运行时依次检查 、发行包 vendor-bin/rg.exe 和系统 PATH 中的 rg;都没有时自动使用内置 Node 扫描器,只是大型仓库速度会慢一些。能力面板会显示当前使用的是「ripgrep 加速」还是「内置搜索」。WCW_CLAUDE_CMDLINE_BUDGETWCW_HOSTWCW_PERMISSION_TIMEOUT_MSWCW_PORTWCW_SESSION_IDWCW_TEST_ALLOW_LOOPBACKWCW_TOKENWIN_CLAUDE_WORKBENCH_HOME为不破坏存量接入,以下存量兼容标识有意保持不变:MCP server id win-claude-workbench、默认数据目录 ~/.win-claude-workbench、环境变量 (RUYI_HOME 优先,旧变量继续识别)。ACC_HIDE_MEMORYACC_TOOLSETSACC_BROWSER_MODEACC_BROWSER_EXECUTABLEACC_BROWSER_CDP_URLSystemDriveACC_OFFLINE_PYTHON_VERSIONACC_EMBED_SHA256ACC_GET_PIP_SHA256ACC_INSTALL_DIRWCW_DATA_DIRTool annotations
No tools have read-only/destructive annotations
Add readOnlyHint or destructiveHint annotations to every tool so hosts can warn users before invoking.
All four hints declared on every tool
231/231 tools missing one or more hints — sse_a (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); sse_b (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); sse_c (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint), +228 more. OpenAI's directory rejects tools where any of the four hints are missing or non-boolean.
For every tool, set all four hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to explicit true/false values that match the handler’s actual behaviour.
Destructive tools are labelled
6 tools perform destructive updates without destructiveHint — edit_file deletes at line 100 (os.unlink(tmp)); write_file deletes at line 159 (try: os.unlink(tmp)); delete_file deletes at line 337 (shutil.rmtree(path, onerror=_onerror))
Add destructiveHint:true to any tool whose handler calls .delete(), .upsert(), .update(), unlink, rm, DELETE, DROP, REPLACE INTO, or any operation that overwrites existing data.
Descriptions match behaviour
1 tool describes read intent but its handler mutates — show_notification (line 54: subprocess.Popen()
Rename the tool, rewrite the description, or move the side-effect into a separate clearly-named tool.
Tool test coverage
103/231 tools referenced in tests (45%)
Write tests that reference each tool by name so every tool has at least one test.
No eval / new Function
22 eval() or new Function() calls — dynamic code execution
Replace eval / Function with explicit parsing or safer alternatives.
Tool description accuracy
show_notification: description implies read-only but handler writes/deletes/executes
Update tool descriptions to accurately reflect all capabilities — especially write, delete, or execute operations.
Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.
[](https://m8ven.ai/mcp/wangzhe04/ruyi-workbench-oss)?variant=verified from the URL.Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.
https://m8ven.ai/api/mcp/tool-check