Skip to content
Subscribe

Canvas LMS Integration

Status: Production

Canvas LMS integration provides real-time academic data for the School domain: courses, assignments, grades, announcements. Data flows through an MCP server to multiple consumers (dashboard, alerts, RAG pipeline).

Canvas LMS API
โ”‚
โ–ผ
canvas-lms MCP Server (6 tools)
โ”‚
โ”œโ”€โ”€โ–บ canvas_sync.py โ†’ assignments JSON + grades YAML + courses YAML
โ”‚
โ”œโ”€โ”€โ–บ grade_alerts.py โ†’ Telegram notifications on grade changes
โ”‚
โ”œโ”€โ”€โ–บ deadline-watcher.sh โ†’ 48h deadline alerts via Telegram
โ”‚
โ”œโ”€โ”€โ–บ morning-briefing.sh โ†’ Academic alerts in daily briefing
โ”‚
โ””โ”€โ”€โ–บ rag_ingest.py โ†’ ChromaDB vector store
ToolPurpose
list_coursesAll enrolled courses
list_assignmentsAssignments for a course (with due dates, points)
get_assignmentSingle assignment details
get_gradesCurrent grades per course
list_announcementsRecent course announcements
get_course_pagesCourse content pages (wiki)
  • Cron: daily at 7 AM
  • Pulls all assignments across enrolled courses
  • Saves to local JSON cache
  • 120s timeout via perl alarm wrapper
  • Handles courses with disabled pages gracefully
  • Per-course: current grade, letter, trend, alerts
  • Critical threshold: C- or below triggers alert
  • Grade change detection: compares current vs previous sync
  • Telegram alert on any grade change
  • ChromaDB โ€” vector store (persistent local storage)
  • Ollama nomic-embed-text โ€” embedding model (137M params, local, zero cost)
  • lightning-whisper-mlx โ€” audio transcription (Apple Silicon optimized)
ScriptPurpose
rag_ingest.py512-token recursive chunking, 100 overlap, ingest to ChromaDB
rag_query.pyCLI cross-course semantic search with distance ranking
canvas_to_rag.shCron-ready Canvas pages to ChromaDB sync
transcribe.pyWhisper audio transcription with auto-ingest
  • 88 chunks ingested across 3 courses
  • Query accuracy: 0.24 distance for relevant results
  • 5 courses returned 404 on pages (Canvas pages disabled by instructor)