feat(mcp): drive docker directly without a compose file - #5
Merged
Conversation
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>
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
The MCP server drives Docker directly — the compose file is gone, and with it every problem that flowed from it:
grafana/otel-lgtm:0.30.2, name, ports3000/4317/4318) is embedded instack.py:docker run/docker start/docker rm --forcereplace compose. The server is standalone; Docker is the only prerequisite.docker-compose/, the packaged resource copy (app/resources/+ its package-data config),compose_file()with its temp-file materialization andODD_COMPOSE_FILEoverride, the drift-guard test.odd_stack_upis idempotent, matching compose's behavior: running container → readiness poll only; stopped →docker start; absent →docker run.odd_stack_downtreats an absent container as already down.run_args()test pins the image/name/ports; the two readiness-probe tests stay. New MCP-client integration testtest-stack-idempotent-up.shproves 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 DockerBoth validated locally before push (full lifecycle + idempotency, pull inside the tool call).
🤖 Generated with Claude Code