/ Dockerfile
Dockerfile
 1  # Dockerfile for mureo — AI agent framework for ad operations.
 2  #
 3  # Primary purpose: enable MCP introspection checks on server registries
 4  # such as Glama (https://glama.ai/mcp/servers/logly/mureo).
 5  #
 6  # Secondary purpose: let users try mureo without touching their host
 7  # Python environment. Real usage requires credentials; see README.
 8  #
 9  # Usage:
10  #   docker build -t mureo .
11  #   docker run --rm -v ~/.mureo:/home/mureo/.mureo mureo
12  
13  FROM python:3.11-slim
14  
15  LABEL org.opencontainers.image.source="https://github.com/logly/mureo" \
16        org.opencontainers.image.description="AI agent framework for autonomous ad operations across Google Ads, Meta Ads, and Search Console" \
17        org.opencontainers.image.licenses="Apache-2.0" \
18        org.opencontainers.image.vendor="Logly, Inc." \
19        org.opencontainers.image.documentation="https://mureo.io" \
20        org.opencontainers.image.url="https://github.com/logly/mureo"
21  
22  # Non-root user for runtime
23  RUN groupadd --system mureo && useradd --system --gid mureo --create-home mureo
24  
25  WORKDIR /app
26  
27  # Install dependencies first in a cacheable layer.
28  # We create an empty package stub so `pip install .` resolves deps
29  # without needing the full source tree; sources are copied next.
30  COPY pyproject.toml README.md LICENSE ./
31  RUN mkdir -p mureo && touch mureo/__init__.py \
32   && pip install --no-cache-dir . \
33   && rm -rf mureo
34  
35  # Copy real sources. Edits here do not invalidate the deps layer above.
36  COPY mureo/ ./mureo/
37  RUN pip install --no-cache-dir --no-deps .
38  
39  # Drop privileges
40  RUN chown -R mureo:mureo /app
41  USER mureo
42  
43  # Credentials are loaded at runtime from ~/.mureo/credentials.json.
44  # Mount the host directory when running:
45  #   docker run --rm -v ~/.mureo:/home/mureo/.mureo mureo
46  # Credential checks are lazy (per-tool), so the server starts without
47  # credentials — MCP introspection on registries like Glama works
48  # without dummy env vars.
49  
50  # MCP server over stdio (Claude Code / Cursor / Codex CLI / Gemini CLI)
51  CMD ["python", "-m", "mureo.mcp"]