Skip to content

Self-host (Tutor)

Terminal window
pip install tutor-contrib-openedxmcp
tutor plugins enable openedxmcp
tutor images build openedx openedxmcp
tutor local launch # or: tutor k8s launch
tutor local do init

The openedx-mcp app auto-installs into the openedx image via a Dockerfile patch. To pin a version or source, append to Tutor’s standard list:

Terminal window
tutor config save --append OPENEDX_EXTRA_PIP_REQUIREMENTS=openedx-mcp==<ver>
KeyDefaultMeaning
OPENEDXMCP_IMAGEopenedxmcp:latestMCP server image tag
OPENEDXMCP_ENDPOINTmcp.{{ LMS_HOST }}public MCP host
OPENEDXMCP_PORT8080server port
OPENEDXMCP_LMS_BASE_URLhttp://lms:8000in-cluster LMS upstream
OPENEDXMCP_CMS_BASE_URLhttp://cms:8000in-cluster CMS upstream
OPENEDXMCP_PUBLIC_URLhttps://{{ ENDPOINT }}/mcpshown in the Django key page (injected as OPENEDX_MCP_PUBLIC_URL)

App-side settings (LMS/CMS):

SettingDefaultMeaning
OPENEDX_MCP_DEFAULT_KEY_TTL_DAYS90auto-expiry for new keys
OPENEDX_MCP_PUBLIC_URL""endpoint shown in the admin connect banner
  • Caddy routes /mcp* on mcp.<LMS_HOST> to the server container.
  • The server exposes an unauthenticated /health; the facade exposes /api/mcp/health/. Kubernetes manifests wire readiness/liveness probes and the docker-compose service a healthcheck.
  • Point the Django cache at Redis/memcached — the confirm-token and rate-limit rails need a shared backend (see Security).
  • Terminate TLS at your proxy; the server-to-LMS/CMS hop stays inside the cluster.