隔离器MCP服务器
isolator-mcp 是一个 模型上下文协议(MCP) 用TypeScript编写的服务器。它充当嵌入式系统的包装器 isolator Go CLI工具,提供可通过MCP访问的安全代码执行沙盒。
LLM应用程序(MCP主机)可以连接到此服务器并使用其 execute_code 该工具用于安全运行直接提供或从预定义代码段文件加载的Python、Go或JavaScript代码段。
特性
- 提供
execute_codeMCP工具。 - 支持执行直接提供的代码(
language,entrypoint_code)或通过命名片段(snippet_name). - 支持多种语言(Python、Go、JavaScript、可配置)。
- 使用嵌入式
isolatorGo CLI(isolator-cli/)用于安全的Docker容器执行。 - 通过以下方式配置安全默认值(超时、资源限制、网络)
isolator_config.json. - 管理主机上用于代码执行的临时目录。
- 处理文件复制到容器中(通过指示
isolatorCLI)。 - 通过MCP设置返回结构化结果(stdout、stderr、status)
isError: true工具级故障。
先决条件
- Docker: 容器创建和执行所需
isolator-cli.确保Docker守护进程正在运行。 - 去: 需要构建嵌入式
isolator-cli去二进制。 - Node.js和npm: 需要安装依赖项、构建和运行
isolator-mcpTypeScript服务器。
安装
- 构建
isolator转到CLI: 导航到嵌入式Go CLI目录并构建二进制文件:
cd isolator-cli
go build -o isolator main.go
cd .. 这将创建 ./isolator-cli/isolator 服务器所需的可执行文件。
- 配置
isolator-mcp:
- 编辑 isolator_config.json:更新 isolatorPath 指向所构建二进制文件的绝对路径(例如。, /Users/ompragash/Documents/Cline/MCP/isolator-mcp/isolator-cli/isolator).调整默认限制、容器工作目录、语言图像或 promptsDir (用于片段)位置(如果需要)。 - 确保 prompts 目录存在(默认值: ./prompts).添加代码片段文件(例如。, hello_world.py).文件名库(例如。, hello_world)被用作 snippet_name.
- 安装服务器依赖关系: 导航到主目录(
isolator-mcp)并运行:
npm install- 构建服务器: 编译TypeScript代码:
npm run build这将在以下位置创建可执行脚本 build/index.js.
- 配置MCP主机: 将服务器添加到MCP客户端的设置文件中(例如。,
cline_mcp_settings.json对于VS代码扩展):
{
"mcpServers": {
"isolator": {
"command": "node",
"args": ["/Users/ompragash/Documents/Cline/MCP/isolator-mcp/build/index.js"],
"env": {},
"disabled": false,
"autoApprove": []
}
}
}*(调整路径 args 如有必要)*MCP主机应自动检测并启动服务器。
重要提示: 确保中指定的Docker镜像 isolator_config.json (例如。, python:3.11-alpine, golang:1.21-alpine)预先使用 docker pull The isolator 该工具不会自动下载丢失的图像。
本地开发/测试
要在本地运行服务器进行开发或测试(不通过MCP主机设置安装):
- 构建Go命令行界面: 确保
isolatorGo CLI是在其子目录中构建的:
cd isolator-cli
go build -o isolator main.go
cd ..- 构建TS服务器: 在这个主目录中(
isolator-mcp),跑npm install和npm run build. - 配置: 确保
isolator_config.json正确指向已建./isolator-cli/isolator二进制通过isolatorPath键(使用绝对路径)。 - 运行服务器: 使用Node直接执行构建的服务器:
node build/index.js服务器将启动,通过stdio连接,并打印日志(包括 console.error 消息来自 index.ts)到控制台。
- 交互(手动): 您可以手动发送JSON-RPC消息(例如。,
tools/list,tools/call)以测试服务器的响应。工具如@modelcontextprotocol/inspector也可能有所帮助(npm run inspector).
*(在依赖MCP主机通过设置文件启动服务器之前,请记住停止此手动运行的服务器。)*
架构与流程
- MCP主机请求: LLM要求MCP主机(例如VS代码扩展)调用
isolator服务器的execute_code带有论据的工具。 - 服务器处理(
index.ts):
- 收到 tools/call 通过stdio请求。 - 使用Zod验证参数。 - 从加载配置 isolator_config.json. - 确定代码源: - 如果 snippet_name 提供,从配置的文件中读取相应的文件 promptsDir 并根据文件扩展名确定语言。 - 如果 entrypoint_code 和 language 直接使用它们。 - 在主机上创建临时目录。 - 写入入口点代码和任何 additional_files 进入临时目录。 - 为嵌入式系统构造命令行参数 isolator Go CLI,包括配置中的安全标志和临时目录的路径。 - 产卵 isolator 使用Node.js的进程 child_process.spawn.
- Go CLI执行(
isolator-cli/isolator run):
- 解析标志(包括新的 --env 旗)。 - 创建临时目录内容的tar流。 - 使用Docker SDK创建具有指定映像、资源限制和环境变量的容器(来自 --env),以及安全设置(无绑定挂载)。 - 用途 CopyToContainer 将tar流复制到容器的工作目录中。 - 启动执行所请求命令的容器(例如。, python /workspace/hello_world.py). - 等待完成,捕获stdout/stderr。 - 移除容器。 - 将结果(状态、输出等)作为JSON打印到其stdout。
- 服务器结果处理(
index.ts):
- 读取已完成的JSON输出 isolator 进程stdout。 - 解析JSON结果。 - 格式化 CallToolResult 对于MCP,结合stdout/stderr和设置 isError 如果Go CLI报告了不成功状态。 - 将结果发送回MCP主机。 - 清理主机上的临时目录。
- MCP主机响应: 将结果转发回LLM,然后LLM为用户制定响应。
execute_code 工具
描述
在安全、隔离的容器环境中执行代码(Python、Go、JavaScript)。
输入模式(arguments)
language(字符串,可选):编程语言(例如“python”、“go”、“javascript”)。如果需要snippet_name未提供。entrypoint_code(string,可选):要执行的主要代码内容。如果需要snippet_name未提供。entrypoint_filename(string,可选):主代码的文件名(例如“main.py”、“script.js”)。如果未提供,则基于语言的默认值。additional_files(array,可选):对象数组,每个对象具有:
- filename (string,必填):附加文件的名称。 - content (string,必填):附加文件的内容。
snippet_name(字符串,可选):位于配置文件中的预定义代码段文件的名称(不带扩展名)promptsDir.相互排斥language和entrypoint_code.
约束: 要么 snippet_name 或两者 language 和 entrypoint_code 必须提供。
输出(CallToolResult)
content:一个包含单个TextContent对象。
- type:“文本” - text:一个包含执行时stdout和stderr组合的字符串,格式如下:
--- stdout ---
[Actual stdout output]
--- stderr ---
[Actual stderr output]如果发生错误 *在...期间* 执行(非零退出代码,超时),文本将加上 Execution Failed (status): [error message]\n\n.
isError(布尔值):true如果执行状态由isolatorCLI为“错误”或“超时”,false否则。
*(协议级错误,如无效参数或无法启动进程,将导致标准MCP错误响应,而不是 CallToolResult)*.
