Mdl Train Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mdl Train Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
An MCP server for monitoring and managing training jobs on Modal. Built for LLMs that need to check on long-running GPU training without drowning in log output.
Training logs on Modal can be tens of thousands of lines — weight loading bars, Omniverse init spam, 8 ranks of identical output. Dumping all of that into an LLM context is wasteful and often hits resource limits.
This server gives you browsable logs: start with a summary, then drill into what matters.
| Tool | What it does |
|---|---|
list_apps | List running, deployed, and recent apps with filtering |
get_logs | Browse logs with summary/window/grep modes |
stop_app | Stop a running app |
get_logs workflowInstead of returning a giant blob, get_logs has three modes:
1. Summary (default) — returns line count, first/last 10 lines, and any errors with line numbers. Small response, always works.
get_logs(app_id="ap-xxx")
→ {total_lines: 30000, errors: [{line: 847, text: "CUDA error: ..."}], head: [...], tail: [...]}2. Window — read a specific range. Like scrolling through a file.
get_logs(app_id="ap-xxx", window_start=840, window_size=30)
→ 30 lines around the error3. Grep — search with regex and context lines. Like grep -C.
get_logs(app_id="ap-xxx", grep="Error|Traceback", grep_context=15)
→ all errors with 15 lines of surrounding contextLandmarks — pass landmark_patterns in summary mode to get a table of contents:
get_logs(app_id="ap-xxx", landmark_patterns=["Iteration \\d+", "success_rate", "checkpoint"])
→ landmarks: [{line: 200, text: "Iteration 1/3000"}, {line: 5000, text: "success_rate: 0.95"}, ...]Landmark sampling is fair across patterns — one pattern won't dominate.
tail, automatically retries with smaller values and tells you what happened[Error] lines become a handful of unique entriesrot_align_error# Using uv (recommended)
uv pip install mdl-train-mcp
# Or from source
git clone https://github.com/JoshuaSP/mdl-train-mcp
cd mdl-train-mcp
uv venv && uv pip install -e .Make sure you have the Modal CLI installed and authenticated:
pip install modal
modal setupAdd to your .mcp.json:
{
"mcpServers": {
"mdl": {
"command": "mdl-train-mcp",
"env": {
"MODAL_PROFILE": "your-profile"
}
}
}
}Or from source:
{
"mcpServers": {
"mdl": {
"command": "uv",
"args": ["--directory", "/path/to/mdl-train-mcp", "run", "mdl-train-mcp"],
"env": {
"MODAL_BIN": "/path/to/modal",
"MODAL_PROFILE": "your-profile"
}
}
}
}| Variable | Description | Default |
|---|---|---|
MODAL_BIN | Path to modal CLI binary | modal |
MODAL_PROFILE | Modal profile to use | (default profile) |
list_apps(state?: string, name_contains?: string)Filter by state ("running", "deployed", "stopped", "ephemeral") or name substring.
get_logs(
app_id: string,
tail?: number, # log entries to fetch (default 500, max 5000)
since?: string, # "1h", "30m", "2d", or ISO datetime
until?: string,
source?: string, # "stdout", "stderr", "system"
window_start?: number, # line number for window mode
window_size?: number, # lines to return (default 50, max 200)
grep?: string, # regex search (case-insensitive)
grep_context?: number, # context lines around matches (max 30)
landmark_patterns?: string[] # regex patterns for summary landmarks
)stop_app(app_id: string)Irreversible — terminates the app and all its containers.
MIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.