mcp-shell ð ã«ã€ããŠ
mcp-shell ã¯ãLLM ã管çãããæ¡ä»¶äžã§ã·ã§ã«ã³ãã³ããå®è¡ã§ããããã«ãããGo ã§æžããã MCP ãµãŒããŒã§ããæ¢å®ã§ã¯åä»ãããŒã«ã®ã¿ãç»é²ããã»ãã¥ã¢ã¢ãŒãã§èµ·åããæå®ãããäœæ¥ãã£ã¬ã¯ããªå ã«ãã¹ãå¶éããŸããAI ãå®è¡ã§ããæäœãç£æ»ããå¶çŽãããå©çšè ã«é©ããŠããŸãã
äž»ãªæ©èœ
- 01åä»ãããŒã«ã®ã¿ãæäŸããæ¢å®ã®ã»ãã¥ã¢ã¢ãŒã
- 02working_directory å ãžã®ãã¹å¶é
- 03ãã¡ã€ã«èªã¿åããgrepãglobãgit åç §ã®ããŒã«
- 04æžãèŸŒã¿æ©èœãšã¹ã¯ãªããã¯æç€ºçãªæå¹åãå¿ èŠ
- 05Docker ã€ã¡ãŒãžãš YAML ã«ããã»ãã¥ãªãã£èšå®
掻çšã·ãŒã³
- 01åºå®ãã£ã¬ã¯ããªå ã§ã®ã³ãŒãæ€çŽ¢ãš git å±¥æŽã®ç¢ºèªã LLM ã«ä»»ãã
- 02æžã蟌ã¿ãæå¹ã«ããäžã§ã®ãå¶åŸ¡ããããã¡ã€ã«ç·šéãšã³ããã
- 03MCP_SHELL_ALLOW_UNSAFE ãçšããããŒã«ã«éçºç°å¢ã§ã®çã®ã·ã§ã«ã¢ã¯ã»ã¹
MCP 察å¿
æ¬ãããžã§ã¯ã㯠MCP ãµãŒããŒã§ããããã¡ã€ã«ãæ€çŽ¢ãgit ã®åä»ãããŒã«ã MCP ã¯ã©ã€ã¢ã³ãã«å ¬éããŸããå¶éã®ãªãã¢ãŒãã§ã¯ shell_exec ããŒã«ã®ã¿ãå ¬éããŸãã
èšå®
ããŒã«ã«ãµãŒããŒã®èšå®ã¯ã©ã®ã¯ã©ã€ã¢ã³ãã§ãå ±éã§ããã³ããŒããŠã¯ã©ã€ã¢ã³ãã® MCP èšå®ãã¡ã€ã«ã«è²Œãä»ããŠãã ããã
docker run -i --rm sonirico/mcp-shell:latestããŒã«ã«ãµãŒããŒã«ã¯ãã·ã³äžã®å®è¡ç°å¢ïŒNode.js 18 以äžãªã©ïŒãå¿ èŠã§ããèšå®ãã¡ã€ã«ã®å Žæã¯ã¯ã©ã€ã¢ã³ãããšã«ç°ãªããŸãã
ããŒã«
ããŒã«ã«ãµãŒããŒã®ããŒã«ã¯ãã·ã³äžã§èµ·åããŠåããŠååŸã§ããŸããã¡ã³ãããŒã¯ãŸã ããŒã«äžèЧãæäŸããŠããŸããã
詳现
mcp-shell
ã·ã§ã«ã³ãã³ããå®è¡ãã MCP ãµãŒããŒã§ããLLM ã«ã¯ããŒã«ãæäŸããäœãã©ã®ããã«å®è¡ãããã¯ãŠãŒã¶ãŒãå¶åŸ¡ã§ããŸãã
mark3labs/mcp-go ãåºç€ãšããŠããŸããGo ã§èšè¿°ãããŠããŸãã
å®è¡æ¹æ³
DockerïŒæãç°¡åïŒïŒ
docker run -it --rm -v /tmp/mcp-workspace:/tmp/mcp-workspace sonirico/mcp-shell:latest
ãœãŒã¹ããïŒ
git clone https://github.com/sonirico/mcp-shell && cd mcp-shell
make install
mcp-shell
èšå®æ¹æ³
ããã©ã«ãã§ã¯ã»ãã¥ã¢ã¢ãŒãã§ãã èšå®ãã¡ã€ã«ããªãå Žåãmcp-shell ã¯ã»ãã¥ã¢ã¢ãŒãã§èµ·åããåä»ãããŒã«ã®ã¿ãç»é²ããŸããåä»ãããŒã«ã«ã¯ããã¡ã€ã«ã®èªã¿åããgrepïŒglobãgit ã®èª¿æ»ãããã³ïŒãªããã€ã³ã§æå¹ã«ããïŒãã¡ã€ã«ïŒgit ã®æžã蟌ã¿ãšããªãã¬ãŒã¿ãŒå®çŸ©ã®ã¹ã¯ãªãããå«ãŸããŸããçã®ã·ã§ã«ã³ãã³ãã¯ãããŸããã以äžã®ããã©ã«ãèšå®ã倿Žããå Žåã«ã®ã¿ãèšå®ãã¡ã€ã«ãå¿
èŠã§ããå¶éãå®å
šã«ãªãããŠå®è¡ããã«ã¯ãæç€ºçã«ãªããã€ã³ããå¿
èŠããããŸãã
MCP_SHELL_ALLOW_UNSAFE=1 mcp-shell # disables secure mode; the only tool is shell_exec
ããªã·ãŒãã«ã¹ã¿ãã€ãºããã«ã¯ãYAML èšå®ãã¡ã€ã«ãæå®ããŸãã
export MCP_SHELL_SEC_CONFIG_FILE=/path/to/security.yaml
mcp-shell
ã»ãã¥ã¢ã¢ãŒãïŒããã©ã«ãïŒâ åä»ãããŒã«ã®ã¿ã䜿çšãããã¹ãŠã®ãã¹ã working_directory å
ã«å¶éããŸãã
security:
enabled: true
working_directory: /tmp/mcp-workspace
max_execution_time: 30s
max_output_size: 1048576
run_as_user: ""
audit_log: true
# Expose file and git write tools (write_file, edit_file, mkdir, move,
# delete, git_add, git_commit, git_switch, git_restore, git_stash). Off by
# default.
writes_enabled: false
# Operator-defined scripts exposed through the run_script tool. The client
# picks a name; the argv is yours and cannot be altered.
# scripts:
# test: ["go", "test", "./..."]
# lint: ["golangci-lint", "run"]
æ¥ç¶æ¹æ³
Claude Desktop â MCP èšå®ã«è¿œå ããŸãã
{
"mcpServers": {
"shell": {
"command": "docker",
"args": ["run", "--rm", "-i", "sonirico/mcp-shell:latest"],
"env": { "MCP_SHELL_LOG_LEVEL": "info" }
}
}
}
ã«ã¹ã¿ã èšå®ã®å Žåã¯ããã¡ã€ã«ãããŠã³ãããŠç°å¢å€æ°ãèšå®ããŸãã
{
"command": "docker",
"args": ["run", "--rm", "-i", "-v", "/path/to/security.yaml:/etc/mcp-shell/security.yaml", "-e", "MCP_SHELL_SEC_CONFIG_FILE=/etc/mcp-shell/security.yaml", "sonirico/mcp-shell:latest"]
}
ããŒã«
ã»ãã¥ã¢ã¢ãŒãïŒããã©ã«ãïŒã§ã¯ã以äžã®åä»ãããŒã«ãç»é²ãããŸãã* ã¯å¿
é ãã©ã¡ãŒã¿ãŒã瀺ããŸãã
| ããŒã« | ãã©ã¡ãŒã¿ãŒ | å©çšå¯èœãªæ¡ä»¶ |
|---|---|---|
read_file | path*, offset, limit, tail | åžžæ |
list_dir | path, depth, include_hidden | åžžæ |
glob | pattern*, path, newer_than, max_results | åžžæ |
grep | pattern*, path, glob, ignore_case, context, files_only, count, max_results | åžžæ |
stat | path* | åžžæ |
diff_files | path_a*, path_b* | åžžæ |
system_info | åžžæ | |
git_status | åžžæ | |
git_log | max_count, ref, path, author, grep, since, until, oneline, follow | åžžæ |
git_diff | ref, ref_to, staged, path, stat_only, name_only | åžžæ |
git_show | ref, path, stat_only | åžžæ |
git_blame | path*, ref, line_start, line_end | åžžæ |
git_branches | all, merged | åžžæ |
git_tags | pattern | åžžæ |
git_rev_parse | ref* | åžžæ |
git_ls_files | path, untracked | åžžæ |
git_stash_list | åžžæ | |
git_remotes | åžžæ | |
write_file | path*, content*, append | writes_enabled |
edit_file | path*, old_string*, new_string*, replace_all | writes_enabled |
mkdir | path* | writes_enabled |
move | from*, to* | writes_enabled |
delete | path*, recursive | writes_enabled |
git_add | paths, all | writes_enabled |
git_commit | message*, all | writes_enabled |
git_switch | branch*, create | writes_enabled |
git_restore | paths*, staged | writes_enabled |
git_stash | action*, message | writes_enabled |
run_script | name* | scripts |
ãã¹ãŠã®ãã¹ãã©ã¡ãŒã¿ãŒã¯ working_directory ãåºæºã«è§£æ±ºãããŸãïŒã·ã³ããªãã¯ãªã³ã¯ã¯ãã©ããŸãïŒããã®ç¯å²å€ã®ãã¹ã¯æåŠãããŸããGit ã®ãã¹ãšåç
§ã¯äœçœ®åŒæ°ãšããŠæž¡ãããæ€èšŒãããŸãã- ã§å§ãŸãåç
§ã¯æåŠãããŸãããããã¯ãŒã¯ããŒã«ã¯ãããŸãããpushãfetchãclone ã¯æäŸãããŸããã
å¶éãªãã¢ãŒãïŒshell_exec 㯠MCP_SHELL_ALLOW_UNSAFE=1 ã®å Žåã«ã®ã¿å©çšã§ããŸããèšèšäžãæ€èšŒãè¡ããã« bash -c ã§ã³ãã³ããå®è¡ããŸãããã®ã¢ãŒãã§ç»é²ãããããŒã«ã¯ããã ãã§ãã
ç°å¢å€æ°
| 倿° | 説æ |
|---|---|
MCP_SHELL_SEC_CONFIG_FILE | ã»ãã¥ãªã㣠YAML ã®ãã¹ïŒçµã¿èŸŒã¿ã®ã»ãã¥ã¢ãªããã©ã«ãèšå®ãäžæžãããŸãïŒ |
MCP_SHELL_ALLOW_UNSAFE | 1ïŒãŸã㯠trueïŒãèšå®ãããšãã»ãã¥ã¢ã¢ãŒããç¡å¹ã«ããåä»ãããŒã«ã®ä»£ããã« shell_exec ãå
¬éããŸãïŒãªããã€ã³ïŒ |
MCP_SHELL_SERVER_NAME | ãµãŒããŒåïŒããã©ã«ãïŒ"mcp-shell ð"ïŒ |
MCP_SHELL_LOG_LEVEL | debugãinfoãwarnãerrorãfatal |
MCP_SHELL_LOG_FORMAT | jsonãconsole |
MCP_SHELL_LOG_OUTPUT | stdoutãstderrãfile |
éçº
make install dev-tools # deps + goimports, golines
make fmt test lint
make docker-build # build image locally
make release # binary + docker image
ã»ãã¥ãªãã£
- ããã©ã«ãïŒã»ãã¥ã¢ã¢ãŒãã§ãããµãŒããŒãåã³ãã³ãã® argv ããã¹ãŠçµã¿ç«ãŠãã¯ã©ã€ã¢ã³ããã·ã§ã«æååãæž¡ãããšã¯ãããŸãããåä»ãããŒã«ã®ã¿ãç»é²ãããŸãã
- ãã¹ã®å¶éïŒãã¹ãŠã®ãã¹ãã©ã¡ãŒã¿ãŒã¯
working_directoryãåºæºã«è§£æ±ºãããã·ã³ããªãã¯ãªã³ã¯ããã©ããŸãã解決å ãworking_directoryã®å€ã«ãªããã¹ã¯æåŠãããŸãã - Git ã®åŒ·åïŒãã¹ã¯
--ã®åŸã«ãåç §ã¯--end-of-optionsã®åŸã«æž¡ããã-ã§å§ãŸãåç §ã¯æåŠãããŸããGit ã¯GIT_CONFIG_NOSYSTEM=1ãGIT_CONFIG_GLOBAL=/dev/nullãèšå®ããcore.fsmonitorãcore.pagerãcore.hooksPathãç¡å¹åããããã§ãlog/diff/show/blame ã«--no-ext-diff --no-textconvãæå®ããŠå®è¡ãããŸãã - æå°éã®ç°å¢ïŒåããã»ã¹ã«æž¡ãããã®ã¯
PATHãHOMEãLANGã®ã¿ã§ããµãŒããŒèªèº«ã®ç°å¢å€æ°ã.envã®ã·ãŒã¯ã¬ããã¯æž¡ãããŸããã - æžã蟌ã¿ãšã¹ã¯ãªããã¯ãªããã€ã³ïŒ
writes_enabled: trueã«ãããšãã¡ã€ã«ïŒGit ã®æžã蟌ã¿ããŒã«ãå©çšå¯èœã«ãªãã空ã§ãªãscriptsããããèšå®ãããšrun_scriptãå©çšå¯èœã«ãªããŸããã©ã¡ããããã©ã«ãã§ã¯ç¡å¹ã§ãã - ç¡å¶éã¢ãŒãïŒ
MCP_SHELL_ALLOW_UNSAFE=1ãèšå®ããå Žåã«éãããŸããç»é²ãããããŒã«ã¯shell_execã®ã¿ã§ãæ€èšŒãªãã«bash -cãå®è¡ããŸããããŒã«ã«éçºã«ã¯é©ããŠããŸããããã以å€ã§ã¯å±éºã§ãã - DockerïŒroot 以å€ã®ãŠãŒã¶ãŒã§å®è¡ããããAlpine ããŒã¹ã®ã€ã¡ãŒãžã§ããæ¬çªç°å¢ã§äœ¿çšããŠãã ãããå€å±€é²åŸ¡ãšããŠãOS ãµã³ãããã¯ã¹ïŒèªã¿åãå°çš FSãã±ãŒãããªãã£ã®åé€ïŒãšã®äœµçšãæé©ã§ãã
è åšã¢ãã«ãä¿èšŒå 容ãè匱æ§å ±åã®å¯Ÿè±¡ç¯å²ã«ã€ããŠã¯ SECURITY.md ãã芧ãã ãããã¢ããã€ã¶ãªãæåºããåã«ãèªã¿ãã ããã
0.x ããã®ç§»è¡
ã»ãã¥ã¢ã¢ãŒãã§ã¯ shell_exec ã®ã³ãã³ãæååãæ€èšŒããªããªãã代ããã«åä»ãããŒã«ãå
¬éããŸããèšå®ãã¡ã€ã«ã® security: ãããã¯ã§ã¯ã次ã®ããŒãåãä»ããªããªããŸããã
| åé€ãããã㌠| 眮ãæã |
|---|---|
use_shell_execution | äžèŠã§ããåä»ãããŒã«ã¯ã·ã§ã«ãå®è¡ããŸãã |
allowed_executables | äžèŠã§ããåããŒã«ã¯ãµãŒããŒãçµã¿ç«ãŠãåºå®ã® argv ãå®è¡ããŸã |
allowed_commands | äžèŠã§ããäžèšãšåãã§ã |
blocked_commands | äžèŠã§ããäžèšãšåãã§ã |
blocked_patterns | äžèŠã§ããäžèšãšåãã§ã |
ãããã®ããŒã®ãããããèšå®ãããŸãŸèšå®ãã¡ã€ã«ãèªã¿èŸŒããšãããŒåãå«ããšã©ãŒãçºçããŠèµ·åã«å€±æããŸãããã¬ã¬ã·ãŒã¢ãŒããã¯ãªããªããsecurity-legacy.yaml ã®ãµã³ãã«ããããŸãããçã®ã·ã§ã«ã¢ã¯ã»ã¹ãå¿
èŠãªå Žåã¯ãMCP_SHELL_ALLOW_UNSAFE=1 ãèšå®ãããš shell_exec ãåã³å©çšå¯èœã«ãªããŸãããã®ããŒã«ã¯ããã¯ã security: ãããã¯ã«ããå¶éãäžååããŸããã
è²¢ç®
ãã©ãŒã¯ããŠãã©ã³ããäœæããmake fmt test ãå®è¡ããŠãããPR ãäœæããŠãã ããã
ã³ã¡ã³ã
MCP ã¯åããŠã§ããïŒ
ãããã³ã«ã®æŠèŠããæåã®ãµãŒããŒã®å°å ¥ãŸã§ãããããçåã«ãŸãšããŠçããŸãã
AI ã¢ããªã±ãŒã·ã§ã³ãå€éšã®ããŒã«ãããŒã¿ãœãŒã¹ã«çµ±äžçãªæ¹æ³ã§æ¥ç¶ããããã®ãªãŒãã³ãªãããã³ã«ã§ããã¯ã©ã€ã¢ã³ãã¯ã¢ãã«ãšã®å¯Ÿè©±ãæ ããMCP ãµãŒããŒã¯ããŒã«ã»ãªãœãŒã¹ã»ããã³ãããã³ãã¬ãŒããæäŸããŸããæšæºã¡ãã»ãŒãžã§ããåãããããã1 ã€ã®ãµãŒããŒãè€æ°ã®ã¯ã©ã€ã¢ã³ãã§åå©çšã§ããŸãã