# Canvas Obsidian

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

- **Type:** MCP server
- **Install:** `agentstack add mcp-mihirargulkar-canvas-obsidian`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [mihirargulkar](https://agentstack.voostack.com/s/mihirargulkar)
- **Installs:** 0
- **Category:** [AI & ML](https://agentstack.voostack.com/c/ai-and-ml)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [mihirargulkar](https://github.com/mihirargulkar)
- **Source:** https://github.com/mihirargulkar/canvas-obsidian

## Install

```sh
agentstack add mcp-mihirargulkar-canvas-obsidian
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## 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](https://aistudio.google.com/app/apikey)) — used only
  to transcribe slides and extract concepts

## Setup

```bash
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

```bash
.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:

```bash
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):

```bash
.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:

```bash
.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](https://github.com/mihirargulkar)
- **Source:** [mihirargulkar/canvas-obsidian](https://github.com/mihirargulkar/canvas-obsidian)
- **License:** MIT

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

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** yes
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/mcp-mihirargulkar-canvas-obsidian
- Seller: https://agentstack.voostack.com/s/mihirargulkar
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
