返回市场
麦克佩-丹诺沙箱

麦克佩-丹诺沙箱

作者:bewt8510 星标更新:2025-05-03

项目介绍

Deno Sandbox MCP Server

npm 版本

这是一个MCP服务器,允许你在本地机器上使用Deno®沙箱运行TypeScript、JavaScript和Python代码。该服务器提供了一个受控环境来执行代码,并具有明确的权限控制(即它可以访问哪些网站,可以读取哪些文件)。

注意: 本项目与Deno Land LLC没有任何关联。我只是Deno®运行时的一个粉丝。“Deno”是Deno Land LLC的注册商标。

cowsay 牛说hello的截图

如何以及为什么

大型语言模型(LLMs)擅长编写代码,如果LLM能够自行运行代码进行测试会更有帮助。问题是它们不能被信任不会造成损害,特别是如果恶意的人可以通过提示注入欺骗LLM。例如,你无辜地要求一个LLM总结一封邮件,而有人在邮件中告诉你的LLM运行删除所有文件并发送所有比特币给他们的代码。

沙箱对LLM编写的代码施加了限制。例如,我们可以说它只能更改特定文件夹中的文件,或者联系特定的可信网站。

每个操作系统创建沙箱的方法不同。有些更安全,有些更容易设置。这个项目在这两者之间取得了平衡。

我们的沙箱使用Deno,后者使用Chrome用来阻止恶意网站损害计算机的技术。这让你可以运行Typescript和JavaScript,并且依赖于很少量的我的代码

一些勤劳的人还制作了Pyodide,它可以在Web浏览器中运行Python。我们使用它来在相同的Deno环境中运行Python

你可以通过传递参数来控制权限,这些参数直接传递给Deno运行时。你可以配置以下内容:

  • 可以读取哪些文件(例如你的代码库)
  • 哪些文件可以写入
  • 拒绝访问特定文件(例如SSH密钥)
  • 可以访问哪些网站或IP地址

非功能特性

我希望保持这个代码库比其他替代方案更简单易读,这样人们可以自己审核它。简洁性是一个重要的安全特性;了解它的人越多,发现错误的人就越多。

我还选择牺牲一些性能,不复用pyodide环境。这会产生一些小的开销,但使实现更容易理解。

启发

使用Claude Desktop

此MCP应能与一系列MCP客户端一起工作。

你需要安装Node.jsDeno之一。不需要同时安装两个。

要使用此MCP服务器与Claude Desktop,将其添加到您的claude_desktop_config.json中:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

如果你已安装Deno

{
  "mcpServers": {
    "denoSandbox": {
      "command": "deno",
      "args": [
        "run",
        "npm:mcp-deno-sandbox",
        "--allow-net=icanhazip.com,example.com",
      ]
    }
  }
}

如果你已安装Node.js 则Deno将自动安装

{
  "mcpServers": {
    "denoSandbox": {
      "command": "npx",
      "args": [
        "mcp-deno-sandbox",
        "--allow-net=icanhazip.com,example.com"
      ]
    }
  }
}

你可以鼓励你的LLM使用这些工具。还有一个资源定义了沙箱中可用的权限。你可以建议你的LLM检查它拥有的权限,如果它不断收到权限拒绝错误。

权限示例

你需要在运行时设置权限;如果你更改了它们,需要重新启动服务器。

权限与Deno®权限相同,并且只是传递过来。

示例

  1. 网络访问

    • 宽松:--allow-net
      • 允许所有网络访问
    • 限制:--allow-net=api.github.com,example.com
      • 仅允许访问特定域名的网络访问
  2. 文件系统

    • 宽松:--allow-read --allow-write
      • 完全文件系统访问
      • 折衷:流氓LLM可以访问你的点文件和其他任何你可以访问的内容(包括它可以编辑以给自己更多权限的文件)
    • 限制:--allow-read=/tmp --allow-write=/tmp
      • 仅限特定目录
      • 对处理隔离文件很有用

完整的权限列表和详细文档,请参阅Deno®安全

安全注意事项

此服务器使用启动服务器时指定的权限运行代码。这些权限传递给Deno®运行时。

小心启用的权限。沙箱完全被破坏的情况有:

  • 给予广泛的FFI或执行权限
  • 允许写入管理服务器权限的文件(例如claude_desktop_config.json

你也应该仔细考虑读取敏感点文件的权限(例如包含AWS、NPM、OpenAI凭证的文件);特别是如果你已经授予了网络访问权限。

记住,恶意的人可以使用提示注入来欺骗你偏好的语言模型,在你的计算机上运行有害的东西。也许他们可以在你无法阅读的PDF中隐藏一些不可见的文字,或者在你要求它总结的长文档中间。

Deno®有一些额外的建议,如果你想为不受信任的代码提供更多的隔离。

已知问题

Python

  • 由于某种原因,你不能使用open(PATH, 'w')写入文件。它适用于读取文件,我不知道为什么写入不起作用。我在工具描述中包含了如何绕过这个问题的提示。你也可以指出你的LLM可以运行import js; js.fs.writeFileSync(PATH, CONTENT)。这在相同的Deno沙箱中运行,但有点麻烦。
  • 如果你给予-A-R-W权限,很难确定哪些文件应该挂载到pyodide环境中。目前,我只猜测你的主目录和/tmp。你也可以显式指定其他目录,这些目录将被挂载。
  • 我不确定这种挂载在Windows上是否能正确工作。

开发

# 克隆仓库
git clone https://github.com/bewt85/mcp-deno-sandbox.git
cd mcp-deno-sandbox

# 安装依赖
npm install

检查代码格式和类型:

npm run checks

自动修复一些问题:

npm run fix

使用MCP Inspector测试:

npx @modelcontextprotocol/inspector ./node_modules/.bin/ts-node src/index.ts

尝试这些示例在Inspector中:

  1. 基本算术(无需权限):

    console.log(1 + 2);
    
  2. 网络访问(需要--allow-net):

    fetch('https://icanhazip.com').then(response => response.text()).then(ip => console.log(`您的IP是: ${ip.trim()}`));
    
  3. 文件系统访问(需要--allow-read):

    const text = Deno.readTextFileSync('/path/to/file.txt');
    console.log(text);
    

贡献

我没有太多空闲时间,所以无法参与大多数功能请求/贡献。如果你想要添加某些东西,最好分叉仓库。抱歉。

发布

当你想发布时:

  • package.json中的版本更新为X.Y.Z
  • 合并你的更改
  • 在GitHub上创建vX.Y.Z版本
  • 等待它自动部署到NPM

许可证

MIT