infra-mcp
Allows reloading Caddy in-place to apply configuration changes.
Provides tools for monitoring and managing Docker Compose services, including status, logs, disk usage, and restarting services.
Enables viewing recent GitHub Actions workflow runs for configured repositories.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@infra-mcpShow me the infrastructure status."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
infra-mcp
MCP server that wraps Docker / Caddy / GitHub Actions ops on a remote VPS. Lets Claude take read-then-write-with-confirmation infra actions over SSH, with a service allowlist and audit-trail-friendly responses.
MCP · FastMCP · Claude Code · Claude Desktop · Docker Compose · Caddy · GitHub Actions · Pydantic v2 · httpx · pytest-asyncio
Tool | Read/Write | What it does |
| R |
|
| R | tail logs from one service with |
| R |
|
| R | last N GitHub Actions runs per configured repo |
| R | resolves |
| W | restart a compose service ( |
| W | reload Caddy in-place ( |
Why this exists
I spent a full afternoon on a single deploy SSH'ing to a VPS, running docker compose logs ..., scrolling, restarting things, re-SSH'ing. Every one of those steps is a tool call this server exposes. Now: "what's broken on <service> in the last 20 minutes?" in Claude Code — done.
This is also the canonical interview answer for "build us an MCP server for internal team operations": an ops surface wrapped as MCP, with three safety layers (allowlist, confirm gate, structured responses).
Related MCP server: kje-mcp
Safety model
Read vs write split. Status/logs/disk/deploys/url are always callable. Restart/reload require an explicit
confirm: trueparameter so the model can't trip into a production bounce by accident.Service allowlist. Write tools cross-check against
INFRA_ALLOWED_SERVICESfrom.env. Anything not listed is rejected even withconfirm=true. Editing the allowlist is a deliberate human action.No shell injection. Tool inputs are typed (
tail: int,since: strvalidated against a\d+[smhd]shape,grepstrings quoted with single-quote escaping). Commands are assembled from typed params on the server, never from raw MCP-client strings.Bounded outputs. Logs are clamped to
INFRA_MAX_LOG_LINES(500 by default) so a tool call can't dump 50 MB into the model context.Hard timeouts. Every SSH invocation runs under
asyncio.wait_forand aConnectTimeout. A wedged container or unreachable box returns an error, not a hang.
Install
git clone https://github.com/odanree/infra-mcp
cd infra-mcp
python -m venv .venv
.venv/Scripts/activate # Windows: .venv\Scripts\activate
pip install -e ".[dev]"
cp .env.example .env # edit ssh host + allowlist + (optional) GH tokenRequires the ssh binary on PATH and SSH-key auth already configured for the target host (your normal ~/.ssh/config works).
Register with Claude Code (user-scope)
claude mcp add infra -s user -- "/abs/path/to/infra-mcp/.venv/Scripts/python.exe" -m server.main
claude mcp list # confirms "infra" connectedRestart Claude Code, then try:
"Show me the infra status. Anything not running?"
"Tail logs for the api service since 10m and grep for 'Error'."
"Restart the api service — confirm=true."
Tests
pytest
# SSH is patched at the run() boundary — no network in the test suite.Roadmap
infra_logsLangfuse export: when a service has Langfuse-traced calls, return a list of recent trace IDs alongside log lines so you can jump straight from a 500 to the trace.service_url+ cert expiry: when the HTTP probe succeeds, also surface days-until-cert-expiry from Caddy's storage.Per-tool audit-log file on the target so any write action has a permanent local record independent of Claude's chat log.
License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/odanree/infra-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server