AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
MCP verified MIT Self-run

Canvas Obsidian

mcp-mihirargulkar-canvas-obsidian · by mihirargulkar

Sync Canvas courses into a local Obsidian vault — transcribed lecture notes, a cross-lecture concept graph, homework and deadlines — then study it with Claude or Gemini over MCP.

No reviews yet
0 installs
14 views
0.0% view→install

Install

$ agentstack add mcp-mihirargulkar-canvas-obsidian

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No 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.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/mcp-mihirargulkar-canvas-obsidian)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
11d ago

Declared compatibility

Claude CodeClaude DesktopCursorWindsurf

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

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 →
Are you the author of Canvas Obsidian? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

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 .md with [[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/.docx to 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.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.