Skip to content

feat(mcp): drive docker directly without a compose file - #5

Merged
using-system merged 3 commits into
mainfrom
features/standalone-stack
Aug 22, 2026
Merged

feat(mcp): drive docker directly without a compose file#5
using-system merged 3 commits into
mainfrom
features/standalone-stack

Conversation

@using-system

Copy link
Copy Markdown
Owner

What

The MCP server drives Docker directly — the compose file is gone, and with it every problem that flowed from it:

  • The container definition (pinned grafana/otel-lgtm:0.30.2, name, ports 3000/4317/4318) is embedded in stack.py: docker run / docker start / docker rm --force replace compose. The server is standalone; Docker is the only prerequisite.
  • Removed: docker-compose/, the packaged resource copy (app/resources/ + its package-data config), compose_file() with its temp-file materialization and ODD_COMPOSE_FILE override, the drift-guard test.
  • odd_stack_up is idempotent, matching compose's behavior: running container → readiness poll only; stopped → docker start; absent → docker run. odd_stack_down treats an absent container as already down.
  • Unit tests: a pure run_args() test pins the image/name/ports; the two readiness-probe tests stay. New MCP-client integration test test-stack-idempotent-up.sh proves idempotency end-to-end.

How to test

CI runs the full suite (lint, unit, and both integration tests through the MCP Inspector client). Locally:

uv run --project src/mcp-server pytest -c src/mcp-server/pyproject.toml tests/mcp-server
bash integration-tests/mcp-server/run.sh   # needs Docker

Both validated locally before push (full lifecycle + idempotency, pull inside the tool call).

🤖 Generated with Claude Code

using-system and others added 3 commits August 22, 2026 12:00
The container definition (pinned image, name, ports) is embedded in
stack.py: docker run/start/rm replace compose, making the server
standalone - no compose file, no packaged resource copy, no drift
guard, no temp-file materialization. odd_stack_up is idempotent
(running -> poll only, stopped -> start, absent -> run); a new
integration test proves idempotency through the MCP client.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Observe the run (local via the piloted Grafana stack, remote via any
OpenTelemetry backend), feed the findings into the next spec-driven
wave, observe again - indefinitely. Drops the leftover
measurement-era phrasing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Docker for the local stack; gcx as the observation CLI over the
Grafana stack, with its official install commands.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@using-system
using-system merged commit 920b71f into main Aug 22, 2026
3 checks passed
@using-system
using-system deleted the features/standalone-stack branch August 22, 2026 10:15
@github-actions github-actions Bot mentioned this pull request Aug 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant