Install
$ agentstack add mcp-mihirargulkar-canvas-obsidian ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Canvas Knowledge Graph & Study Assistant
Turn your Canvas courses into a local Obsidian vault — lecture slides transcribed to markdown, a cross-lecture concept graph, homework prompts, announcements and syllabus — then study it with Claude or Gemini through MCP, grounded in your own material with citations.
Local-first: everything lands as plain markdown you own, on your machine.
Example output — 135 concepts and 221 links auto-extracted from one course's 16 lectures, coloured by source lecture. You get a graph of your own classes, whatever they are; nothing here is subject-specific. Concepts are merged across lectures, so a concept links to every lecture that touches it. The same vault opens directly in Obsidian for graph view and backlinks — or regenerate this image for any of your courses with tools/graph_svg.py.
Why this, when Canvas AI tools already exist?
Honest positioning — several mature tools already overlap with parts of this:
- Canvas API MCP servers exist that wrap the Canvas API far more completely
(90+ tools, including grading and instructor features). If all you want is to talk to Canvas from an LLM, use one of those — the live-Canvas tools here are deliberately thin.
- Hosted study assistants do RAG over your course files, and **concept-map
generators** turn uploaded PDFs into diagrams. Both are cloud SaaS: your material lives on their servers.
What this does that they don't:
- Builds a real Obsidian vault — plain
.mdwith[[wikilinks]], a concept graph
merged across lectures (a concept links to every lecture it appears in), plus backlinks and graph view for free.
- Local-first, you own the data. Nothing is hosted; the markdown outlives this tool.
- Free on a subscription you already have — the vault is exposed over MCP, so
Claude (Pro/Max) or the free Gemini CLI is the chat layer. No per-query API metering.
- One index across all your classes, with homework prompts and code notebooks in it.
If you want a polished hosted product, use the SaaS. If you want your course knowledge as files you keep, this.
Requirements
- Python 3.10+
- LibreOffice — converts
.pptx/.docxto PDF for transcription
(macOS brew install --cask libreoffice, Debian/Ubuntu apt install libreoffice). Auto-detected on $PATH; override with SOFFICE=/path/to/soffice.
- A Canvas API token (Canvas → Account → Settings → New Access Token)
- A Gemini API key (free tier) — used only
to transcribe slides and extract concepts
Setup
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
cp .env.example .env # then fill it in
.env (gitignored — never commit it):
CANVAS_URL=https://.instructure.com
CANVAS_TOKEN=
GEMINI_API_KEY=
# CANVAS_TZ=America/New_York # optional; defaults to your Canvas account timezone
Sync your classes
.venv/bin/python -m canvas_vault.sync # every class you're taking this term
.venv/bin/python -m canvas_vault.sync --list # show detected classes, change nothing
.venv/bin/python -m canvas_vault.sync --only CS101 # just one class
Per class: ingest (files + homework → markdown via Gemini vision) → updates (announcements + syllabus) → extract (concept graph) → dashboard, then one course-tagged search index.
> First run takes a while (tens of MB of slide decks through a vision model) and > may hit Gemini's free-tier daily quota. It is resumable — everything is content-hash > cached, so just run it again; finished files cost nothing and aren't re-downloaded. > A class whose Files tab the instructor disabled degrades to assignments-only rather > than failing.
Individual steps still work: python -m canvas_vault.ingest , python -m canvas_vault.extract , python -m canvas_vault.updates , python -m canvas_vault.dashboard, python -m canvas_vault.chat index.
Keeping up with the term
Courses change daily — announcements, new slides, new assignments. Re-running the sync is the incremental update: unchanged files aren't re-downloaded, cached files don't re-hit the model, and the search index only re-embeds what changed. It finishes by telling you what's new:
What's new:
DS4400
- announcement: 2026-07-28 — Dan Office Hours 7/28
- new assignment: Homework #4
index: 3 chunk(s) updated
Two ways to stay current, and they work together:
tools/install-daily-sync.sh # macOS: sync every morning at 07:30 (launchd)
tools/install-daily-sync.sh 18 00 # ...or a different time
tools/install-daily-sync.sh --uninstall
The scheduled job runs the sync with --quiet, which writes to cache/sync.log only when something actually changed — no daily noise. On Linux, the same effect with cron: 30 7 * * * cd /path/to/repo && .venv/bin/python -m canvas_vault.sync --quiet.
Or just ask your LLM — the MCP refresh tool syncs on demand: "check my courses for anything new."
Layout
notes// transcribed markdown (lectures, hw-*, code-*, announcements)
vault/Dashboard.md deadlines across ALL classes
vault// concepts/ lectures/ updates/ Dashboard.md Aimed at understanding your own material — how you use it on graded work is between
> you and your course's academic-integrity policy.
## Privacy, cost and terms
- **Your Canvas token stays in `.env`**, is read only by this tool, and is never sent
through MCP or to any model.
- **Course content is sent to Google's Gemini API** during ingestion (slides, homework
prompts) to transcribe it. If that's not acceptable for your material, don't ingest it.
- **Self-hosted, single-user by design.** Instructure's API terms prohibit sharing your
token with third parties — running this yourself with your own token is fine; offering
it as a hosted service for other students is not.
- Ingestion costs $0 on Gemini's free tier (slower); chat costs $0 on a Claude
subscription or the free Gemini CLI.
## Development
```bash
.venv/bin/python -m pytest -q
Render a course's concept graph as a standalone SVG (this is how the image above was made — the layout is seeded, so regenerating produces no diff churn):
.venv/bin/python tools/graph_svg.py DS4400
.venv/bin/python tools/graph_svg.py DS4400 --size 2000x1100 --label-degree 8 --out docs/ml.svg
Tests that need a built vault skip automatically.
Two development tools evaluate output quality against hand-labelled gold sets. Both are written for one specific course — swap in your own cases to use them:
.venv/bin/python tools/eval_graph.py # concept graph: link recall + noise-node exclusion
.venv/bin/python tools/eval_retrieval.py # RAG: recall@k and MRR for realistic questions
They exist because "the output looks fine" is not a measurement: a prompt tweak, a chunker change, or a different embedding model can quietly degrade quality, and these are what catch it.
License
MIT — see [LICENSE](LICENSE).
Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: mihirargulkar
- Source: mihirargulkar/canvas-obsidian
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.