modal-workspace-mcp
modal-workspace-mcp
Eine Remote-MCP-Brücke, die es GitHub Copilot, Copilot CLI und anderen MCP-Clients ermöglicht, dein Modal-Konto für Linux-Ausführung, Abhängigkeitsinstallation, Git-Operationen, GPU-Jobs und Aufrufe bereitgestellter Modal Functions zu nutzen.
Dieses Projekt ist bewusst eine Brücke, keine IDE und kein gehosteter Entwickler-Workspace.
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 FunctionV1-Werkzeuge
sandbox_create— erstellt eine eigenständige Sandbox mit konfigurierbarer CPU/RAM/GPU, apt/pip-Paketen, Netzwerkrichtlinie, zugelassenen Secrets und Volumes.sandbox_exec— führtbash -lc-Befehle aus und gibt Exit-Code/stdout/stderr zurück.sandbox_status— prüft, ob eine Sandbox läuft.sandbox_list— listet die von diesem MCP verwalteten Sandboxes auf.sandbox_snapshot— erstellt einen Snapshot des Sandbox-Dateisystems als Modal Image.sandbox_terminate— beendet eine Sandbox.function_call— ruft eine bereits bereitgestellte Modal Function über den App-/Funktionsnamen auf.app_get— löst eine benannte Modal App und die Dashboard-URL auf.app_list— listet Modal Apps über die offiziellemodal app list --json-CLI-Oberfläche auf.
Related MCP server: MCP4Modal Sandbox
Warum dies das DNS-Problem des GitHub-Containers löst
Der GitHub-Agent führt apt, curl, git clone und pip nicht lokal aus. Er sendet lediglich eine MCP-HTTP-Anfrage an deinen Modal-Endpunkt. Die eigentlichen Netzwerk- und Shell-Operationen finden in einer Modal Sandbox statt.
1. Gateway-Token konfigurieren
Erzeuge lokal ein zufälliges Token:
python -c "import secrets; print(secrets.token_urlsafe(48))"Erstelle ein Modal Secret namens modal-workspace-mcp-auth, das diesen Wert enthält:
modal secret create modal-workspace-mcp-auth MODAL_WORKSPACE_MCP_TOKEN='<generated-token>'Dasselbe Gateway-Secret kann auch nicht-geheime Konfigurationen wie Zulassungslisten enthalten, sodass die bereitgestellte Function diese als Umgebungsvariablen erhält.
Führe keinen Commit des Tokens durch.
2. Optional: Sandbox-Secrets und -Volumes zulassen
Das MCP verweigert standardmäßig das willkürliche Mounten von Secrets/Volumes. Konfiguriere Zulassungslisten auf der Gateway-Function, falls du sie benötigst.
Vom Server verstandene Umgebungsvariablen:
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=120000Erstelle beispielsweise Anmeldedaten als separate Modal Secrets:
modal secret create github-agent GH_TOKEN="$GH_TOKEN"
modal secret create huggingface-agent HF_TOKEN="$HF_TOKEN"Aktualisiere dann das Gateway-Secret, sodass diese Secret-Namen explizit zugelassen werden (ihre Werte bleiben weiterhin in den separaten Secrets):
modal secret create modal-workspace-mcp-auth \
MODAL_WORKSPACE_MCP_TOKEN='<generated-token>' \
MODAL_WORKSPACE_ALLOWED_SECRETS='github-agent,huggingface-agent'3. Bereitstellen
Wenn Modal lokal authentifiziert ist:
uv sync
uv run modal deploy modal_app.pyModal gibt die öffentliche Web-Function-URL aus. Der MCP-Endpunkt ist diese URL plus /mcp/.
Health-Check:
curl https://YOUR-ENDPOINT.modal.run/healthzFür den MCP Inspector:
npx @modelcontextprotocol/inspectorVerwende Streamable HTTP, URL:
https://YOUR-ENDPOINT.modal.run/mcp/und Header:
Authorization: Bearer <generated-token>4. GitHub Copilot Cloud-Agent
Konfiguriere diese Agents-Werte im Ziel-GitHub-Repository:
COPILOT_MCP_MODAL_URL=https://YOUR-ENDPOINT.modal.run
COPILOT_MCP_MODAL_GATEWAY_TOKEN=<generated-token>Verwende dann die Repository-MCP-Konfiguration aus .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 Cloud-Agent unterstützt entfernte HTTP-MCP-Server und die Substitution von Agents-Secrets/Variablen mit dem Präfix COPILOT_MCP_. OAuth-basiertes Remote-MCP wird hier bewusst nicht verwendet; das Gateway verwendet ein Bearer-Token.
4A. Als GitHub Copilot-Plugin installieren
Dieses Repository ist auch ein kleiner Copilot-Plugin-Marketplace. Nach der Veröffentlichung auf GitHub kann ein Ziel-Repository das Plugin mit .github/copilot/settings.json aktivieren, wobei die Vorlage in examples/github-copilot-settings.json verwendet wird:
{
"enabledPlugins": {
"modal-workspace@modal-workspace-mcp": true
},
"extraKnownMarketplaces": {
"modal-workspace-mcp": {
"source": {
"source": "github",
"repo": "xiaoqianran/modal-workspace-mcp"
}
}
}
}Der Marketplace-Eintrag verweist auf plugins/modal-workspace/, dessen .mcp.json Copilot mit dem bereitgestellten Modal-HTTP-MCP-Endpunkt verbindet. Für die erste Fehlersuche kannst du dasselbe Remote-MCP auch direkt in den Copilot-MCP-Einstellungen des Repositorys konfigurieren, bevor du die Plugin-Installation testest.
5. Erster End-to-End-Test
Bitte Copilot, das Äquivalent zu Folgendem zu tun:
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.Ein stärkerer Test:
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.Sicherheitsmodell
Der HTTP-MCP-Endpunkt erfordert ein Bearer-Token.
Das Mounten von Sandbox-Secrets und -Volumes ist standardmäßig verweigert und basiert auf Zulassungslisten.
Secret Werte werden niemals als MCP-Tool-Argumente akzeptiert.
Die Ausgabe wird abgeschnitten, um unkontrollierte MCP-Antworten zu vermeiden.
Sandboxes werden getaggt und unter einer dedizierten Modal App isoliert.
Halte destruktive Operationen innerhalb der Sandbox.
Bevorzuge ein dediziertes GitHub-Token mit minimalen Repository-Berechtigungen gegenüber einem breit angelegten persönlichen Token.
Lokale Validierung
Das Repository enthält abhängigkeitsfreie Helfer-Tests:
python -m unittest discover -s tests -v
python -m compileall modal_workspace_mcp modal_app.pyVollständige MCP/Modal-Integrationstests erfordern Internetzugang und ein authentifiziertes Modal-Konto.
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