mcpField
M
mcp-shell 🐚

mcp-shell 🐚

本地服务
github.com/sonirico开发工具1085 周前更新

关于 mcp-shell 🐚

mcp-shell 是一个用 Go 编写的 MCP 服务,可让 LLM 在受控条件下运行 shell 命令。它默认进入安全模式,仅注册带类型的工具,并将路径限制在指定工作目录内。适合希望对 AI 可执行的操作进行审计和约束的用户。

主要功能

  1. 01默认安全模式,仅提供带类型的工具
  2. 02路径限制在 working_directory 内
  3. 03提供文件读取、grep、glob 与 git 查询工具
  4. 04写操作与脚本功能需显式开启
  5. 05支持 Docker 运行与 YAML 安全配置

适用场景

  1. 01让 LLM 在指定目录内检索代码与查看 git 历史
  2. 02在开启写入选项后允许 AI 进行受控的文件修改与提交
  3. 03在本地开发环境中以 MCP_SHELL_ALLOW_UNSAFE 运行原始 shell

MCP 相关

该项目是 MCP 服务,向 MCP 客户端暴露文件、搜索、git 等类型化工具;在不安全模式下则只暴露 shell_exec 工具。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"shell": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"sonirico/mcp-shell:latest"
]
}
}
}
启动命令docker run -i --rm sonirico/mcp-shell:latest

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
ocisonirico/mcp-shell:latest

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

mcp-shell

Trust Score glama

可运行 shell 命令的 MCP 服务。你的大模型可以使用一个工具;你可以控制运行哪些命令,以及如何运行。

基于 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 写入和由运维人员定义的脚本。不会提供原始 shell 命令。只有在需要更改以下默认设置时,才需要配置文件。若要不受限制地运行,必须明确选择启用:

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_filepath*, offset, limit, tail始终可用
list_dirpath, depth, include_hidden始终可用
globpattern*, path, newer_than, max_results始终可用
greppattern*, path, glob, ignore_case, context, files_only, count, max_results始终可用
statpath*始终可用
diff_filespath_a*, path_b*始终可用
system_info始终可用
git_status始终可用
git_logmax_count, ref, path, author, grep, since, until, oneline, follow始终可用
git_diffref, ref_to, staged, path, stat_only, name_only始终可用
git_showref, path, stat_only始终可用
git_blamepath*, ref, line_start, line_end始终可用
git_branchesall, merged始终可用
git_tagspattern始终可用
git_rev_parseref*始终可用
git_ls_filespath, untracked始终可用
git_stash_list始终可用
git_remotes始终可用
write_filepath*, content*, appendwrites_enabled
edit_filepath*, old_string*, new_string*, replace_allwrites_enabled
mkdirpath*writes_enabled
movefrom*, to*writes_enabled
deletepath*, recursivewrites_enabled
git_addpaths, allwrites_enabled
git_commitmessage*, allwrites_enabled
git_switchbranch*, createwrites_enabled
git_restorepaths*, stagedwrites_enabled
git_stashaction*, messagewrites_enabled
run_scriptname*scripts

每个路径参数都会基于 working_directory 解析(跟随符号链接);任何指向其外部的路径都会被拒绝。Git 路径和引用会按位置传递并经过验证:以 - 开头的引用会被拒绝。没有网络工具;不提供 push、fetch 和 clone。

不受限制模式:只有在设置 MCP_SHELL_ALLOW_UNSAFE=1 时才会启用 shell_exec;它会按设计通过 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_LEVELdebug、info、warn、error、fatal
MCP_SHELL_LOG_FORMATjson、console
MCP_SHELL_LOG_OUTPUTstdout、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;客户端不会提供 shell 字符串。只注册类型化工具。
  • 路径限制:每个路径参数都会基于 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:基于 Alpine,以非 root 用户运行。请在生产环境中使用。最好配合操作系统沙箱(只读文件系统、移除特权),实现纵深防御。

威胁模型、保证内容以及漏洞报告的受理范围见 SECURITY.md。提交安全公告前请先阅读。


从 0.x 迁移

安全模式不再验证 shell_exec 命令字符串,而是改为开放类型化工具。配置文件中的 security: 块不再接受以下内容:

已移除的键替代方案
use_shell_execution无需替代;类型化工具不会调用 shell
allowed_executables无需替代;每个工具都会运行由服务构建的固定 argv
allowed_commands无需替代;同上
blocked_commands无需替代;同上
blocked_patterns无需替代;同上

如果加载的配置文件仍设置了其中任一项,启动时会报错并指出对应的键。现在已没有“旧版模式”,也不再提供 security-legacy.yaml 示例。如果需要原始 shell 访问权限,请设置 MCP_SHELL_ALLOW_UNSAFE=1 以恢复 shell_exec;此时它不再受 security: 块的任何限制。


贡献

Fork 项目、创建分支、运行 make fmt test,然后提交 PR。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。