Canvas LMS

Conecta herramientas de IA con los paneles escolares de Canvas.

Documentación

Servidor MCP de Canvas API

Conecta Claude a tu Canvas LMS. Haz preguntas naturales como "¿Qué tareas tengo que entregar esta semana?" o "¿Cuál es mi calificación actual en Biología?" y obtén respuestas reales directamente desde tu cuenta de Canvas.

Funciona con Claude Desktop y Claude Code (la CLI).


Instalación rápida

Requiere: Node.js 18+, Git y un token de acceso personal de Canvas (cómo obtener uno)

git clone https://github.com/Kdude43ver/Canvas-API-MCP.git
cd Canvas-API-MCP
bash install.sh

El script de instalación:

  • Instalará las dependencias y compilará el proyecto
  • Preguntará por tu URL de Canvas y token de API
  • Agregará el servidor a Claude Code y/o Claude Desktop automáticamente

Configuración manual

1. Obtén tu token de API de Canvas

  1. Inicia sesión en tu instancia de Canvas (p. ej. https://yourschool.instructure.com)
  2. Haz clic en tu foto de perfil → CuentaConfiguración
  3. Desplázate hasta Integraciones aprobadas
  4. Haz clic en + Nuevo token de acceso
  5. Ponle un nombre (p. ej. Claude MCP) y haz clic en Generar token
  6. Copia el token ahora — Canvas no lo volverá a mostrar

2. Clona y compila

git clone https://github.com/Kdude43ver/Canvas-API-MCP.git
cd Canvas-API-MCP
npm install
npm run build

3. Crea tu archivo .env

cp .env.example .env

Edita .env:

CANVAS_TOKEN=your_token_here
CANVAS_BASE_URL=https://yourschool.instructure.com

4. Agrégalo a Claude Code

claude mcp add canvas \
  -e CANVAS_TOKEN=your_token_here \
  -e CANVAS_BASE_URL=https://yourschool.instructure.com \
  -- node /absolute/path/to/Canvas-API-MCP/dist/index.js

Reemplaza /absolute/path/to/Canvas-API-MCP con la ruta real (ejecuta pwd dentro del repositorio para obtenerla).

5. Agrégalo a Claude Desktop

Edita ~/.config/claude/claude_desktop_config.json en Linux/Mac, o %APPDATA%\Claude\claude_desktop_config.json en Windows. Crea el archivo si no existe.

{
  "mcpServers": {
    "canvas": {
      "command": "node",
      "args": ["/absolute/path/to/Canvas-API-MCP/dist/index.js"],
      "env": {
        "CANVAS_TOKEN": "your_token_here",
        "CANVAS_BASE_URL": "https://yourschool.instructure.com"
      }
    }
  }
}

Reinicia Claude Desktop después de guardar. Deberías ver un ícono de martillo en la interfaz de chat que indica que las herramientas están disponibles.


Herramientas disponibles

HerramientaQué hace
list_coursesLista todos tus cursos activos
get_courseDetalles completos de un curso (incluido el programa)
list_assignmentsTodas las tareas de un curso con fechas de entrega y valores en puntos
get_assignmentDetalles completos de la tarea, incluida la descripción
list_upcoming_assignmentsTareas que vencen en los próximos N días en todos tus cursos
get_gradesTu calificación actual y final de un curso
list_submissionsEstado de entrega de cada tarea en un curso
list_announcementsAnuncios recientes de un curso
list_discussionsTemas de discusión de un curso
list_calendar_eventsPróximos eventos y fechas de entrega en un rango de fechas
list_filesArchivos disponibles en un curso con enlaces de descarga

Ejemplos de prompts

Una vez instalado, intenta preguntarle a Claude:

  • "¿Qué tareas tengo que entregar en los próximos 3 días?"
  • "Lista todos mis cursos de este semestre."
  • "¿Cuál es mi calificación actual en cada clase?"
  • "¿Hay algún anuncio en mi clase de informática?"
  • "Muéstrame los temas de discusión del curso 12345."
  • "¿Qué archivos están disponibles en mi curso de Biología?"
  • "¿Qué hay en mi calendario esta semana?"

Verificación de funcionamiento (Inspector de MCP)

Antes de agregarlo a Claude, puedes probar el servidor directamente:

npx @modelcontextprotocol/inspector node dist/index.js

Configura CANVAS_TOKEN y CANVAS_BASE_URL en la sección de Variables de entorno del inspector, luego llama a list_courses para confirmar que obtienes datos reales.


Solución de problemas

"No se encontraron cursos" o resultados vacíos

  • Verifica tu CANVAS_BASE_URL — debe ser la URL de Canvas de tu escuela, no canvas.instructure.com
  • Asegúrate de que tu token se copió correctamente (sin espacios adicionales)
  • Intenta generar un token nuevo

Claude Desktop no muestra las herramientas de Canvas

  • Confirma que la ruta en claude_desktop_config.json es la ruta absoluta a dist/index.js
  • Asegúrate de haber ejecutado npm run build y que dist/index.js exista
  • Reinicia Claude Desktop por completo (sal desde la bandeja del sistema, no solo cierres la ventana)

Claude Code no puede encontrar el servidor

  • Ejecuta claude mcp list para ver los servidores registrados
  • Ejecuta claude mcp remove canvas y luego vuelve a agregarlo si algo parece incorrecto

Errores 403 de Canvas

  • Tu token puede haber expirado — genera uno nuevo en la Configuración de Canvas
  • Algunas instancias de Canvas restringen el acceso a la API; contacta al departamento de TI de tu escuela

Seguridad

  • Tu token de Canvas se almacena solo en tu archivo local .env (que está en git-ignore) y/o en tus archivos de configuración locales de Claude
  • El token otorga acceso de lectura a todo lo que tu cuenta de Canvas puede ver — trátalo como una contraseña
  • Para revocar el acceso: ve a Canvas → Cuenta → Configuración → Integraciones aprobadas → elimina el token
  • Nunca compartas tu archivo .env ni lo subas a control de versiones

Desarrollo

# Install deps
npm install

# Build (uses esbuild, outputs to dist/)
npm run build

# Run directly (requires .env file)
node dist/index.js

# Dev mode with ts-node
npm run dev

El código fuente está organizado como:

src/
├── index.ts          # Entry point — loads env, starts server
├── server.ts         # McpServer setup, registers all tools
├── canvas-client.ts  # Axios wrapper: auth headers, pagination, rate-limit backoff
└── tools/
    ├── courses.ts        # list_courses, get_course
    ├── assignments.ts    # list_assignments, get_assignment, list_upcoming_assignments
    ├── grades.ts         # get_grades, list_submissions
    ├── announcements.ts  # list_announcements
    ├── discussions.ts    # list_discussions
    ├── calendar.ts       # list_calendar_events
    └── files.ts          # list_files