Canvas API MCP

Servidor MCP de Canvas para Canvas LMS: 16 herramientas estudiantiles seleccionadas para tareas, calificaciones, plazos y archivos, además de una pasarela que accede a los 1.116 endpoints de la API de Canvas.

Documentación

canvas-api-mcp

Nunca vuelvas a perder una fecha límite.

Pregunta a tu IA qué tienes pendiente y lee la respuesta directamente desde Canvas:
fechas límite reales, estado real de las entregas, sin copiar nada.

Un servidor MCP para Canvas LMS. 16 herramientas seleccionadas para el trabajo diario de los estudiantes, además de una puerta de enlace que llega a todos los endpoints que expone tu instancia de Canvas.

Terminal. Pregunta uno: '¿qué módulos curso este semestre?' Respondida al instante por la herramienta seleccionada my_courses (CS3230, CS2040S, MA2001, GEA1000). Pregunta dos: '¿en qué grupos estoy?' Ninguna herramienta seleccionada lo cubre, así que search_canvas_api encuentra GET /v1/users/self/groups entre 1,116 endpoints de Canvas y canvas_request lo ejecuta. 18 herramientas · 1,116 endpoints accesibles · 149 pruebas · MIT.

📖 Documentación: mcp.johannsenlum.com/canvas-lms · guía de instalación · referencia de herramientas · habilidades · cumplimiento

PyPI Python 3.11+ License: MIT MCP Registry GitHub stars

Software de uso personal. La política de API de Canvas exige OAuth para aplicaciones utilizadas por varias personas, y OAuth de Canvas no puede implementarse de forma segura en software instalado localmente (sin PKCE, y client_secret no puede distribuirse en un paquete). Úsalo con tu propio token y en tu propia cuenta. Consulta Cumplimiento.

Qué puedes preguntarle

Preguntas reales y qué herramienta las responde.

Tú: ¿Qué tengo que entregar esta semana? Claude: (llama a whats_due): Tienes 3 cosas pendientes: Problem Set 4 (jueves, CS3230), una respuesta en el foro (viernes, IS4302) y el informe del hito 2 (domingo, EE2211).

Tú: ¿Cómo voy en mi curso de bases de datos y qué hay en el temario de la semana 6? Claude: (llama a my_grades, luego a get_syllabus, y luego a course_content para el módulo de la semana 6): Vas al 87% en general. La semana 6 cubre normalización y tiene una lectura más un archivo de laboratorio que entregar el viernes.

Tú: Resume las notas en PDF de la clase 8 y muestra mi entrega del ensayo para que pueda ver los comentarios. Claude: (llama a list_files + read_file para el PDF, luego a my_submission para el ensayo): ...

Tú: Responde al foro "Equipos de proyecto" y di que estoy libre después de las 3 p. m. para la reunión de grupo. Claude: (llama a post_discussion_reply ✏️): Publicado en el hilo.

Tú: ¿Canvas me ha dado alguna vez estadísticas de cuestionarios desglosadas por pregunta, a lo largo de todo el semestre? Claude: (llama a search_canvas_api para encontrar el endpoint correcto, luego a canvas_request para llamarlo): ...

El último ejemplo es el punto de las herramientas de puerta de enlace: si un endpoint existe en tu instancia de Canvas, search_canvas_api puede encontrarlo y canvas_request puede llamarlo, aunque solo 16 herramientas estén seleccionadas manualmente.

Instalación

Requisitos previos

  • Python 3.11+

  • Un token de acceso personal de Canvas. Tu institución debe permitir que los estudiantes los creen: revisa Canvas → Cuenta → Configuración → Integraciones aprobadas para ver un botón "+ Nuevo token de acceso". Guía completa con capturas de pantalla: mcp.johannsenlum.com/canvas-lms/install.

    Ten en cuenta que el token caduca. Desde la actualización de seguridad de Instructure de octubre de 2025, las cuentas con solo roles de estudiante deben establecer una caducidad de no más de 120 días, y las instituciones suelen limitarla a menos (NUS permite 90). Anota la fecha: un token caducado hace que todas las herramientas devuelvan 401 a la vez, lo que parece una instalación rota en lugar de una credencial que simplemente se agotó.

Ejecutar el servidor

canvas-api-mcp está publicado en PyPI. Ejecútalo con:

uvx canvas-api-mcp

Instalar desde el código fuente (colaboradores / main sin publicar). No forma parte de la ruta de instalación normal anterior; solo se necesita si quieres el código más reciente sin publicar en lugar de la versión publicada en PyPI:

uvx --from git+https://github.com/JohannsenLum/canvas-api-mcp canvas-api-mcp

O ejecútalo desde un clon local:

git clone https://github.com/JohannsenLum/canvas-api-mcp
cd canvas-api-mcp
uv sync

Instalación rápida (un clic)

Existen enlaces de un clic para Cursor, VS Code y LM Studio únicamente. Ningún otro cliente tiene un formato de enlace de instalación documentado. Estos rellenan previamente la configuración a continuación, pero aún necesitan que CANVAS_BASE_URL y CANVAS_TOKEN se completen después.

Add to Cursor Add to VS Code Add to LM Studio

Todos los clientes (configuración manual)

Tu token permanece en tu máquina, en tu propio archivo de configuración. Nunca se transmite a ningún lugar excepto directamente a tu instancia de Canvas.

Cliente¿Enlace directo?
Claude Codeno
Claude Desktopno
Cursorsí, arriba
VS Codesí, arriba
LM Studiosí, arriba
Zedno
Windsurfno (Windsurf solo resuelve servidores en su propio registro)

Claude Code: ~/.claude.json
{
  "mcpServers": {
    "canvas": {
      "command": "uvx",
      "args": ["canvas-api-mcp"],
      "env": {
        "CANVAS_BASE_URL": "https://canvas.yourschool.edu",
        "CANVAS_TOKEN": "your-token-here"
      }
    }
  }
}

Claude Desktop: claude_desktop_config.json

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json

No existe instalación de un clic para Claude Desktop (instala paquetes .mcpb, no enlaces directos). Copia este JSON mediante Configuración → Desarrollador → Editar configuración:

{
  "mcpServers": {
    "canvas": {
      "command": "uvx",
      "args": ["canvas-api-mcp"],
      "env": {
        "CANVAS_BASE_URL": "https://canvas.yourschool.edu",
        "CANVAS_TOKEN": "your-token-here"
      }
    }
  }
}

Cursor: ~/.cursor/mcp.json

Alternativa al botón anterior, o si prefieres pegarlo directamente:

{
  "mcpServers": {
    "canvas": {
      "command": "uvx",
      "args": ["canvas-api-mcp"],
      "env": {
        "CANVAS_BASE_URL": "https://canvas.yourschool.edu",
        "CANVAS_TOKEN": "your-token-here"
      }
    }
  }
}

VS Code: .vscode/mcp.json

Alternativa al botón anterior, o si prefieres pegarlo directamente. Ten en cuenta que VS Code usa una clave servers, no mcpServers:

{
  "servers": {
    "canvas": {
      "type": "stdio",
      "command": "uvx",
      "args": ["canvas-api-mcp"],
      "env": {
        "CANVAS_BASE_URL": "https://canvas.yourschool.edu",
        "CANVAS_TOKEN": "your-token-here"
      }
    }
  }
}

LM Studio: mcp.json (Programa → Instalar → Editar mcp.json)

Alternativa al botón anterior, o si prefieres pegarlo directamente:

{
  "mcpServers": {
    "canvas": {
      "command": "uvx",
      "args": ["canvas-api-mcp"],
      "env": {
        "CANVAS_BASE_URL": "https://canvas.yourschool.edu",
        "CANVAS_TOKEN": "your-token-here"
      }
    }
  }
}

Zed: settings.json

No existe enlace directo para Zed. Añade esto bajo context_servers en tu configuración de Zed:

{
  "context_servers": {
    "canvas": {
      "source": "custom",
      "command": "uvx",
      "args": ["canvas-api-mcp"],
      "env": {
        "CANVAS_BASE_URL": "https://canvas.yourschool.edu",
        "CANVAS_TOKEN": "your-token-here"
      }
    }
  }
}

Windsurf: ~/.codeium/windsurf/mcp_config.json

No existe enlace directo para Windsurf. Solo resuelve servidores desde su propio registro, así que esto debe pegarse manualmente mediante Configuración de Windsurf → Servidores MCP → Editar configuración sin procesar:

{
  "mcpServers": {
    "canvas": {
      "command": "uvx",
      "args": ["canvas-api-mcp"],
      "env": {
        "CANVAS_BASE_URL": "https://canvas.yourschool.edu",
        "CANVAS_TOKEN": "your-token-here"
      }
    }
  }
}

Herramientas

HerramientaQué hace
whoamiIdentidad y tu rol en cada curso
get_calendar_feed_urlTu calendario privado .ics enlace (solo cuando lo pidas)
my_coursesCursos activos con código, período, rol
whats_dueTodo lo pendiente, primero lo más próximo
my_gradesPuntuación actual por curso
list_assignmentsLas tareas de un curso y el estado de entrega
get_assignmentUna tarea completa, con rúbrica
my_submissionTu entrega, puntuación y comentarios
submit_assignment ✏️Enviar trabajo
course_announcementsAnuncios recientes
course_contentMódulos y su contenido
list_filesArchivos en un curso
read_fileExtraer texto de PDF/DOCX/PPTX/texto
get_pageUna página wiki de Canvas por slug
get_syllabusEl programa de un curso
read_discussionTemas, o las respuestas de un tema
post_discussion_reply ✏️Publicar en un foro
search_canvas_apiEncontrar cualquier endpoint por palabra clave (puerta de enlace)
canvas_request ✏️Ejecutar cualquier endpoint (puerta de enlace)

✏️ escribe en Canvas. Son 3 herramientas de escritura en total: submit_assignment, post_discussion_reply y canvas_request cuando se llaman con un método que no sea GET (las llamadas GET a través de canvas_request son de solo lectura).

search_canvas_api + canvas_request llegan a los ~1,116 endpoints que expone tu instancia. Lo que pueden hacer lo decide Canvas según los permisos de tu token: un token de profesor desbloquea endpoints educativos sin cambios en este servidor.

Prompts

week_ahead, study_pack, grade_check.

Recursos

canvas://me, canvas://courses, canvas://api/catalog.

Habilidades

Si tu cliente admite la convención de habilidades:

npx skills add JohannsenLum/canvas-api-mcp

Otras instituciones

Funciona con cualquier instancia de Canvas: establece CANVAS_BASE_URL. El catálogo de ~1,116 endpoints se incluye dentro del paquete en canvas_api_mcp/data/catalog.json. Para que coincida con el conjunto de funciones exacto de tu implementación, regenéralo:

python scripts/build_catalog.py https://canvas.yourschool.edu -o data/catalog.json

Cumplimiento

  • Integridad académica. submit_assignment puede enviar cualquier cosa, incluido trabajo generado por IA. Enviar trabajo que no es tuyo incumple las normas de integridad académica de prácticamente todas las instituciones, y la política de API de Canvas prohíbe explícitamente el uso que las viole. Eso es responsabilidad tuya.
  • Límite de velocidad. El cliente limita según la cuota publicada de Canvas. No lo elimines: sobrecargar la API está prohibido.
  • Material del curso. read_file obtiene materiales para tu propio estudio. No los redistribuyas.
  • Tu token equivale a una contraseña. Puede leer tus calificaciones y enviar trabajo como tú. Establece una caducidad. Nunca lo confirmes en un repositorio.
  • Ámbito de uso personal. La fase 1 se dirige a un solo estudiante que usa su propio token. No hay herramientas educativas seleccionadas; el flujo OAuth de Canvas no tiene PKCE, por lo que este servidor instalado localmente no puede implementar el OAuth multiusuario que la política de API de Canvas exige para algo más amplio. No lo reempaquetes como un servicio multiinquilino.

Desarrollo

uv sync
uv run pytest -v

# Live tests against your real account (read-only)
CANVAS_LIVE_TESTS=1 uv run pytest tests/test_live.py -v

Variables de entorno: CANVAS_BASE_URL, CANVAS_TOKEN, opcional CANVAS_MAX_PAGES (predeterminado 10) y CANVAS_TIMEOUT (segundos, predeterminado 30). Consulta env.template.

Contribuciones

Se aceptan problemas y solicitudes de extracción: consulta CONTRIBUTING.md para la configuración, las reglas arquitectónicas que vale la pena conocer antes de cambiar algo y el estándar para añadir una nueva herramienta seleccionada.

¿Encontraste un problema de seguridad? No abras un problema público. Consulta SECURITY.md para informar de forma privada; esto es especialmente importante aquí, ya que este proyecto maneja tokens de Canvas equivalentes a contraseñas.

Los cambios se registran en CHANGELOG.md.

Licencia

MIT © 2026 Johannsen Lum.

Úsalo, modifícalo, redistribúyelo, construye algo comercial con él: la única condición es que conserves el aviso de derechos de autor y el texto de la licencia. Se proporciona sin garantía de ningún tipo.

Las contribuciones se aceptan bajo la misma licencia.