在E2B沙箱中安全地运行MCP (Model Context Protocol)服务器。
e2b-mcp提供了一种简单的方法,在隔离的云环境中执行MCP服务器,使不信任的工具和代码能够安全执行。无需直接在主机系统上运行MCP服务器,而是可以在具有自动资源管理和清理的E2B安全沙箱中运行它们。
我们构建了e2b-mcp,以便Cased可以代表用户运行MCP服务器,并与我们的DevOps代理集成。但e2b-mcp有许多使用场景:
uv pip install e2b-mcp
E2B_API_KEYexport E2B_API_KEY="your_api_key_here"
# 添加一个GitHub MCP服务器
e2b-mcp server add github \
--command "npx -y @modelcontextprotocol/server-github" \
--env GITHUB_PERSONAL_ACCESS_TOKEN=your_token
# 发现可用工具
e2b-mcp tools list github
# 执行一个工具
e2b-mcp tools execute github search_repositories \
--params '{"query": "python", "per_page": 5}'
# 快速一次性执行(不保存配置)
e2b-mcp quick "npx -y @modelcontextprotocol/server-filesystem /tmp" \
list_directory --param path=/tmp
import asyncio
from e2b_mcp import E2BMCPRunner, ServerConfig
async def main():
# 创建运行器
runner = E2BMCPRunner()
# 添加MCP服务器
runner.add_server(ServerConfig(
name="filesystem",
command="npx -y @modelcontextprotocol/server-filesystem /tmp",
description="文件系统操作"
))
# 发现工具
tools = await runner.discover_tools("filesystem")
print(f"发现 {len(tools)} 个工具")
# 执行一个工具
result = await runner.execute_tool(
"filesystem",
"write_file",
{"path": "/tmp/example.txt", "content": "Hello World!"}
)
print(result)
# 运行异步代码
asyncio.run(main())
# 添加新的MCP服务器配置
e2b-mcp server add <name> --command "<command>" [选项]
# 列出所有已配置的服务器
e2b-mcp server list [--json]
# 移除服务器配置
e2b-mcp server remove <name> [--yes]
添加服务器选项:
--command:运行MCP服务器的命令(必需)--env KEY=VALUE:环境变量(可多次使用)--package:要安装的Python包--description:服务器描述--timeout:超时时间(分钟,默认:10)# 列出已配置服务器的工具
e2b-mcp tools list <server_name> [--json]
# 执行一个工具
e2b-mcp tools execute <server_name> <tool_name> [选项]
执行工具选项:
--params:工具参数作为JSON字符串--param key=value:单个参数(可多次使用)--json:输出原始JSON响应# 不保存服务器配置的情况下执行
e2b-mcp quick "<command>" <tool_name> [选项]
快速执行选项:
--params:工具参数作为JSON字符串--param key=value:单个参数--env KEY=VALUE:环境变量--json:输出原始JSON响应# 显示当前配置
e2b-mcp config [--show]
# 编辑配置文件
e2b-mcp config --edit
# 重置所有配置
e2b-mcp config --reset
# GitHub集成
export GITHUB_TOKEN="your_token"
e2b-mcp server add github \
--command "npx -y @modelcontextprotocol/server-github" \
--env GITHUB_PERSONAL_ACCESS_TOKEN=$GITHUB_TOKEN
e2b-mcp tools execute github search_repositories \
--params '{"query": "e2b", "per_page": 3}'
# 文件系统操作
e2b-mcp server add fs \
--command "npx -y @modelcontextprotocol/server-filesystem /tmp"
e2b-mcp tools execute fs write_file \
--param path=/tmp/test.txt \
--param content="Hello CLI!"
e2b-mcp tools execute fs read_file \
--param path=/tmp/test.txt
# 使用快速执行进行一次性操作
e2b-mcp quick "npx -y @modelcontextprotocol/server-filesystem /tmp" \
list_directory --param path=/tmp --json
配置存储在~/.e2b-mcp/servers.json中,并可在不同环境中共享。
from e2b_mcp import ServerConfig
# 方法1:使用ServerConfig类
config = ServerConfig(
name="my_server",
command="python -m my_mcp_server --stdio",
package="my-mcp-server-package", # 可选
description="我的自定义MCP服务器",
timeout_minutes=10,
env={"DEBUG": "1"} # 可选环境变量
)
runner.add_server(config)
# 方法2:使用字典
runner.add_server_from_dict("my_server", {
"command": "python -m my_mcp_server --stdio",
"package": "my-mcp-server-package",
"description": "我的自定义MCP服务器",
"timeout_minutes": 10,
"env": {"DEBUG": "1"}
})
用于在E2B沙箱中管理MCP服务器的主要类。
__init__(api_key: Optional[str] = None)使用E2B API密钥初始化运行器。
add_server(config: ServerConfig) -> None添加MCP服务器配置。
add_server_from_dict(name: str, config_data: Dict[str, Any]) -> None从字典添加MCP服务器配置。
list_servers() -> List[str]列出所有已配置的服务器名称。
async discover_tools(server_name: str) -> List[Tool]从MCP服务器发现工具。
async execute_tool(server_name: str, tool_name: str, params: Dict[str, Any]) -> Dict[str, Any]在MCP服务器上执行一个工具。
execute_tool_sync(server_name: str, tool_name: str, params: Dict[str, Any]) -> Dict[str, Any]execute_tool的同步封装。
async create_session(server_name: str) -> AsyncContextManager[Session]创建一个管理的MCP会话(高级用法)。
import asyncio
from e2b_mcp import E2BMCPRunner
async def main():
runner = E2BMCPRunner()
# 添加一个简单的测试服务器
runner.add_server_from_dict("test", {
"command": "python /tmp/test_mcp_server.py",
"description": "带有基本工具的测试服务器"
})
# 执行工具
time_result = await runner.execute_tool("test", "get_time", {"format": "iso"})
echo_result = await runner.execute_tool("test", "echo", {"text": "Hello!"})
print(f"时间: {time_result}")
print(f"回声: {echo_result}")
asyncio.run(main())
from e2b_mcp import E2BMCPRunner
runner = E2BMCPRunner()
runner.add_server_from_dict("test", {
"command": "python /tmp/test_mcp_server.py"
})
# 同步执行
result = runner.execute_tool_sync("test", "get_time", {"format": "readable"})
print(result)
async def advanced_usage():
runner = E2BMCPRunner()
runner.add_server_from_dict("filesystem", {
"command": "python -m mcp_server_filesystem --stdio",
"package": "mcp-server-filesystem"
})
# 手动管理会话生命周期
async with runner.create_session("filesystem") as session:
print(f"会话ID: {session.session_id}")
print(f"沙箱ID: {session.sandbox_id}")
# 退出上下文时会话自动清理
e2b-mcp与支持标准MCP协议的任何MCP服务器兼容。一些流行的服务器包括:
e2b-mcp提供了多个安全层:
from e2b_mcp import E2BMCPRunner, MCPError
try:
runner = E2BMCPRunner()
result = await runner.execute_tool("不存在的", "工具", {})
except MCPError as e:
print(f"MCP操作失败: {e}")
except ValueError as e:
print(f"配置错误: {e}")
# 克隆仓库
git clone https://github.com/cased/e2b-mcp.git
cd e2b-mcp
# 以开发模式安装
pip install -e ".[dev]"
# 使用提供的脚本自动格式化和检查代码
./scripts/format
# 或手动运行各个工具
black .
ruff check .
项目在scripts/目录中包含了一些有用的开发脚本:
./scripts/format)自动格式化和检查代码库:
black进行代码格式化ruff check --fix --unsafe-fixes进行检查和自动修复ruff format进行导入排序mypy进行类型检查./scripts/format
./scripts/release)处理完整的专业发布过程,包括全面的预飞行检查:
pyproject.toml匹配发布前提条件:
# 1. 设置PyPI凭据(必需)
export TWINE_USERNAME=__token__
export TWINE_PASSWORD='your-pypi-api-token'
# 2. 安装所需工具
pip install build twine
# 3. 可选:安装GitHub CLI以创建发布
brew install gh # 或适用于您系统的等效命令
发布流程:
# 1. 手动更新pyproject.toml中的版本
# version = "0.2.0"
# 2. 提交版本更改
git add pyproject.toml
git commit -m "升级版本至0.2.0"
# 3. 使用相同的版本运行发布脚本
./scripts/release 0.2.0
发布脚本做了什么:
pyproject.toml匹配python -m build构建包twine upload发布到PyPIv0.2.0)安全特性:
该包包括单元测试和集成测试:
运行不需要E2B API访问的快速单元测试:
# 仅运行单元测试(快速)
pytest tests/test_basic.py
# 使用详细输出运行
pytest tests/test_basic.py -v
运行创建真实E2B沙箱的综合集成测试:
# 设置E2B API密钥(集成测试需要)
export E2B_API_KEY="your_api_key"
# 运行集成测试
pytest tests/test_integration.py -v
# 运行所有测试,包括集成测试
pytest -v
# 仅运行单元测试(不需要E2B API密钥)
pytest -m "not integration"
# 仅运行集成测试(需要E2B API密钥)
pytest -m integration
# 运行所有测试
pytest
# 运行覆盖率测试
pytest --cov=e2b_mcp
# 运行特定测试
pytest tests/test_integration.py::TestE2BMCPIntegration::test_tool_discovery -v
注意:集成测试创建真实的E2B沙箱,可能需要几分钟才能完成。它们需要有效的E2B API密钥。
# 设置E2B API密钥
export E2B_API_KEY="your_api_key"
# 运行基本示例
python examples/basic_usage.py
欢迎贡献!请随时提交Pull Request。
MIT许可证 - 详情见LICENSE文件。