mcp-shell-server

mcp-shell-server:通过 MCP 协议安全执行 shell 命令,扩展 AI 模型能力。

mcp-shell-server
mcp-shell-server能力展示

mcp-shell-server 解决方案概述

MCP Shell Server 是一款基于模型上下文协议 (MCP) 的服务器,旨在实现 AI 模型与外部系统的安全交互。它允许 AI 模型通过执行预定义的、经过白名单验证的 Shell 命令,来安全地访问和操作外部资源。该服务器支持标准输入 (stdin),并返回标准输出 (stdout)、标准错误 (stderr)、退出状态和执行时间等详细信息,为 AI 模型提供全面的执行反馈。通过严格的命令白名单和 Shell 操作符验证,它有效防止了 Shell 注入等安全风险。开发者可以通过简单的 pip 命令安装,并轻松集成到现有的 MCP 客户端中,例如 Claude.app。MCP Shell Server 的核心价值在于为 AI 模型提供了一种安全、可控的方式来扩展其功能,连接现实世界的数据和服务,极大地拓宽了 AI 应用的边界。

mcp-shell-server 核心能力

安全的命令执行

mcp-shell-server 的核心在于它提供了一种安全的方式来执行 shell 命令。它通过白名单机制限制了可以执行的命令,只有在 ALLOW_COMMANDS 环境变量中明确列出的命令才能被执行。这种方法有效地防止了恶意命令的注入,确保了 AI 模型只能访问预先批准的系统功能。服务器还会验证 shell 操作符(如 ;, &&, ||, |)之后的命令,进一步增强了安全性。所有命令都直接执行,不经过 shell 解释器,从而避免了潜在的 shell 注入风险。

例如,一个 AI 模型需要列出 /tmp 目录下的文件。开发者可以在 ALLOW_COMMANDS 中添加 ls 命令,然后 AI 模型可以通过 mcp-shell-server 安全地执行 ls -l /tmp 命令,而无需担心执行其他未授权的命令。

标准输入支持

mcp-shell-server 允许通过标准输入(stdin)向命令传递数据。这个特性使得 AI 模型可以与需要输入数据的命令行工具进行交互。通过将数据传递给 stdin,AI 模型可以动态地控制命令的行为,并根据输入数据获得不同的结果。这种能力极大地扩展了 AI 模型与外部系统交互的灵活性。

例如,AI 模型可以使用 cat 命令读取 stdin 中的内容。在请求中,command 字段设置为 ["cat"]stdin 字段设置为 "Hello, World!"。mcp-shell-server 会将 "Hello, World!" 传递给 cat 命令,cat 命令会将这段文本输出到 stdout,最终 AI 模型可以获取到 "Hello, World!" 这个结果。

超时控制

为了防止长时间运行的命令耗尽资源或导致系统不稳定,mcp-shell-server 提供了超时控制功能。开发者可以为每个命令设置最大执行时间(以秒为单位)。如果命令在指定时间内没有完成执行,服务器会强制终止该命令,并返回一个错误信息。这个特性对于处理可能出现死循环或无限等待的命令非常有用。

例如,AI 模型需要执行一个可能需要较长时间才能完成的数据处理脚本。开发者可以将 timeout 设置为 30 秒。如果脚本在 30 秒内没有完成,mcp-shell-server 会自动终止该脚本,并返回一个错误信息,从而避免了脚本长时间占用系统资源。

详细的执行结果

mcp-shell-server 不仅执行命令,还返回详细的执行结果,包括标准输出(stdout)、标准错误输出(stderr)、退出状态码(status)和执行时间(execution_time)。这些信息对于 AI 模型理解命令执行的结果至关重要。通过分析 stdout 和 stderr,AI 模型可以了解命令是否成功执行以及执行过程中是否出现错误。退出状态码可以指示命令执行的总体结果,而执行时间可以帮助 AI 模型评估命令的性能。

例如,AI 模型执行一个文件查找命令,mcp-shell-server 返回 stdout 中包含找到的文件列表,stderr 中包含任何错误信息,status 为 0 表示命令成功执行,execution_time 表示命令执行所花费的时间。AI 模型可以根据这些信息来判断文件查找是否成功,并进一步处理找到的文件。

技术实现

mcp-shell-server 使用 Python 的 subprocess 模块来执行 shell 命令。为了确保安全性,服务器在执行命令之前会进行多重验证,包括检查命令是否在白名单中,以及验证 shell 操作符之后的命令。服务器还使用 subprocess.Popen 函数来创建子进程,并使用 communicate 方法来与子进程进行交互,从而获取 stdout、stderr 和退出状态码。超时控制通过 subprocess.Popentimeout 参数实现。这种实现方式既保证了安全性,又提供了丰富的功能。