codex_canvas_mcp
Codex Canvas MCP
Un servidor MCP local y portátil que permite a clientes compatibles leer Canvas y, solo después de varias comprobaciones de seguridad independientes, crear contenido común de curso.
Modelo de seguridad
Las lecturas de Canvas están disponibles por defecto tras la configuración local de credenciales.
La escritura está deshabilitada por defecto.
Cada escritura de contenido requiere una política local habilitada, una coincidencia exacta en la lista de permitidos por curso, un texto de confirmación exacto y la aprobación en el cliente MCP.
La subida de imágenes añade una comprobación de carga útil: solo se puede enviar un PNG, JPEG o WebP de propiedad local dentro de una carpeta de confianza configurada, con un tamaño máximo de 10 MiB.
No existe una herramienta genérica de escritura en Canvas.
Las credenciales permanecen en 1Password y, opcionalmente, en el Llavero de macOS. No pertenecen a este repositorio ni a la configuración del cliente.
Cada herramienta de contenido está marcada como mutante y destructiva para que los clientes compatibles puedan exigir aprobación. El servidor local también rechaza una llamada a menos que su confirmación exacta coincida con la acción solicitada, por ejemplo APPROVE CANVAS MODULE WRITE course <course_id>.
La creación de rúbricas acepta una URL de asignación de Canvas del mismo origen, una URL de elemento de módulo de asignación o una URL de curso que contenga un parámetro de consulta assignment_id. Las cadenas de consulta y los fragmentos se ignoran después de resolver el curso y la asignación. La URL nunca elude la política del curso: su ID de curso debe estar explícitamente en la lista de permitidos, y la creación de rúbricas requiere APPROVE CANVAS RUBRIC WRITE course <course_id>. La herramienta se niega a reemplazar una rúbrica de asignación existente, requiere descripciones para cada criterio y calificación, y exige que los puntos de la rúbrica de calificación coincidan con los puntos de la asignación.
Related MCP server: CoursePack Local MCP Server
Qué se incluye
Herramienta | Capacidad | Por defecto |
| Leer el perfil autenticado | Disponible |
| Leer módulos y elementos de un curso | Disponible |
| GET de una ruta normalizada de la API v1 de Canvas | Disponible |
| Inspeccionar el estado de la política local | Disponible |
| Subir una imagen verificada desde la carpeta de confianza configurada | Bloqueado |
| Crear o actualizar una página | Bloqueado |
| Crear un módulo | Bloqueado |
| Colocar un elemento de contenido en un módulo | Bloqueado |
| Crear una asignación | Bloqueado |
| Crear y adjuntar una rúbrica de asignación desde una URL de Canvas | Bloqueado |
| Crear un debate | Bloqueado |
| Crear un Cuestionario Clásico | Bloqueado |
| Añadir una pregunta a un Cuestionario Clásico | Bloqueado |
| Eliminar una página | Bloqueado |
| Eliminar una asignación | Bloqueado |
| Eliminar un debate | Bloqueado |
| Eliminar un Cuestionario Clásico | Bloqueado |
| Eliminar un módulo y sus ubicaciones de elementos | Bloqueado |
Configurar un nuevo Mac
Requisitos previos: Python 3.11 o superior, la CLI de 1Password, una cuenta de servicio de 1Password que pueda leer solo el elemento de credenciales de Canvas previsto, y un token de API de Canvas con los privilegios mínimos prácticos para tu trabajo.
Clona e instala en un entorno aislado:
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 .Crea un elemento de 1Password cuyo campo oculto contenga el token de API de Canvas. Da a la cuenta de servicio acceso de lectura solo al contenedor/elemento correspondiente. Anota el nombre del contenedor, el nombre o ID del elemento y la etiqueta del campo oculto; no pongas sus valores en este repositorio.
Elige un método de entrega del token de cuenta de servicio:
Para una sesión de shell de corta duración, proporciona
OP_SERVICE_ACCOUNT_TOKENal proceso del servidor MCP a través de tu lanzador de secretos local.En macOS, guarda ese token en el Llavero y configura etiquetas de búsqueda no secretas. Ejemplo de comando (solicita de forma segura; no pongas el token en la línea de comandos):
security add-generic-password -U -s "your-service-label" -a "your-account-label" -w
Configura el proceso del servidor con estos valores no secretos:
Variable
Propósito
CANVAS_BASE_URLOrigen HTTPS de Canvas, como
https://school.instructure.comCANVAS_OP_VAULTNombre o ID del contenedor de 1Password
CANVAS_OP_ITEMNombre o ID del elemento de credenciales de Canvas
CANVAS_OP_FIELDEtiqueta del campo de token oculto; por defecto
credentialCANVAS_KEYCHAIN_SERVICEEtiqueta de servicio del Llavero de macOS cuando no se usa
OP_SERVICE_ACCOUNT_TOKENCANVAS_KEYCHAIN_ACCOUNTEtiqueta de cuenta del Llavero de macOS cuando no se usa
OP_SERVICE_ACCOUNT_TOKENCANVAS_IMAGE_UPLOAD_ROOTRuta absoluta a la única carpeta local desde la que se permite subir imágenes
Prueba solo el protocolo y las comprobaciones de seguridad, sin contactar con Canvas ni leer credenciales:
python -m unittest discover -s tests -v printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | python -m canvas_mcpAñade el servidor stdio a Codex. La forma a nivel de proyecto es:
[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"Pon esto en el
.codex/config.tomldel proyecto de confianza o en tu configuración personal de Codex. No añadas valores secretos. Reinicia o abre una nueva tarea después de cambiar la configuración de MCP y verifica las herramientas listadas antes de solicitar datos de Canvas.
Compatibilidad con ChatGPT
Este repositorio implementa un servidor MCP stdio local para Codex y otros clientes que admitan MCP stdio local. Las aplicaciones personalizadas actuales de ChatGPT no se conectan directamente a un servidor stdio local. La guía actual de OpenAI es exponer un MCP local privado a través de Secure MCP Tunnel (o implementar un endpoint MCP remoto revisado), sujeto a la disponibilidad del plan y del administrador del espacio de trabajo. No expongas este proceso directamente a la internet pública.
Consulta Modo desarrollador y aplicaciones MCP en ChatGPT antes de intentar la configuración de ChatGPT; la disponibilidad y el comportamiento de aprobación pueden cambiar.
Habilitar herramientas de creación de contenido
Mantén la escritura desactivada a menos que una tarea específica lo requiera.
Copia
config/write-policy.example.jsona una ubicación fuera del repositorio.Añade solo los IDs de curso de Canvas exactos aprobados para la creación de contenido.
Establece
enabledentruey restringe el archivo:chmod 600 /absolute/private/path/write-policy.jsonAñade
CANVAS_WRITE_POLICY=/absolute/private/path/write-policy.jsonal entorno del servidor MCP.Reinicia el cliente y llama a
canvas_get_write_policypara verificar la política efectiva.Para cada escritura de contenido, revisa el objetivo y la carga útil exactos. Proporciona la frase de confirmación específica de la acción y aprueba la acción mutante en el cliente.
Desactiva la política de nuevo cuando la tarea esté completa.
Si la variable está ausente, el archivo falta, los permisos son más amplios que 0600, la escritura está deshabilitada o el curso no está en la lista de permitidos, el servidor rechaza la escritura.
Habilitar la subida de imágenes
La subida de imágenes usa la misma política de escritura local y la lista de permitidos exacta por curso, además de CANVAS_IMAGE_UPLOAD_ROOT. La herramienta rechaza rutas relativas, enlaces simbólicos, archivos fuera de esa raíz, archivos no propiedad del usuario actual, tipos de imagen no admitidos, archivos cuya firma binaria no coincide con la extensión y archivos de más de 10 MiB. La confirmación exacta es APPROVE CANVAS IMAGE UPLOAD course <course_id>.
Canvas usa un intercambio de subida documentado en tres pasos: inicializar el archivo del curso a través de la API autenticada, enviar la imagen sin el token de acceso de Canvas a la URL de almacenamiento HTTPS devuelta por Canvas, y autenticar la ubicación de finalización de Canvas del mismo origen devuelta. La herramienta luego lee /api/v1/courses/<course_id>/files/<file_id> y comprueba el tipo MIME y el tamaño antes de devolver una ruta de vista previa persistente del curso. Nunca devuelve firmas de almacenamiento ni la URL de verificación de descarga de archivos.
Límite de creación actual
Este proyecto es la fuente de verdad para el MCP de Canvas local compartido utilizado por los chats compatibles en este Mac. Puede crear Páginas, Módulos y elementos de módulo, Asignaciones y Rúbricas de asignación, Debates y Cuestionarios Clásicos con preguntas después de las comprobaciones normales de política y aprobación. También proporciona herramientas de eliminación específicas para Páginas, Asignaciones, Debates, Cuestionarios Clásicos y Módulos; eliminar un Módulo quita sus ubicaciones de elementos pero no el contenido subyacente del curso. Su única capacidad de archivos locales es el subidor de imágenes con comprobación de carga útil descrito anteriormente. La subida de archivos genérica, los Nuevos Cuestionarios y la administración de cuentas/cursos siguen sin ser compatibles.
Consulta docs/2026-08-06-content-authoring-extension.md para el registro de implementación y validación de extremo a extremo.
Consulta docs/2026-08-16-image-upload-extension.md para el modelo de amenazas y el registro de validación de la subida de imágenes.
Desarrollo
python -m pip install -e .
python -m unittest discover -s tests -v
python -m compileall -q src testsLas pruebas simulan los límites de red y credenciales. Consulta AGENTS.md para los invariantes que los contribuyentes deben preservar y ROADMAP.md para las características administrativas diferidas intencionalmente.
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