Skip to content

fix(client): MCP execute_command 执行 --help 类命令无输出 - #99

Open
sss12365 wants to merge 1 commit into
chainreactors:devfrom
sss12365:fix/mcp-help-output
Open

fix(client): MCP execute_command 执行 --help 类命令无输出#99
sss12365 wants to merge 1 commit into
chainreactors:devfrom
sss12365:fix/mcp-help-output

Conversation

@sss12365

@sss12365 sss12365 commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator

Summary

修复通过 MCP 调用 execute_command("bof --help")(以及任何 --help / -h / help 形态)始终返回
Command executed successfully (no output) 的问题。终端中直接执行 --help 有完整输出。

Root Cause

两个原因(均在 client/core/):

  1. execute_command 捕获不到 Cobra 的 help 文本

    • execute_commandexecuteCommandWithTaskWaitutils.go:204)用 client.Stdout.Range(start, now) 截取输出。
    • client.StdoutNewStdoutWrapper(os.Stdout) 环形缓冲 wrapper(external/IoM-go/client/log.go:16),只有写入该 wrapper 的内容才能被 .Range() 截到。
    • Cobra 的 --helpcmd.OutOrStdout(),全仓库没有任何 cmd.SetOut(client.Stdout),help 直接打到原始 os.Stdout,绕过 wrapper → .Range() 截到空串 → MCP 返回 "no output"。
    • 对照:module list / whoami 走 console 日志路径(logs.Log.SetOutput(client.Stdout)console.go:247),所以能被截到。
  2. MCP server 的误导性 Tip

    • mcp.go:448 在每次 search_commands 返回末尾硬编码
      Tip: Use execute_command("<command> --help") for detailed usage.
      即 MCP 主动指引 AI 使用一条必然返回空的路径。

Fix

execute_command handler 中短路 help 请求:识别 --help / -h / help
cmd.SetOut(&buf) + cmd.Help() 将 help 文本渲染进缓冲后返回,绕开 stdout 捕获通道。

唯一改动文件:client/core/mcp.go(+135 / −1,其中 −1 为 repl import 的 goimports 位置调整):

改动 内容
imports 新增 bytesgithub.com/chainreactors/IoM-go/clientRemoveANSI)、github.com/kballard/go-shellquote
新增 5 个函数 isHelpRequest(识别 help 请求)、renderCobraHelp(缓冲捕获 help 并去 ANSI,空则 fallback 到既有 generateCommandDoc)、menuRootactiveMenuRootrenderCommandHelp(跨 implant/client 两个菜单解析目标命令;支持 MAL 插件 : 命名空间拆分;与命令执行共享 commandExecMu 串行化)
handler 短路 registerExecuteCommandToolisHelpRequest 命中且渲染成功时直接返回 help 文本

解析失败(help 为空)时自然落回原 executeCommand 路径,对非 help 命令零影响

Test Plan

  • MCP 调用 execute_command("bof --help") 返回完整 help 文本
  • execute_command("help") 返回当前活动菜单的命令树
  • MAL 插件命令(如 uac-bypass:elevatedcom --help)可正常解析
  • 非 help 命令(whoamimodule list 等)行为与改动前一致

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant