codex_canvas_mcp
Codex Canvas MCP
Ein portabler lokaler MCP-Server, der kompatiblen Clients das Lesen von Canvas und – erst nach mehreren unabhängigen Sicherheitsprüfungen – das Erstellen gängiger Kursinhalte ermöglicht.
Sicherheitsmodell
Canvas-Lesezugriffe sind nach der lokalen Einrichtung der Anmeldedaten standardmäßig verfügbar.
Schreiben ist standardmäßig deaktiviert.
Jeder Inhalts-Schreibvorgang erfordert eine aktivierte lokale Richtlinie, eine exakte Übereinstimmung mit der Whitelist pro Kurs, exakten Bestätigungstext und die Genehmigung im MCP-Client.
Der Bild-Upload fügt ein Payload-Gate hinzu: Nur ein lokal gehöriges PNG, JPEG oder WebP in einem konfigurierten vertrauenswürdigen Ordner, nicht größer als 10 MiB, kann gesendet werden.
Es gibt kein generisches Canvas-Schreibwerkzeug.
Anmeldedaten bleiben in 1Password und optional in der macOS-Schlüsselbund. Sie gehören nicht in dieses Repository oder die Client-Konfiguration.
Jedes Inhaltswerkzeug ist als verändernd und destruktiv markiert, damit kompatible Clients eine Genehmigung verlangen können. Der lokale Server lehnt einen Aufruf auch ab, es sei denn, seine exakte Bestätigung stimmt mit der angeforderten Aktion überein, zum Beispiel APPROVE CANVAS MODULE WRITE course <course_id>.
Die Rubrik-Erstellung akzeptiert eine Canvas-Aufgaben-URL mit gleicher Herkunft, eine URL für ein Modul-Element einer Aufgabe oder eine Kurs-URL mit einem assignment_id-Abfrageparameter. Abfragezeichenfolgen und Fragmente werden ignoriert, nachdem Kurs und Aufgabe aufgelöst wurden. Die URL umgeht niemals die Kursrichtlinie: Ihre Kurs-ID muss weiterhin explizit auf der Whitelist stehen, und die Rubrik-Erstellung erfordert APPROVE CANVAS RUBRIC WRITE course <course_id>. Das Werkzeug weigert sich, eine vorhandene Aufgaben-Rubrik zu ersetzen, verlangt Beschreibungen für jedes Kriterium und jede Bewertung und verlangt, dass die Bewertungsrubrik-Punkte mit den Aufgabenpunkten übereinstimmen.
Related MCP server: CoursePack Local MCP Server
Was enthalten ist
Tool | Fähigkeit | Standard |
| Lies das authentifizierte Profil | Verfügbar |
| Lies Module und Elemente für einen Kurs | Verfügbar |
| GET einen normalisierten Canvas-API-v1-Pfad | Verfügbar |
| Lokalen Richtlinienstatus prüfen | Verfügbar |
| Ein verifiziertes Bild aus dem konfigurierten vertrauenswürdigen Ordner hochladen | Blockiert |
| Eine Seite erstellen oder aktualisieren | Blockiert |
| Ein Modul erstellen | Blockiert |
| Ein Inhaltselement in einem Modul platzieren | Blockiert |
| Eine Aufgabe erstellen | Blockiert |
| Eine Aufgaben-Rubrik aus einer Canvas-URL erstellen und anhängen | Blockiert |
| Eine Diskussion erstellen | Blockiert |
| Ein Classic Quiz erstellen | Blockiert |
| Eine Frage zu einem Classic Quiz hinzufügen | Blockiert |
| Eine Seite löschen | Blockiert |
| Eine Aufgabe löschen | Blockiert |
| Eine Diskussion löschen | Blockiert |
| Ein Classic Quiz löschen | Blockiert |
| Ein Modul und seine Elementplatzierungen löschen | Blockiert |
Ein neues Mac einrichten
Voraussetzungen: Python 3.11 oder neuer, die 1Password-CLI, ein 1Password-Dienstkonto, das nur das vorgesehene Canvas-Anmeldedatenelement lesen kann, und ein Canvas-API-Token mit den geringsten für Ihre Arbeit praktikablen Berechtigungen.
Klonen und in eine isolierte Umgebung installieren:
git clone https://github.com/mrchris-ai/codex_canvas_mcp.git
cd codex_canvas_mcp
python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -e .Erstellen Sie ein 1Password-Element, dessen verborgenes Feld das Canvas-API-Token enthält. Geben Sie dem Dienstkonto nur Lesezugriff auf den enthaltenden Tresor/das enthaltende Element. Notieren Sie den Tresornamen, den Elementnamen oder die Element-ID und die Bezeichnung des verborgenen Feldes; geben Sie deren Werte nicht in dieses Repository.
Wählen Sie eine Zustellmethode für das Dienstkonto-Token:
Für eine kurzlebige Shell-Sitzung stellen Sie
OP_SERVICE_ACCOUNT_TOKENüber Ihren lokalen Geheimnis-Launcher für den MCP-Serverprozess bereit.Speichern Sie dieses Token unter macOS in der Schlüsselbund und konfigurieren Sie nicht-geheime Suchbezeichnungen. Beispielbefehl (er fragt sicher ab; geben Sie das Token nicht in die Befehlszeile ein):
security add-generic-password -U -s "your-service-label" -a "your-account-label" -wKonfigurieren Sie den Serverprozess mit diesen nicht-geheimen Werten:
Variable
Zweck
CANVAS_BASE_URLCanvas-HTTPS-Ursprung, z. B.
https://school.instructure.comCANVAS_OP_VAULT1Password-Tresorname oder -ID
CANVAS_OP_ITEMName oder ID des Canvas-Anmeldedatenelements
CANVAS_OP_FIELDBezeichnung des verborgenen Token-Feldes; Standard ist
credentialCANVAS_KEYCHAIN_SERVICEmacOS-Schlüsselbund-Dienstbezeichnung, wenn
OP_SERVICE_ACCOUNT_TOKENnicht verwendet wirdCANVAS_KEYCHAIN_ACCOUNTmacOS-Schlüsselbund-Kontobezeichnung, wenn
OP_SERVICE_ACCOUNT_TOKENnicht verwendet wirdCANVAS_IMAGE_UPLOAD_ROOTAbsoluter Pfad zu dem einzigen lokalen Ordner, aus dem Bild-Upload erlaubt ist
Testen Sie nur die Protokoll- und Sicherheitsgates, ohne Canvas zu kontaktieren oder Anmeldedaten zu lesen:
python -m unittest discover -s tests -v
printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | python -m canvas_mcpFügen Sie den stdio-Server zu Codex hinzu. Die Form auf Projektebene ist:
[mcp_servers.canvas]
command = "/absolute/path/to/codex_canvas_mcp/.venv/bin/python"
args = ["-m", "canvas_mcp"]
[mcp_servers.canvas.env]
CANVAS_BASE_URL = "https://school.instructure.com"
CANVAS_OP_VAULT = "your-vault"
CANVAS_OP_ITEM = "your-item"
CANVAS_OP_FIELD = "credential"
CANVAS_KEYCHAIN_SERVICE = "your-service-label"
CANVAS_KEYCHAIN_ACCOUNT = "your-account-label"
CANVAS_IMAGE_UPLOAD_ROOT = "/absolute/path/to/reviewed/canvas-images"Fügen Sie dies in die .codex/config.toml des vertrauenswürdigen Projekts oder in Ihre persönliche Codex-Konfiguration ein. Fügen Sie keine geheimen Werte hinzu. Starten Sie neu oder öffnen Sie eine neue Aufgabe, nachdem Sie die MCP-Konfiguration geändert haben, und überprüfen Sie dann die aufgelisteten Werkzeuge, bevor Sie Canvas-Daten anfordern.
ChatGPT-Kompatibilität
Dieses Repository implementiert einen lokalen stdio-MCP-Server für Codex und andere Clients, die lokales stdio-MCP unterstützen. Aktuelle benutzerdefinierte ChatGPT-Apps verbinden sich nicht direkt mit einem lokalen stdio-Server. Die aktuelle Anleitung von OpenAI besteht darin, ein privates lokales MCP über den Secure MCP Tunnel bereitzustellen (oder einen geprüften entfernten MCP-Endpunkt bereitzustellen), abhängig von der Verfügbarkeit des Plans und des Workspace-Administrators. Setzen Sie diesen Prozess nicht direkt dem öffentlichen Internet aus.
Siehe Entwicklermodus und MCP-Apps in ChatGPT, bevor Sie die ChatGPT-Einrichtung versuchen; Verfügbarkeit und Genehmigungsverhalten können sich ändern.
Aktivieren von Inhaltserstellungswerkzeugen
Halten Sie das Schreiben deaktiviert, es sei denn, eine bestimmte Aufgabe erfordert es.
Kopieren Sie
config/write-policy.example.jsonan einen Ort außerhalb des Repositorys.Fügen Sie nur die genauen Canvas-Kurs-IDs hinzu, die für die Inhaltserstellung genehmigt sind.
Setzen Sie
enabledauftrueund schränken Sie die Datei ein:
chmod 600 /absolute/private/path/write-policy.jsonFügen Sie
CANVAS_WRITE_POLICY=/absolute/private/path/write-policy.jsonzur MCP-Serverumgebung hinzu.Starten Sie den Client neu und rufen Sie
canvas_get_write_policyauf, um die wirksame Richtlinie zu überprüfen.Überprüfen Sie bei jedem Inhalts-Schreibvorgang das genaue Ziel und die Nutzlast. Geben Sie den aktionsspezifischen Bestätigungssatz an und genehmigen Sie die verändernde Aktion im Client.
Deaktivieren Sie die Richtlinie erneut, wenn die Aufgabe abgeschlossen ist.
Wenn die Variable fehlt, die Datei fehlt, die Berechtigungen breiter als 0600 sind, das Schreiben deaktiviert ist oder der Kurs nicht auf der Whitelist steht, verweigert der Server den Schreibvorgang.
Aktivieren des Bild-Uploads
Der Bild-Upload verwendet dieselbe lokale Schreibrichtlinie und exakte Kurs-Whitelist sowie CANVAS_IMAGE_UPLOAD_ROOT. Das Werkzeug lehnt relative Pfade, symbolische Links, Dateien außerhalb dieses Stammverzeichnisses, Dateien, die nicht dem aktuellen Benutzer gehören, nicht unterstützte Bildtypen, Dateien, deren binäre Signatur nicht mit der Erweiterung übereinstimmt, und Dateien größer als 10 MiB ab. Die exakte Bestätigung lautet APPROVE CANVAS IMAGE UPLOAD course <course_id>.
Canvas verwendet einen dokumentierten dreistufigen Upload-Austausch: Initialisieren Sie die Kursdatei über die authentifizierte API, senden Sie das Bild ohne das Canvas-Zugriffstoken an die von Canvas zurückgegebene HTTPS-Speicher-URL und authentifizieren Sie den zurückgegebenen Canvas-Abschlussort mit gleicher Herkunft. Das Werkzeug liest dann /api/v1/courses/<course_id>/files/<file_id> und prüft MIME-Typ und Größe, bevor es einen persistenten Kursvorschau-Pfad zurückgibt. Es gibt niemals Speichersignaturen oder die Datei-Download-Verifizierer-URL zurück.
Aktuelle Erstellungsgrenze
Dieses Projekt ist die maßgebliche Quelle für das gemeinsame lokale Canvas-MCP, das von unterstützten Chats auf diesem Mac verwendet wird. Es kann Seiten, Module und Modulelemente, Aufgaben und Aufgaben-Rubriken, Diskussionen und Classic Quizzes mit Fragen nach den üblichen Richtlinien- und Genehmigungsgates erstellen. Es bietet auch ressourcenspezifische Löschwerkzeuge für Seiten, Aufgaben, Diskussionen, Classic Quizzes und Module; das Löschen eines Moduls entfernt seine Elementplatzierungen, aber nicht die zugrunde liegenden Kursinhalte. Seine einzige lokale Dateifähigkeit ist der oben beschriebene, durch Payload-Gate geschützte Bild-Uploader. Generischer Datei-Upload, New Quizzes und Konto-/Kursverwaltung bleiben nicht unterstützt.
Siehe docs/2026-08-06-content-authoring-extension.md für die Implementierung und den End-to-End-Validierungsbericht.
Siehe docs/2026-08-16-image-upload-extension.md für das Bedrohungsmodell und den Validierungsbericht zum Bild-Upload.
Entwicklung
python -m pip install -e .
python -m unittest discover -s tests -v
python -m compileall -q src testsTests mocken Netzwerk- und Anmeldedatengrenzen. Siehe AGENTS.md für Invarianten, die Mitwirkende bewahren müssen, und ROADMAP.md für absichtlich aufgeschobene administrative Funktionen.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA local MCP server for Canvas LMS that enables querying courses, assignments, grades, modules, and more from any MCP-compatible AI client.19MIT
- FlicenseNot gradedqualityAmaintenanceRead-only MCP server that provides Claude Desktop with access to converted Canvas course exports, including Markdown files, reports, and search tools for local course content.
- AlicenseNot gradedqualityCmaintenanceA remote MCP server for querying Canvas LMS courses, assignments, and grades. Enables natural language interaction with Canvas data via MCP clients like Claude Desktop.19MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for Canvas LMS with automatic OAuth authentication. Enables interaction with courses, assignments, grades, modules, discussions, quizzes, files, calendar, messaging, and more without manual API token management.339MIT
Related MCP Connectors
MCP server for the Inistate platform: module discovery, entry management, and activity submission.
A MCP server built for developers enabling Git based project management with project and personal…
An MCP server for deep research or task groups
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mrchris-ai/codex_canvas_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server