modal-workspace-mcp
modal-workspace-mcp
Удалённый MCP-мост, который позволяет GitHub Copilot, Copilot CLI и другим MCP-клиентам использовать ваш аккаунт Modal для выполнения Linux-команд, установки зависимостей, Git-операций, GPU-задач и вызовов развёрнутых Modal-функций.
Этот проект намеренно является мостом, а не IDE или размещённым рабочим пространством разработчика.
GitHub Copilot / MCP client
|
| Streamable HTTP MCP + Bearer token
v
https://...modal.run/mcp/
|
v
modal-workspace-mcp gateway
|
+--> Modal Sandbox --> apt / git / curl / uv / pip / GPU / Internet
|
+--> deployed Modal FunctionИнструменты V1
sandbox_create— создаёт автономную Sandbox с настраиваемыми CPU/RAM/GPU, apt/pip-пакетами, сетевой политикой, Secrets и Volumes из белого списка.sandbox_exec— выполняет командыbash -lcи возвращает код выхода/stdout/stderr.sandbox_status— проверяет, запущена ли Sandbox.sandbox_list— перечисляет Sandbox, управляемые этим MCP.sandbox_snapshot— создаёт снимок файловой системы Sandbox в Modal Image.sandbox_terminate— завершает работу Sandbox.function_call— вызывает уже развёрнутую Modal Function по имени приложения/функции.app_get— определяет именованное Modal App и URL панели управления.app_list— перечисляет Modal Apps через официальный CLImodal app list --json.
Related MCP server: MCP4Modal Sandbox
Почему это решает проблему DNS в GitHub-контейнере
GitHub-агент не выполняет apt, curl, git clone или pip локально. Он лишь отправляет MCP HTTP-запрос к вашему Modal endpoint. Фактические сетевые операции и операции в оболочке выполняются внутри Modal Sandbox.
1. Настройте токен шлюза
Сгенерируйте случайный токен локально:
python -c "import secrets; print(secrets.token_urlsafe(48))"Создайте Modal Secret с именем modal-workspace-mcp-auth, содержащий это значение:
modal secret create modal-workspace-mcp-auth MODAL_WORKSPACE_MCP_TOKEN='<generated-token>'Тот же Secret шлюза может также содержать несекретную конфигурацию, например, белые списки, чтобы развёрнутая Function получала их как переменные окружения.
Не коммитьте токен.
2. Необязательно: разрешите использование Secrets и Volumes в Sandbox
MCP по умолчанию запрещает монтирование произвольных Secret/Volume. Если они вам нужны, настройте белые списки на gateway Function.
Переменные окружения, поддерживаемые сервером:
MODAL_WORKSPACE_ALLOWED_SECRETS=github-agent,huggingface-agent
MODAL_WORKSPACE_ALLOWED_VOLUMES=model-cache,workspace-cache
MODAL_WORKSPACE_SANDBOX_APP=modal-workspace-sandboxes
MODAL_WORKSPACE_MAX_OUTPUT_CHARS=120000Например, создайте учётные данные как отдельные Modal Secrets:
modal secret create github-agent GH_TOKEN="$GH_TOKEN"
modal secret create huggingface-agent HF_TOKEN="$HF_TOKEN"Затем обновите gateway Secret, чтобы эти имена Secret были явно включены в белый список (их значения по-прежнему хранятся в отдельных Secrets):
modal secret create modal-workspace-mcp-auth \
MODAL_WORKSPACE_MCP_TOKEN='<generated-token>' \
MODAL_WORKSPACE_ALLOWED_SECRETS='github-agent,huggingface-agent'3. Развёртывание
При локальной аутентификации Modal:
uv sync
uv run modal deploy modal_app.pyModal выведет публичный URL Web Function. MCP endpoint — это этот URL плюс /mcp/.
Проверка работоспособности:
curl https://YOUR-ENDPOINT.modal.run/healthzДля MCP Inspector:
npx @modelcontextprotocol/inspectorИспользуйте Streamable HTTP, URL:
https://YOUR-ENDPOINT.modal.run/mcp/и заголовок:
Authorization: Bearer <generated-token>4. Облачный агент GitHub Copilot
Настройте эти значения Agents в целевом GitHub-репозитории:
COPILOT_MCP_MODAL_URL=https://YOUR-ENDPOINT.modal.run
COPILOT_MCP_MODAL_GATEWAY_TOKEN=<generated-token>Затем используйте конфигурацию MCP репозитория из .mcp.json:
{
"mcpServers": {
"modal-workspace": {
"type": "http",
"url": "${COPILOT_MCP_MODAL_URL}/mcp/",
"headers": {
"Authorization": "Bearer ${COPILOT_MCP_MODAL_GATEWAY_TOKEN}"
},
"tools": [
"sandbox_create",
"sandbox_exec",
"sandbox_status",
"sandbox_list",
"sandbox_snapshot",
"sandbox_terminate",
"function_call",
"app_get",
"app_list"
]
}
}
}Облачный агент GitHub Copilot поддерживает удалённые HTTP MCP-серверы и подстановку секретов/переменных Agents с префиксом COPILOT_MCP_. Удалённый MCP на основе OAuth здесь намеренно не используется; шлюз использует Bearer-токен.
4A. Установка в качестве плагина GitHub Copilot
Этот репозиторий также является небольшим маркетплейсом плагинов Copilot. После публикации его на GitHub целевой репозиторий может включить плагин с помощью .github/copilot/settings.json, используя шаблон из examples/github-copilot-settings.json:
{
"enabledPlugins": {
"modal-workspace@modal-workspace-mcp": true
},
"extraKnownMarketplaces": {
"modal-workspace-mcp": {
"source": {
"source": "github",
"repo": "xiaoqianran/modal-workspace-mcp"
}
}
}
}Запись маркетплейса указывает на plugins/modal-workspace/, чей .mcp.json подключает Copilot к развёрнутому Modal HTTP MCP endpoint. Для первой отладки вы также можете настроить тот же удалённый MCP напрямую в настройках Copilot MCP репозитория, прежде чем тестировать установку плагина.
5. Первый сквозной тест
Попросите Copilot выполнить эквивалент:
1. Call sandbox_create with timeout_seconds=1800.
2. Call sandbox_exec on the returned sandbox_id with:
apt-get update && apt-get install -y ffmpeg && git --version && curl -I https://github.com
3. Return the exit code and the last part of stdout/stderr.
4. Call sandbox_terminate.Более серьёзный тест:
Create a Modal Sandbox, clone a public GitHub repository into /root/repo,
install its dependencies, run its tests, report results, then terminate the Sandbox.
Do not use the local GitHub agent shell for network operations.Модель безопасности
HTTP MCP endpoint требует Bearer-токен.
Монтирование Secret и Volume в Sandbox запрещено по умолчанию и основано на белых списках.
Значения Secret никогда не принимаются в качестве аргументов инструментов MCP.
Вывод усекается, чтобы избежать неконтролируемых MCP-ответов.
Sandbox тегируются и изолируются в рамках выделенного Modal App.
Выполняйте разрушительные операции внутри Sandbox.
Предпочитайте выделенный GitHub-токен с минимальными правами доступа к репозиторию, а не широкий личный токен.
Локальная проверка
Репозиторий содержит вспомогательные тесты без зависимостей:
python -m unittest discover -s tests -v
python -m compileall modal_workspace_mcp modal_app.pyПолное интеграционное тестирование MCP/Modal требует доступа в Интернет и аутентифицированного аккаунта Modal.
This server cannot be deployed
Maintenance
Related MCP Connectors
Remote MCP for Gemini upgrade evals, prompt regressions, output diffs, and eval receipts.
Remote MCP for GenAI span mapping, provider normalization, dashboard schemas, and receipts.
MCP server for Superserve sandboxes: create, exec, and manage Firecracker microVMs
The Remote MCP server acts as a standardized bridge between LLM applications (like Claude, ChatGPT, and Cursor) and external services, enabling AI agents to access external tools and resources. Its primary capability is providing a centralized search tool to discover other MCP servers and their respective tools. Unlike local implementations, it runs remotely with OAuth authentication and permission controls for security.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that enables AI agents to interact with Modal, allowing them to deploy apps and run functions in a serverless cloud environment.73MIT
- AlicenseAqualityDmaintenanceA Model Context Protocol server that enables LLMs and AI assistants to create, manage, and interact with isolated cloud-based Python environments with GPU support on Modal.com.111MIT
- AlicenseAqualityAmaintenanceAn MCP server for managing Modal — apps, containers, volumes, and secrets — and for deploying & running Modal apps directly from Claude Code and other MCP clients.1263 PyPI4MIT
- AlicenseNot gradedqualityCmaintenanceEnables MCP-aware agents to drive Modal serverless compute, including GPU workers and headless Chromium for web browsing with screenshots.MIT