# vishalsachdev/canvas-mcp architecture

> Architecture diagram of the GitHub repository vishalsachdev/canvas-mcp, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/vishalsachdev/canvas-mcp
- Repository: https://github.com/vishalsachdev/canvas-mcp

## Overview

Canvas MCP is an MCP server that lets AI assistants perform role-specific Canvas LMS work. The main workflow is an agent request, server-side tool dispatch, and a Canvas operation whose result is returned to the agent; educators, students, learning designers, and developers use different tool families. Supporting layers include Canvas API access, shared policy and data-safety utilities, resources, and access controls. The README documents broad capabilities, while sampled source and the source index confirm selected internal links; unsampled tool implementations are represented at their listed paths without asserting unverified calls.

Main entry points: [`src/canvas_mcp/tools/__init__.py`](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/__init__.py) (Tool registry), [`src/canvas_mcp/server.py`](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/server.py) (MCP server), [`src/canvas_mcp/core/client.py`](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/core/client.py) (Canvas HTTP client), [`src/canvas_mcp/resources/resources.py`](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/resources/resources.py) (Canvas resources)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["MCP entry"]
  node_server["MCP server<br/>[server.py]"]
  node_tool_registry["Tool registry<br/>[__init__.py]"]
  node_resources["Canvas resources<br/>[resources.py]"]
end

subgraph group_canvas_ops["Canvas workflows"]
  node_student_tools["Student tools<br/>[student_tools.py]"]
  node_course_tools["Course tools<br/>[courses.py]"]
  node_assignment_tools["Assignment tools<br/>[assignments.py]"]
  node_discussion_tools["Discussion tools<br/>[discussions.py]"]
  node_content_tools["Course content<br/>[modules.py]"]
  node_messaging_tools["Messaging tools<br/>[messaging.py]"]
  node_learning_design["Accessibility tools<br/>[accessibility.py]"]
  node_peer_tools["Peer review tools<br/>[peer_reviews.py]"]
  node_peer_comment_tools["Review comment tools"]
end

subgraph group_developer_api["Developer API"]
  node_code_execution["TypeScript execution<br/>[code_execution.py]"]
  node_code_api["Code API client<br/>[client.ts]"]
end

subgraph group_shared_core["Shared core"]
  node_peer_engine["Peer review analytics<br/>[peer_reviews.py]"]
  node_comment_engine["Comment analysis"]
  node_canvas_client["Canvas HTTP client<br/>[client.py]"]
  node_policy_safety["Policy and safety"]
end

subgraph group_access_control["Access control"]
  node_access_routes["Approval routes<br/>[routes.py]"]
  node_access_store[("Access store<br/>[store.py]")]
end

node_agents(("AI clients"))
node_canvas["Canvas LMS"]

node_agents -->|"send requests"| node_server
node_server -->|"registers tools"| node_tool_registry
node_server -->|"serves resources"| node_resources
node_tool_registry -->|"offers student workflows"| node_student_tools
node_tool_registry -->|"offers course workflows"| node_course_tools
node_tool_registry -->|"offers grading"| node_assignment_tools
node_tool_registry -->|"offers discussions"| node_discussion_tools
node_tool_registry -->|"offers content management"| node_content_tools
node_tool_registry -->|"offers messaging"| node_messaging_tools
node_tool_registry -->|"offers accessibility review"| node_learning_design
node_tool_registry -->|"offers peer review"| node_peer_tools
node_peer_tools -->|"calls analytics"| node_peer_engine
node_peer_comment_tools -->|"analyzes comments"| node_comment_engine
node_server -->|"configures API access"| node_canvas_client
node_resources -->|"reads Canvas data"| node_canvas_client
node_peer_engine -->|"requests Canvas data"| node_canvas_client
node_comment_engine -->|"requests Canvas data"| node_canvas_client
node_canvas_client -->|"calls Canvas API"| node_canvas
node_tool_registry -->|"offers code execution"| node_code_execution
node_code_execution -.->|"uses code API"| node_code_api
node_code_api -->|"calls Canvas API"| node_canvas
node_server -->|"configures tool policy"| node_policy_safety
node_server -->|"routes approvals"| node_access_routes
node_access_routes -->|"reads and grants access"| node_access_store

click node_server "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/server.py"
click node_tool_registry "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/__init__.py"
click node_resources "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/resources/resources.py"
click node_student_tools "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/student_tools.py"
click node_course_tools "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/courses.py"
click node_assignment_tools "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/assignments.py"
click node_discussion_tools "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/discussions.py"
click node_content_tools "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/modules.py"
click node_messaging_tools "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/messaging.py"
click node_learning_design "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/accessibility.py"
click node_peer_tools "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/peer_reviews.py"
click node_peer_engine "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/core/peer_reviews.py"
click node_peer_comment_tools "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/peer_review_comments.py"
click node_comment_engine "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/core/peer_review_comments.py"
click node_canvas_client "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/core/client.py"
click node_policy_safety "https://github.com/vishalsachdev/canvas-mcp/tree/main/src/canvas_mcp/core"
click node_code_execution "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/code_execution.py"
click node_code_api "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/code_api/client.ts"
click node_access_routes "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/core/access/routes.py"
click node_access_store "https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/core/access/store.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_server,node_tool_registry,node_resources,node_agents toneBlue
class node_student_tools,node_course_tools,node_assignment_tools,node_discussion_tools,node_content_tools,node_messaging_tools,node_learning_design,node_peer_tools,node_peer_comment_tools toneAmber
class node_code_execution,node_code_api toneMint
class node_peer_engine,node_comment_engine,node_canvas_client,node_policy_safety toneRose
class node_access_routes,node_access_store,node_canvas toneIndigo
```

## Components

### MCP entry

- [MCP server](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/server.py): `src/canvas_mcp/server.py`
- [Tool registry](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/__init__.py): `src/canvas_mcp/tools/__init__.py`
- [Canvas resources](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/resources/resources.py): `src/canvas_mcp/resources/resources.py`

### Canvas workflows

- [Student tools](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/student_tools.py): `src/canvas_mcp/tools/student_tools.py`
- [Course tools](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/courses.py): `src/canvas_mcp/tools/courses.py`
- [Assignment tools](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/assignments.py): `src/canvas_mcp/tools/assignments.py`
- [Discussion tools](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/discussions.py): `src/canvas_mcp/tools/discussions.py`
- [Course content](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/modules.py): `src/canvas_mcp/tools/modules.py`
- [Messaging tools](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/messaging.py): `src/canvas_mcp/tools/messaging.py`
- [Accessibility tools](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/accessibility.py): `src/canvas_mcp/tools/accessibility.py`
- [Peer review tools](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/peer_reviews.py): `src/canvas_mcp/tools/peer_reviews.py`
- [Review comment tools](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/peer_review_comments.py): `src/canvas_mcp/tools/peer_review_comments.py`

### Developer API

- [TypeScript execution](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/tools/code_execution.py): `src/canvas_mcp/tools/code_execution.py`
- [Code API client](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/code_api/client.ts): `src/canvas_mcp/code_api/client.ts`

### Shared core

- [Peer review analytics](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/core/peer_reviews.py): `src/canvas_mcp/core/peer_reviews.py`
- [Comment analysis](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/core/peer_review_comments.py): `src/canvas_mcp/core/peer_review_comments.py`
- [Canvas HTTP client](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/core/client.py): `src/canvas_mcp/core/client.py`
- [Policy and safety](https://github.com/vishalsachdev/canvas-mcp/tree/main/src/canvas_mcp/core): `src/canvas_mcp/core`

### Access control

- [Approval routes](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/core/access/routes.py): `src/canvas_mcp/core/access/routes.py`
- [Access store](https://github.com/vishalsachdev/canvas-mcp/blob/main/src/canvas_mcp/core/access/store.py): `src/canvas_mcp/core/access/store.py`

### Other components

- **AI clients**
- **Canvas LMS**

## Connections

- AI clients → MCP server: send requests
- MCP server → Tool registry: registers tools (evidence: `src/canvas_mcp/server.py`)
- MCP server → Canvas resources: serves resources (evidence: `src/canvas_mcp/server.py`)
- Tool registry → Student tools: offers student workflows
- Tool registry → Course tools: offers course workflows
- Tool registry → Assignment tools: offers grading
- Tool registry → Discussion tools: offers discussions
- Tool registry → Course content: offers content management
- Tool registry → Messaging tools: offers messaging
- Tool registry → Accessibility tools: offers accessibility review
- Tool registry → Peer review tools: offers peer review
- Peer review tools → Peer review analytics: calls analytics (evidence: `src/canvas_mcp/tools/peer_reviews.py`)
- Review comment tools → Comment analysis: analyzes comments (evidence: `src/canvas_mcp/tools/peer_review_comments.py`)
- MCP server → Canvas HTTP client: configures API access (evidence: `src/canvas_mcp/server.py`)
- Canvas resources → Canvas HTTP client: reads Canvas data (evidence: `src/canvas_mcp/resources/resources.py`)
- Peer review analytics → Canvas HTTP client: requests Canvas data (evidence: `src/canvas_mcp/core/peer_reviews.py`)
- Comment analysis → Canvas HTTP client: requests Canvas data (evidence: `src/canvas_mcp/core/peer_review_comments.py`)
- Canvas HTTP client → Canvas LMS: calls Canvas API (evidence: `src/canvas_mcp/core/client.py`)
- Tool registry → TypeScript execution: offers code execution
- TypeScript execution → Code API client: uses code API
- Code API client → Canvas LMS: calls Canvas API (evidence: `src/canvas_mcp/code_api/client.ts`)
- MCP server → Policy and safety: configures tool policy (evidence: `src/canvas_mcp/server.py`)
- MCP server → Approval routes: routes approvals (evidence: `src/canvas_mcp/server.py`)
- Approval routes → Access store: reads and grants access (evidence: `src/canvas_mcp/core/access/routes.py`)
