command-run MCP

TURA 프로젝트에서 영감 받음

https://github.com/Tura-AI/tura Build agent that uses 80% less token and delivers better results.

핵심 아이디어는 rg, find, sed, git, cargo test 같은 shell command 호출을 개별 단위가 아닌 묶음으로 처리하게 해서 잦은 도구호출로 인한 토큰을 아끼자는 것이다.

TURA의 TUI가 멋지긴 한데 당장 필요한 건 토큰을 아끼는 기능이므로 핵심 기능인 `command-run`을 MCP로 구현했다. Kontexus-MCP 쪽에 구겨넣지 않고 단독 MCP서버로 만듦. Runtime이 없으니 CLAUDE.local.md 파일에 규정을 추가해야 했다:

[P4.8] command_run 사용법

shell command 실행 전용 tool입니다. 내장 shell 실행 도구(Bash 등)를 대신 사용하는 것은 규정 위반이며, 예외는 [P4.8d]에 한정됩니다.

[P4.8a] 입력 형식
  • commands: 1개 이상 30개 이하의 배열. 초과·미달은 실행 전 거부됩니다.
  • command_type: "shell_command" + command_line: platform shell(/bin/sh -c,
    Windows는 cmd.exe /C)에 문자열을 그대로 전달합니다. pipe·redirect 사용 가능.
  • command_type: "argv" + program, args: shell parsing 없이 직접 실행합니다. 인자에 공백·특수문자가 있으면 이 type을 사용하십시오.
  • 정의되지 않은 field는 거부됩니다(deny_unknown_fields).
[P4.8b] step과 output binding
  • step(기본 1): 같은 step의 command는 병렬 실행되므로 서로 독립이어야 하고, 다음 step은 이전 step의 모든 결과가 확정된 뒤 시작됩니다.
  • 독립적인 조회 명령(read/search/list)은 같은 step에 묶어 한 번의 호출로 병렬 실행하십시오. 이전 출력에 의존하는 명령만 뒤 step에 두십시오.
  • id: 이후 step이 참조할 output binding 이름. 생략하면 cmd<index>.
  • 이전 step의 출력을 소비할 때는 문자열을 손으로 옮기지 말고 binding을 사용하십시오.
  • placeholder #@#${id.field}#@#$: strictly 이전 step의 id만 참조할 수 있습니다.
    허용 field는 exit_code, stdout, stderr, 그리고 stdout이 JSON object일 때 그 field 경로(예: #@#${make.metadata.revision}#@#$)입니다.
  • 같은/이후 step 참조, 미지 id, duplicate id는 batch 전체가 실행 전 거부됩니다.
[P4.8c] 실행 제약
  • cwd: workspace root(서버 시작 cwd) 기준 상대 경로만 허용. 절대 경로, ..·symlink로 workspace를 벗어나는 경로는 rejected 처리됩니다.
  • env: COMMAND_RUN_ENV_ALLOWLIST에 있는 변수만 전달됩니다.
  • timeout_ms: command별 timeout(기본 15000, 상한 600000). 초과 시 process tree가 정리되고 status는 timed_out.
  • batch 전체 timeout 상한은 1800000(30분)입니다. step 경계에서 예산이 소진되면 남은 command는 skipped 처리되고, command timeout도 남은 예산으로 clamp됩니다.
  • stdout·stderr는 각각 256KiB에서 잘리며 stdout_truncated로 표시됩니다.
[P4.8d] 결과 해석과 예외
  • status: succeeded | failed | rejected(실행 전 거부) | timed_out | cancelled | skipped(이전 step 실패로 미시작).
  • 한 command라도 실패하면 그 step의 나머지 결과는 수집되지만 이후 step은 skipped가 되고 cancel_reason에 중단 이유가 기록됩니다.
  • structuredContent(BatchResult)가 원본이며 text content는 요약입니다.
  • 예외: workspace 밖 경로 접근, 대화형 명령, server 미연결/장애처럼
    command_run이 구조적으로 수행할 수 없는 경우에만 다른 실행 수단을
    사용하고 그 사유를 응답에 한 줄로 남기십시오.
[P4.8e] 사용 예
{"commands": [
  {"command_type": "shell_command", "command_line": "cargo metadata --format-version 1 --no-deps", "id": "meta", "step": 1},
  {"command_type": "shell_command", "command_line": "rg -n TODO src | head -20", "step": 1},
  {"command_type": "argv", "program": "echo", "args": ["version=#@#${meta.packages.0.version}#@#$"], "step": 2}
]}

STDOUT 도구호출

TUI가 없으니 그다지 이쁜 모습을 볼 수는 없지만 동작하는 건 확실하다. 다만 Kontexus-MCP.structure_reasoning 같은 도구호출이나 codebase-memory-mcp, serena, context7 등의 MCP 서버호출은 배치처리가 안됨.

따라서 일반적인 shell command를 자주 사용하는 프로젝트가 아니라면 토큰 세이빙은 크지 않을 것 같다. 게다가 command-run 도구 사용을 위한 추가된 규정의 규모도 만만찮으니 드라마틱한 차이를 보인다고는 할 수 없다.

Claude CLI를 사용할 때, command-run-mcp 도구호출이 유용하다고 하네;;

kontexus-mcp를 사용한 리팩토링

#FTM:strict 모드, 실전투입 리팩토링에 최적의 모드. 몇시간 걸릴지 모르겠지만, 기대된다. TMUX 환경. 왼쪽 Pane은 Claude Opus-5-high Model, 오른쪽은 32 Turn Refactoring 진행상황을 나타내는 Kontexus-CLI AspectScope? 날짜와 시간에 따른 위상변이를 추적하는 AspectScope 특정 지역+시간대역의 Natal Chart 위상을 조사하는 앱이다. 키보드/마우스/트랙패드에 대단히 세밀하게 반응해야 한다. 전통적인 이벤트…

confabulation

기억에 구멍이 난 환자가 그 구멍을 스스로 메운 이야기로 채우면서 본인은 그게 진짜라고 믿는 현상. LLM은 속이려는게 아니라, 빈칸을 견디지 못한다. 즉, LLM이 하는 일의 근본은 다음에 올 가장 그럴듯한 것을 이어붙이는 것인데, "실제로 실행해서 알아낸 결과"와 "그 자리에 올 법한 결과"는 LLM 안에서 별도의…

세션을 거슬러 스스로 기억을 찾는 AGENT

기억의 파편을 이어주는 이음Seam Rhio의 지원으로 Claude로 연구를 계속이어갈 수 있게되면서 가장 먼저 WGM을 연결하는 것 부터 시작했다. 모델은, Opus 4.8/High. 불과 몇 시간 동안의 대화지만, 뭔가 Claude 화의 대화는 정말 연구를 하는 것 같은 착각이 들게한다. 곧 바로 스펙을 들이 밀면서 이렇게 저렇게 그리고…

functional-thinking-mcp + WGM

functional-thinking-mcp FTM AGENT의 추론 흐름을 상태중심적 사고로 강제하는 MCP 서버. 실제 사용하며 개발중이다. workgraph-memory-mcp WGM 내가 만든 태스크 관리 MCP. sequential-thinking-mcp STM 사용자의 요구를 구현하기 위해 자유롭게 브레인스토밍하며 일을 잘게 나누고 처리하게 하는 MCP 서버. 이 MCP들은 내 인지 구조의 특징 중 하나인 "작은 단위별로…

MCP를 적극활용하여 WordPress Plugin 개발하기

CMUX+Browser API vs. TMUX+Playwright 시작은 Agent에게 프롬프트로만 WordPress 플러그인을 만들게 할 때, 맘에 드는 결과물이 나오게 하는 과정이 비싸고 비효율적인 것을 해결하기 위해서였다. WordPress는 OCI 기반 가상호스트에서 동작하고 있어서 초기에는 Local Agent를 WP 환경 바깥 호스트에 직접 ssh로 접속해서 개발하거나, WP가 동작하는 도커 컨테이너 안에서…