Canvas MCP Server v2.0 について
Canvas LMS 向けの MCP サーバーで、コース、課題、履修登録、成績を扱うツールを提供します。学生、教員、アカウント管理者を対象とし、stdio と Streamable HTTP のトランスポートに対応します。
主な機能
- 01コースや課題、モジュールを扱う学生向けツール
- 02採点、クイズ、ルーブリックの教員向けツール
- 03ユーザー作成とレポート生成のアカウント管理ツール
- 04stdio と Streamable HTTP のトランスポート
- 05Docker と Kubernetes のデプロイファイル
活用シーン
- 01Claude Desktop での課題と成績の確認
- 02教員によるコースと課題の作成
- 03管理者による履修やアカウントのレポート生成
MCP 対応
Canvas LMS API を MCP ツールとして公開し、MCP クライアントから呼び出せるようにする MCP サーバーです。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Canvas MCP Server v2.3.0
セキュリティと開示の履歴
このプロジェクトは、Canvas LMS API 向けの独立した MCP サーバーです。Instructure または Canvas とは提携しておらず、承認や保守も受けていません。
2025年6月、この MCP の開発中に、bootcampspot.instructure.com の Canvas 環境で Broken Access Control の問題を特定しました。この問題により、私のコースに登録している他の学生の個人を特定できる情報が漏えいしました。
2025年6月5日に Bugcrowd を通じて問題を報告し、Instructure / Canvas のセキュリティ窓口にも直接連絡しました。その後、Bugcrowd の報告は「Not Applicable」としてクローズされました。その後のやり取りで、Instructure は bootcampspot.instructure.com の環境は管理対象外であると述べました。
公開されている参照情報:
- 開示に関するスレッド:https://www.reddit.com/r/cybersecurity/comments/1t6wmkw/reported_a_broken_access_control_bug_to/
- Bugcrowd の活動履歴:https://imgur.com/gallery/canvas-vuln-declared-n-11-months-ago-zYfHnBs
- その後の Instructure / BootcampSpot とのやり取り:https://imgur.com/a/BnhgXme
このリポジトリでは、エクスプロイトの手順、すでに公開されている情報を超える影響対象テナントの詳細、稼働中の URL、学生データを含むスクリーンショット、概念実証用の不正利用フローは公開していません。
これとは別に、Instructure は2026年5月に Canvas のセキュリティインシデントを公表し、公開報道ではこのインシデントと ShinyHunters の主張が関連付けられています。このリポジトリは、2025年6月の報告が2026年5月のインシデントを引き起こした、可能にした、予測した、または技術的に関連しているとは主張しません。
この開示は、プロジェクトの履歴と透明性のためにのみ記録しています。
これは何か
学生、教員、アカウント管理の機能を完全に備えた、Canvas LMS 向けの包括的な Model Context Protocol(MCP)サーバーです
🚀 v2.3.0 の新機能
- 🌐 新機能:Streamable HTTP トランスポートのサポート(
MCP_TRANSPORT=streamable-http) - 🖥️ 維持:ローカル MCP クライアント向けのファーストクラスの stdio トランスポート
- 🧪 追加:ライフサイクル、トランスポート、構造化された失敗時エラーの動作テスト
- 🧱 改善:より厳格なツールスキーマと、codemode を意識したツールの説明
- 🔧 修正:コース作成時の「page not found」エラー(
account_idパラメーターの不足) - 👨💼 アカウント管理:アカウントレベルの管理ツールを完備
- 📊 レポートと分析:Canvas アカウントのレポートを生成して参照
- 👥 ユーザー管理:アカウントレベルでユーザーを作成、管理
- 🏢 複数アカウントのサポート:アカウント階層とサブアカウントを管理
- ✅ API 準拠:すべてのエンドポイントが適切な Canvas API パターンに準拠
🎯 主な機能
🎓 学生向け
- コース管理:すべてのコース、シラバス、コース教材にアクセス
- 課題ワークフロー:課題の表示、提出(テキスト/URL/ファイル)、進捗の確認
- コミュニケーション:ディスカッションへの参加、お知らせの閲覧、メッセージの送信
- 進捗の追跡:成績、モジュールの完了状況、カレンダーの予定を確認
- クイズ:クイズの受験、結果とフィードバックの確認
- ファイルアクセス:コースのファイルやリソースの閲覧、ダウンロード
👨🏫 教員向け
- コース作成:コース構成を作成、管理(適切なアカウントサポートに対応)
- 採点:提出物の採点、フィードバックの提供、ルーブリックの管理
- ユーザー管理:学生の登録、権限の管理
- コンテンツ管理:課題、クイズ、ディスカッションの作成
👨💼 アカウント管理者向け(新機能!)
- アカウント管理:教育機関の Canvas アカウントを管理
- ユーザー管理:複数のアカウントにわたってユーザーを作成、管理
- コースの監督:アカウント内のすべてのコースを一覧表示、管理
- レポート作成:登録状況、成績、アクティビティのレポートを生成
- サブアカウント管理:アカウント階層と構造を管理
🛠️ 技術的な卓越性
- 堅牢な API:自動再試行、ページネーション、包括的なエラー処理
- クラウド対応:Docker コンテナ、Kubernetes マニフェスト、ヘルスチェック
- 十分なテスト:単体テスト、統合テスト、モック、カバレッジレポート
- 型安全:厳格な型を使用した TypeScript による完全な実装
- 50 以上のツール:Canvas LMS の機能を幅広く網羅
クイックスタート
オプション 1:Claude Desktop との連携(推奨 MCP セットアップ)
claude_desktop_config.json に追加します。
{
"mcpServers": {
"canvas-mcp-server": {
"command": "npx",
"args": ["-y", "canvas-mcp-server"],
"env": {
"CANVAS_API_TOKEN": "your_token_here",
"CANVAS_DOMAIN": "your_school.instructure.com"
}
}
}
}
オプション 2:NPM パッケージ
# Install globally
npm install -g canvas-mcp-server
# Configure
export CANVAS_API_TOKEN="your_token_here"
export CANVAS_DOMAIN="your_school.instructure.com"
# Run
canvas-mcp-server
オプション 3:Docker
docker run -d \
--name canvas-mcp \
-p 3000:3000 \
-e CANVAS_API_TOKEN="your_token" \
-e CANVAS_DOMAIN="school.instructure.com" \
-e MCP_TRANSPORT="streamable-http" \
-e MCP_HTTP_HOST="0.0.0.0" \
-e MCP_HTTP_PORT="3000" \
-e MCP_HTTP_PATH="/mcp" \
ghcr.io/dmontgomery40/mcp-canvas-lms:latest
トランスポートモード
サーバーは、明示的に指定できる 2 つのトランスポートモードをサポートしています。
stdio(デフォルト):Claude Desktop/Codex/Cursor でローカル MCP を接続する場合に最適です。streamable-http:ローカル HTTP 連携やコンテナ化されたワークフローに最適です。
トランスポート環境変数
# Required Canvas auth
CANVAS_API_TOKEN=your_token
CANVAS_DOMAIN=your_school.instructure.com
# Transport selection
MCP_TRANSPORT=stdio # or streamable-http
# Streamable HTTP settings
MCP_HTTP_HOST=127.0.0.1
MCP_HTTP_PORT=3000
MCP_HTTP_PATH=/mcp
MCP_HTTP_STATEFUL=true
MCP_HTTP_JSON_RESPONSE=true
MCP_HTTP_ALLOWED_ORIGINS=
💼 アカウント管理ワークフローの例
新しいコースを作成する(修正済み!)
"Create a new course called 'Advanced Biology' in account 123"
必須の account_id パラメーターを指定して、コースが正しく作成されるようになりました
ユーザーを管理する
"Create a new student user John Doe with email [email protected] in our main account"
適切な仮名設定と登録設定でユーザーアカウントを作成します
レポートを生成する
"Generate an enrollment report for account 456 for the current term"
組織の分析向けに Canvas のレポートシステムを起動します
アカウントのコースを一覧表示する
"Show me all published Computer Science courses in our Engineering account"
アカウントのコースカタログ全体を対象に、高度なフィルタリングと検索を行います
🎓 学生向けワークフローの例
今日の課題を確認する
"What assignments do I have due this week?"
提出期限、配点、提出状況とともに、今後の課題を一覧表示します
課題を提出する
"Help me submit my essay for English 101 Assignment 3"
書式設定オプションを使ったテキスト提出を案内します
成績を確認する
"What's my current grade in Biology?"
現在の得点、成績、課題へのフィードバックを表示します
ディスカッションに参加する
"Show me the latest discussion posts in my Philosophy class"
最近のディスカッションのトピックを表示し、返信を投稿できます
進捗を追跡する
"What modules do I need to complete in Math 200?"
モジュールの完了状況と、次に完了すべき項目を表示します
Canvas API トークンを取得する
- Canvas にログインします → アカウント → 設定
- 「Approved Integrations」までスクロールします
- 「+ New Access Token」をクリックします
- 説明を入力します:「Claude MCP Integration」
- 生成されたトークンをコピーします 安全に保管してください!
⚠️ アカウント管理者向けの注意:アカウントレベルの操作を行う場合は、API トークンに管理者権限があることを確認してください。
本番環境へのデプロイ
Docker Compose
git clone https://github.com/DMontgomery40/mcp-canvas-lms.git
cd mcp-canvas-lms
cp .env.example .env
# Edit .env with your Canvas credentials
docker-compose up -d
Kubernetes
kubectl create secret generic canvas-mcp-secrets \
--from-literal=CANVAS_API_TOKEN="your_token" \
--from-literal=CANVAS_DOMAIN="school.instructure.com"
kubectl apply -f k8s/
ヘルスモニタリング
# Check application health
curl http://localhost:3000/health
# Or use the built-in health check
npm run health-check
開発
# Setup development environment
git clone https://github.com/DMontgomery40/mcp-canvas-lms.git
cd mcp-canvas-lms
npm install
# Start development with hot reload
npm run dev:watch
# Run tests
npm run test
npm run coverage
# Code quality
npm run lint
npm run type-check
📚 利用可能なツール(50 種類以上)
🎓 学生向けコアツール(クリックして展開)
canvas_health_check- API 接続を確認canvas_list_courses- すべてのコースを一覧表示canvas_get_course- コースの詳細情報を取得canvas_list_assignments- コースの課題を一覧表示canvas_get_assignment- 課題の詳細を取得canvas_submit_assignment- 課題を提出canvas_get_submission- 提出状況を確認canvas_list_modules- コースのモジュールを一覧表示canvas_get_module- モジュールの詳細を取得canvas_list_module_items- モジュール内の項目を一覧表示canvas_mark_module_item_complete- 項目を完了済みにするcanvas_list_discussion_topics- ディスカッショントピックを一覧表示canvas_get_discussion_topic- ディスカッションの詳細を取得canvas_post_to_discussion- ディスカッションに投稿canvas_list_announcements- コースのお知らせを一覧表示canvas_get_user_grades- 自分の成績を取得canvas_get_course_grades- コースごとの成績を取得canvas_get_dashboard- ダッシュボード情報を取得canvas_get_dashboard_cards- コースカードを取得canvas_get_upcoming_assignments- 課題の締め切りを取得canvas_list_calendar_events- カレンダーの予定を一覧表示canvas_list_files- コースのファイルを一覧表示canvas_get_file- ファイルの詳細を取得canvas_list_folders- コースのフォルダーを一覧表示canvas_list_pages- コースのページを一覧表示canvas_get_page- ページの内容を取得canvas_list_conversations- メッセージを一覧表示canvas_get_conversation- 会話の詳細を取得canvas_create_conversation- メッセージを送信canvas_list_notifications- 通知を一覧表示canvas_get_syllabus- コースのシラバスを取得canvas_get_user_profile- ユーザープロフィールを取得canvas_update_user_profile- プロフィールを更新
👨🏫 教師向けツール(クリックして展開)
canvas_create_course- 新しいコースを作成 (修正済み:account_id が必須になりました)canvas_update_course- コース設定を更新canvas_create_assignment- 課題を作成canvas_update_assignment- 課題を更新canvas_list_assignment_groups- 課題グループを一覧表示canvas_submit_grade- 提出物を採点canvas_enroll_user- 学生を登録canvas_list_quizzes- コースのクイズを一覧表示canvas_get_quiz- クイズの詳細を取得canvas_create_quiz- クイズを作成canvas_start_quiz_attempt- クイズの受験を開始canvas_list_rubrics- コースのルーブリックを一覧表示canvas_get_rubric- ルーブリックの詳細を取得
👨💼 アカウント管理ツール(新機能!)
canvas_get_account- アカウントの詳細を取得canvas_list_account_courses- アカウント内のコースを一覧表示canvas_list_account_users- アカウント内のユーザーを一覧表示canvas_create_user- アカウントに新しいユーザーを作成canvas_list_sub_accounts- サブアカウントを一覧表示canvas_get_account_reports- 利用可能なレポートを一覧表示canvas_create_account_report- アカウントレポートを生成
🔧 v2.2.0 の破壊的変更
コース作成の修正
修正前(不具合あり):
{
"tool": "canvas_create_course",
"arguments": {
"name": "My Course" // ❌ Missing account_id - caused "page not found"
}
}
修正後:
{
"tool": "canvas_create_course",
"arguments": {
"account_id": 123, // ✅ Required account_id
"name": "My Course",
"course_code": "CS-101"
}
}
🌟 Claude との会話例
学生:「今後の課題を確認して、英語のエッセイを提出したいです」
Claude:今後の課題を確認してから、英語のエッセイの提出をお手伝いします。まず、今後の課題を取得します……
[Claude は canvas_get_upcoming_assignments を使用し、その後 canvas_submit_assignment で提出を支援します]
講師:「理学部に新しい上級物理学コースを作成して、ティーチングアシスタントを登録してください」
Claude:理学部のアカウントに上級物理学コースを作成し、その後、TA を登録します……
[Claude は適切な account_id を指定して canvas_create_course を使用し、その後 canvas_enroll_user を使用します]
管理者:「今学期のすべてのコンピューターサイエンスコースの登録レポートを作成してください」
Claude:コンピューターサイエンスコースの包括的な登録レポートを作成します……
[Claude はフィルターを使って canvas_list_account_courses を使用し、その後 canvas_create_account_report を使用します]
🔍 トラブルシューティング
よくある問題:
- ❌ 401 Unauthorized:API トークンと権限を確認してください
- ❌ 404 Not Found:コース/課題の ID とアクセス権を確認してください
- ❌ コース作成時に「Page not found」:account_id の修正を含む v2.2.0 に更新してください
- ❌ タイムアウト:
CANVAS_TIMEOUTを増やすか、ネットワーク接続を確認してください
デバッグモード:
export LOG_LEVEL=debug
npm start
ヘルスチェック:
npm run health-check
🤝 貢献
貢献を歓迎します!ガイドラインについては、CONTRIBUTING.md をご覧ください。
簡単な貢献のセットアップ
git clone https://github.com/DMontgomery40/mcp-canvas-lms.git
cd mcp-canvas-lms
npm install
npm run dev:watch
# Make changes, add tests, submit PR
📈 ロードマップ
- v2.3:レポート機能の強化、一括操作、高度な検索
- v2.4:モバイル対応、オフライン機能、分析ダッシュボード
- v3.0:マルチテナント、GraphQL API、AI によるインサイト
🙋 サポートとコミュニティ
- 🐛 バグ報告:GitHub Issues
- 💬 質問:GitHub Discussions
- 📖 ドキュメント:Wiki
付録:実践における MCP(コード実行、ツールの規模、安全性)
最終更新日:2026-03-23
この付録の目的
MCP は、エージェント型ツールの相互運用性を実現する、今なお非常に有用なレイヤーです。一方で、大規模な MCP サーバーは数十ものツールを公開することがあり、単純なツール呼び出しでは、ツールスキーマ、呼び出しのトレース、情報量の少ないやり取りによってコンテキストウィンドウが埋め尽くされることがあります。
実際には、オーケストレーションのトークン効率を保ち、実行動作を制約できる場合にのみ、大規模なツール群が役立ちます。
コード実行/コードモードへの移行
近年の本番ワークフローでは、オーケストレーションを会話のターンから実行可能なループへ移行しています。これにより、コンテキストのオーバーヘッドを抑え、決定性を高め、実行を監査可能にできます。
参考資料:
パワーユーザーに推奨するセットアップ
ノイズが少なく、繰り返し使える MCP の利用を目指す場合は、まずコードモードを中心としたルーティングを導入してください。
優れたセットアップを整えても、モデルの挙動はプロバイダーやバージョンによって安定しないことがあります。リトライと決定論的なフォールバックを用意してください。
Peter Steinberger のワークフローパターン
効果の高いパターンのひとつは、幅広い MCP ツール群を、より限定された CLI/タスク用インターフェイスに変換することです。
どの MCP クライアントに何が最適か
- Claude Code/Codex/Cursor のエージェントワークフロー:MCP とコード実行を直接組み合わせるループに適している場合が多いです。
- 薄型のホスト型チャットクライアント:ツールをすべてそのまま公開するよりも、ラップした CLI やゲートウェイを使うほうが安全な場合が多いです。
- 多数のツールを持つサーバー:用途を絞ったタスクゲートウェイに分割したほうが適している場合が多いです。
このエコシステムは急速に変化しています。今この内容を読んでいる場合、このセクションの一部はすでに古くなっている可能性があります。
プロンプトインジェクション:リスク、影響、緩和策
ツールを使用するエージェントにとって、プロンプトインジェクションは依然として未解決の問題です。対処は可能ですが、解決には至っていません。
主なリスク:
- 取得したコンテンツやツールの出力に隠された指示。
- 意図しない呼び出しによるシークレットやトークンの流出。
- システムやデータに対する不正な状態変更。
基本的な緩和策:
- 最小権限の認証情報とスコープを限定したトークン。
- 宛先とアクションの許可リスト、および厳格なスキーマ検証。
- 破壊的な操作に対する人間の確認。
- サンドボックスでの実行とリソース制限。
- 構造化ログと再実行可能な実行トレース。
明示的に検証されていない限り、すべてのツール出力を信頼できない入力として扱ってください。
📄 ライセンス
MIT License - 詳細は LICENSE ファイルをご覧ください。
シームレスな Canvas 連携で、学生、教育者、管理者を支援します
⭐ 役に立ったら、このリポジトリにスターを付けてください! ⭐
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。