Skip to content
πŸŽ“ Find your path 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)