We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/89jobrien/mcp-joecc'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
# Stage 1: Builder - Install dependencies with uv
FROM python:3.12-slim AS builder
WORKDIR /app
# Install uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
# Copy dependency files first (layer caching)
COPY pyproject.toml uv.lock README.md ./
# Install dependencies (no dev deps)
RUN uv sync --frozen --no-dev --no-editable
# Copy source code
COPY src/ ./src/
# Build wheel
RUN uv build --wheel
# Stage 2: Runtime - Minimal production image
FROM python:3.12-slim AS runtime
# Security: Create non-root user
RUN groupadd --gid 1001 mcpserver \
&& useradd --uid 1001 --gid mcpserver --shell /bin/bash --create-home mcpserver
WORKDIR /app
# Install uv for running the app
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
# Copy built wheel and install
COPY --from=builder /app/dist/*.whl ./
RUN uv pip install --system *.whl && rm *.whl
# Create data directory for SQLite
RUN mkdir -p /data && chown mcpserver:mcpserver /data
# Switch to non-root user
USER mcpserver
# Environment defaults
ENV DATABASE_PATH=/data/tasks.db \
LOG_LEVEL=INFO \
PYTHONUNBUFFERED=1
# Volume for persistent database
VOLUME ["/data"]
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD python -c "from mcp_task_aggregator.config import get_settings; get_settings()" || exit 1
# Entry point
ENTRYPOINT ["mcp-task-aggregator"]