
Vllm Ops Mcp
io.github.jaimenbellPublished by GitHub account jaimenbellv0.1.0Updated Oct 24, 2026
Read-only ops/health MCP server for a local vLLM instance: health tiers, GPU/VRAM, service status.
Overview
Read-only ops and health checks for a local vLLM server: liveness and real-completion tiers, GPU/VRAM status, systemd service state and launch flags.
- What you can do
- Check vLLM health at two tiers: a /v1/models liveness probe, or a deep probe that fires one real chat completion
- List served models and run an on-demand test completion with a caller-supplied prompt
- Read GPU and VRAM usage plus utilization from nvidia-smi
- Inspect the systemd unit's load/active state, restart count, main PID and last-active timestamp
- Introspect the live serve flags from the running process's argv, with an exec-script fallback when the unit is down
- When to use it
- Useful when you run vLLM as a systemd unit (typically inside WSL2) and want an assistant to diagnose whether it is actually generating, how much VRAM it holds, and which flags it was launched with, without shelling into the box yourself.
- Requirements
- A local Python install (PyPI package vllm-ops-mcp, stdio). An already-running vLLM OpenAI-compatible endpoint, nvidia-smi, and systemctl reachable via wsl -d or natively. Optional environment variables set the base URL, model name, WSL distro, service unit, exec-script path and rate limit; defaults target 127.0.0.1:8000 and unit vllm.
Installation
In SourceWeft
- Open Vllm Ops Mcp in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
vllm-ops-mcp
Read-only ops/health MCP server for a local, WSL2/systemd-managed vLLM server -- liveness vs. real-completion health tiers, GPU/VRAM status, systemd service status, and live serve-flag introspection. Built to the same standard as mcp-factory and desktop-mcp, and other local tooling in this operator's portfolio: own pyproject, own fastmcp server, honest README, real test suite, no product code before a spec was confirmed.
This is not a container-lifecycle manager. It assumes vLLM already runs
as a bare-metal systemd unit inside WSL2 (this operator's actual setup --
see vllm-autostart), not inside Docker/Podman.
Quickstart
Tools (Phase 1 -- all read-only, no gating required beyond a throughput cap)
Future extension: restart_service (Phase 2, not built)
Deliberately not implemented in this release. Per the spec: vLLM is
shared infra other bots/tools depend on (options-bot, qwen_cli.py
callers, DeerFlow fallback), so a restart tool needs its own gating design
(off by default, VLLM_OPS_MCP_ENABLE_RESTART=1, refuse to touch a healthy
instance unless force=True, rate-capped) before it ships -- not
retrofitted onto a read-only MVP. Tracked as a v2 idea, not a current
capability. If built, it should wrap run-vllm.cmd's exact recipe (systemctl start vllm only, never blind stop/restart) rather than reinvent it.
The differentiator: probe HTTP, not the listener
Every health signal in this server comes from an actual HTTP request to the
OpenAI-compatible API (urllib.request, not a socket/connect check). This
is deliberate, not incidental: Get-NetTCPConnection and other
listener-based checks miss WSL2-mirrored-networking-relayed ports
entirely -- a genuinely healthy 127.0.0.1:8000 can be invisible to a
listener probe run from the Windows host. check-vllm.cmd already embodies
this lesson; this server generalizes it into two tiers (liveness vs. real
generation) that nothing else in this operator's fleet exposes as MCP tools.
Security
Read this before you register vllm-ops-mcp. Honesty about blast radius is the point.
- This server shells out to
nvidia-smi,systemctl(viawsl -d), and reads/proc/<pid>/cmdline. All six tools are read-only -- nothing here starts, stops, restarts, or kills a process, and no tool accepts an argument that gets passed to a shell unescaped (unit/distro names come from server-side config, not caller input;shlex.quotewraps the one caller-adjacent path that does reach a shell string, the unit name insystemctl show). check_health(deep=True)andtest_completionfire a real inference call against a shared GPU server. Rate-limited (default 20 calls/min,VLLM_OPS_MCP_DEEP_RATE_LIMIT_PER_MIN) specifically because this vLLM instance is shared infra other bots/tools depend on -- a caller hammering this MCP could starve or slow other consumers even though every call individually looks "read-only."get_serve_config's live-process path reads/proc/<pid>/cmdline, which can include secrets if any were ever passed as CLI flags (none are, in this operator's actual setup -- the model path and flags are all non-secret; auth, if any, is environment-injected inside the exec script, not passed as an argv flag). Defense-in-depth: any argv entry whose preceding flag name matches a known-sensitive pattern (token,key,secret,password,passwd,credential--config. SENSITIVE_ARGV_FLAG_PATTERNS) has its value redacted to[REDACTED]before being returned, in both the structuredargv/flagsfields andraw_text; the flag name itself is left visible so the shape is still diagnosable. This applies across all three sources (live_process,exec_script,local_config_mirror).- No tool has any write/mutate capability in this release. There is no
env var that turns one on --
restart_servicedoesn't exist in this codebase yet (see Future extension above), so there's nothing to accidentally enable.
Honest-capabilities table
Limitations (read before relying on this)
- Per-process VRAM attribution is unreliable under this operator's actual
WSL2 GPU-passthrough config.
get_gpu_status's live smoke test (realnvidia-smi.exeagainst the real running vLLM process) returned an emptyprocesseslist even though the same call'sgpus[0]. memory_used_mibcorrectly showed 13.7GB in use by that process. This is a documentednvidia-smi --query-compute-appslimitation under some WSL2/passthrough configurations, not a bug in this server's parsing -- the tool reports the empty result honestly (ok: true, processes: []) rather than fabricating attribution. Don't rely onprocessesfor VRAM-overshoot root-causing on this setup;gpus[].memory_used_mibis the reliable signal. - No computed service uptime.
get_service_statusreturns the rawActiveEnterTimestampstring fromsystemctl(already timezone-labeled, e.g.MDT) rather than computing an elapsed duration server-side -- deliberately, per this operator's own clock-discipline rule (never state an elapsed/ETA time from estimation; artifact timestamps are often UTC while local is UTC-6/-7). Compute the delta at the call site if you need it, with an explicit timezone conversion. get_serve_config's exec-script fallback is best-effort shell-text parsing, not an exact argv array -- it handles\line continuations and basic quoting viashlex.split, but a sufficiently unusual exec script could parse incorrectly. The live-process path (/proc/<pid>/ cmdline) does not have this limitation (it's the kernel's exact argv, null-separated) and is always preferred when the unit is up.- WSL2-specific by default, but the seam is explicit.
get_service_statusandget_serve_config's live-process path assume this server runs on the Windows host and shells into WSL2 viawsl -d <distro>. SetVLLM_OPS_MCP_RUNS_IN_WSL=1if this server process itself runs inside WSL2/Linux natively (nativesystemctl/cat, nowsl -dhop) -- both paths are unit-tested (TestGetServiceStatus::test_uses_wsl_prefix_on_windows/test_no_wsl_prefix_when_native), but only the Windows-host path has been live-verified against this operator's actual setup. - Single vLLM instance, single GPU, this operator's setup. No
multi-instance/multi-GPU aggregation;
get_gpu_statusreturns whatevernvidia-smi --query-gpuenumerates, which is every GPU visible to the process, not scoped to "the GPU vLLM is using" if more than one exists. - No lifecycle control whatsoever in this release. See "Future extension" above -- this is intentional, not an oversight.
Env vars
Usage examples
Testing
CI (.github/workflows/ci.yml) runs this suite on every push/PR (ubuntu-latest --
the unit suite mocks HTTP/subprocess, no live server/GPU/WSL required) and
fails the build if the Tests badge above drifts from what the suite
actually reports -- see scripts/check_readme_counts.py.
Install
Registered in ~/.claude.json as vllm-ops-mcp (stdio, own .venv, no env
overrides needed for this operator's default setup).
Commercial support
Maintained by Jaimen Bell. For production MCP integrations, custom servers, or agent-reliability work, see jaimenbell.dev.
Building your own MCP server? The MCP Starter Kit has templates, a build playbook, and packaging war-stories from shipping this one.
mcp-name: io.github.jaimenbell/vllm-ops-mcp
Source: README.md at commit 28be4a0
Tools
0Version history
1- v0.1.0LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts