# Docs MCP server — production image. # # Structure: copy code first, then the regenerable indexes last so a # code-only change doesn't invalidate the corpus COPY layer. # # The container runs the MCP server via streamable-http on PORT 8000. # Override via MCP_HOST / MCP_PORT env if you front it with a different # reverse-proxy setup. FROM python:3.12-slim WORKDIR /app # Install Python deps first for cacheability. COPY requirements.txt /app/ RUN pip install --no-cache-dir -r requirements.txt # Code. COPY scrape /app/scrape COPY rag /app/rag COPY docs_mcp /app/docs_mcp # Catalog. Written by the scraper at CI time. COPY bundles.json /app/ # Regenerable indexes. CI builds these from corpus/ in the same job # that builds the image. Listed last so code changes don't invalidate # the COPY layer cache for these (much larger) directories. # # bm25/ is only consulted when HYBRID_SEARCH=true (the server falls # back to dense-only if it's missing). COPY corpus /app/corpus COPY chroma /app/chroma COPY bm25 /app/bm25 ENV PYTHONUNBUFFERED=1 \ MCP_TRANSPORT=streamable-http \ MCP_HOST=0.0.0.0 \ MCP_PORT=8000 EXPOSE 8000 ENTRYPOINT ["python", "-m", "docs_mcp.server"]