Canvas API MCP

Servidor MCP Canvas para Canvas LMS: 16 ferramentas estudantis selecionadas para tarefas, notas, prazos e arquivos, além de um gateway que alcança todos os 1.116 endpoints da API do Canvas.

Documentação

canvas-api-mcp

Nunca mais perca um prazo de trabalho.

Pergunte à sua IA o que está pendente e ela lê a resposta direto do Canvas:
prazos reais, status real de envio, sem copiar nada de um lado para o outro.

Um servidor MCP para Canvas LMS. 16 ferramentas selecionadas para o trabalho diário de estudantes, além de um gateway que alcança todos os endpoints que sua instância do Canvas expõe.

Terminal. Question one: 'what mods am I taking this sem?' Answered instantly by the curated my_courses tool (CS3230, CS2040S, MA2001, GEA1000). Question two: 'what groups am I in?' No curated tool covers it, so search_canvas_api finds GET /v1/users/self/groups among 1,116 Canvas endpoints and canvas_request executes it. 18 tools · 1,116 endpoints reachable · 149 tests · MIT.

📖 Documentação: mcp.johannsenlum.com/canvas-lms · guia de instalação · referência de ferramentas · habilidades · conformidade

PyPI Python 3.11+ License: MIT MCP Registry GitHub stars

Software de uso pessoal. A Política de API do Canvas exige OAuth para aplicações usadas por múltiplas pessoas, e o OAuth do Canvas não pode ser implementado com segurança por software instalado localmente (sem PKCE, e client_secret não pode ser distribuído em um pacote). Use isto com seu próprio token na sua própria conta. Veja Conformidade.

O que você pode perguntar

Exemplos reais de prompts e qual ferramenta responde a eles.

Você: O que está para entregar esta semana? Claude: (chama whats_due): Você tem 3 coisas para entregar: Problema 4 (qui, CS3230), uma resposta de discussão (sex, IS4302) e o relatório do Marco 2 (dom, EE2211).

Você: Como estou no meu curso de banco de dados e o que cai na ementa da semana 6? Claude: (chama my_grades, depois get_syllabus, depois course_content para o módulo da semana 6): Você está com 87% no geral. A semana 6 cobre normalização e tem uma leitura mais um arquivo de laboratório para sexta-feira.

Você: Resuma os PDFs das notas da aula 8 e mostre minha submissão do ensaio para eu ver o feedback. Claude: (chama list_files + read_file para o PDF, depois my_submission para o ensaio): ...

Você: Responda à discussão "Equipes do projeto" e diga que estou livre depois das 15h para a reunião do grupo. Claude: (chama post_discussion_reply ✏️): Publicado no tópico.

Você: O Canvas já me deu estatísticas de questionário detalhadas por questão, ao longo de todo o semestre? Claude: (chama search_canvas_api para encontrar o endpoint certo, depois canvas_request para chamá-lo): ...

O último exemplo é o propósito das ferramentas de gateway: se um endpoint existe na sua instância do Canvas, search_canvas_api pode encontrá-lo e canvas_request pode chamá-lo, mesmo que apenas 16 ferramentas sejam selecionadas manualmente.

Instalação

Pré-requisitos

  • Python 3.11+

  • Um token de acesso pessoal do Canvas. Sua instituição deve permitir que estudantes criem tokens: verifique Canvas → Conta → Configurações → Integrações aprovadas para o botão "+ Novo token de acesso". Guia completo com capturas de tela: mcp.johannsenlum.com/canvas-lms/install.

    Observe que o token expira. Desde a atualização de segurança de outubro de 2025 da Instructure, contas com apenas papéis de estudante devem definir uma expiração de no máximo 120 dias, e muitas instituições impõem um limite menor (NUS permite 90). Anote a data: um token expirado faz todas as ferramentas retornarem 401 de uma vez, o que parece uma instalação quebrada em vez de uma credencial simplesmente vencida.

Executando o servidor

canvas-api-mcp está publicado no PyPI. Execute com:

uvx canvas-api-mcp

Instalar a partir do código-fonte (contribuidores / versões não lançadas main). Não faz parte do caminho de instalação normal acima, só é necessário se você quiser o código mais recente não lançado em vez da versão publicada no PyPI:

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

Ou execute a partir de um clone local:

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

Instalação rápida (um clique)

Links de um clique existem apenas para Cursor, VS Code e LM Studio. Nenhum outro cliente tem um formato de link de instalação documentado. Eles pré-preenchem a configuração abaixo, mas ainda precisam de CANVAS_BASE_URL e CANVAS_TOKEN preenchidos depois.

Add to Cursor Add to VS Code Add to LM Studio

Todos os clientes (configuração manual)

Seu token permanece na sua máquina, no seu próprio arquivo de configuração. Ele nunca é transmitido para nenhum lugar, exceto diretamente para sua instância do Canvas.

ClienteLink de um clique?
Claude Codenão
Claude Desktopnão
Cursorsim, acima
VS Codesim, acima
LM Studiosim, acima
Zednão
Windsurfnão (Windsurf só resolve servidores do próprio 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

Não existe instalação de um clique para Claude Desktop (ele instala pacotes .mcpb, não links de um clique). Copie este JSON via Configurações → Desenvolvedor → Editar Configuração:

{
  "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 para o botão acima, ou se preferir colar diretamente:

{
  "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 para o botão acima, ou se preferir colar diretamente. Observe que o VS Code usa uma chave servers, não 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 para o botão acima, ou se preferir colar diretamente:

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

Zed: settings.json

Não existe link de um clique para Zed. Adicione isto em context_servers nas suas configurações do 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

Não existe link de um clique para Windsurf. Ele só resolve servidores do próprio registro, então isso precisa ser colado manualmente via Configurações do Windsurf → Servidores MCP → Editar configuração bruta:

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

Ferramentas

FerramentaO que faz
whoamiIdentidade e seu papel em cada curso
get_calendar_feed_urlSeu link de calendário privado .ics (somente quando você pedir)
my_coursesCursos ativos com código, período, papel
whats_dueTudo o que tem prazo, do mais próximo ao mais distante
my_gradesNota atual por curso
list_assignmentsTarefas de um curso e estado de envio
get_assignmentUma tarefa por completo, com rubrica
my_submissionSua submissão, nota e feedback
submit_assignment ✏️Enviar trabalho
course_announcementsAnúncios recentes
course_contentMódulos e seus conteúdos
list_filesArquivos em um curso
read_fileExtrair texto de PDF/DOCX/PPTX/texto
get_pagePágina wiki do Canvas por slug
get_syllabusPrograma de um curso
read_discussionTópicos ou respostas de um tópico
post_discussion_reply ✏️Publicar em uma discussão
search_canvas_apiEncontrar qualquer endpoint por palavra-chave (gateway)
canvas_request ✏️Executar qualquer endpoint (gateway)

✏️ escreve no Canvas. São 3 ferramentas de escrita no total: submit_assignment, post_discussion_reply e canvas_request quando chamadas com um método não-GET (chamadas GET através de canvas_request são somente leitura).

search_canvas_api + canvas_request alcançam todos os ~1.116 endpoints que sua instância expõe. O que eles podem fazer é decidido pelo Canvas com base nas permissões do seu token: um token de professor desbloqueia endpoints educacionais sem nenhuma mudança neste servidor.

Prompts

week_ahead, study_pack, grade_check.

Recursos

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

Habilidades

Se o seu cliente suportar a convenção de habilidades:

npx skills add JohannsenLum/canvas-api-mcp

Outras instituições

Funciona com qualquer instância do Canvas: defina CANVAS_BASE_URL. O catálogo de ~1.116 endpoints está incluso no pacote em canvas_api_mcp/data/catalog.json. Para combiná-lo com o conjunto exato de recursos da sua implantação, regere-o:

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

Conformidade

  • Integridade acadêmica. submit_assignment pode enviar qualquer coisa, inclusive trabalho gerado por IA. Enviar trabalho que não é seu viola as regras de integridade acadêmica de praticamente todas as instituições, e a Política de API do Canvas proíbe explicitamente o uso que as viole. Isso é responsabilidade sua.
  • Limite de taxa. O cliente limita de acordo com a cota publicada do Canvas. Não o remova: sobrecarregar a API é proibido.
  • Material de curso. read_file busca materiais para seu próprio estudo. Não os redistribua.
  • Seu token é equivalente a uma senha. Ele pode ler suas notas e enviar trabalhos como você. Defina uma expiração. Nunca o commite.
  • Escopo de uso pessoal. A Fase 1 tem como alvo um único estudante usando o próprio token. Não há ferramentas educacionais selecionadas; o fluxo OAuth do Canvas não tem PKCE, então este servidor instalado localmente não pode implementar o OAuth multiusuário que a Política de API do Canvas exige para algo mais amplo. Não reempacote isto como um serviço multi-tenant.

Desenvolvimento

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

Variáveis de ambiente: CANVAS_BASE_URL, CANVAS_TOKEN, opcional CANVAS_MAX_PAGES (padrão 10) e CANVAS_TIMEOUT (segundos, padrão 30). Veja env.template.

Contribuindo

Issues e pull requests são bem-vindos: veja CONTRIBUTING.md para configuração, as regras arquiteturais que valem a pena conhecer antes de mudar qualquer coisa e o critério para adicionar uma nova ferramenta selecionada.

Encontrou um problema de segurança? Não abra um issue público. Veja SECURITY.md para relato privado, particularmente importante aqui, já que este projeto lida com tokens do Canvas equivalentes a senhas.

As mudanças são registradas em CHANGELOG.md.

Licença

MIT © 2026 Johannsen Lum.

Use, altere, redistribua, construa algo comercial em cima dele: a única condição é manter o aviso de direitos autorais e o texto da licença. Ele vem sem garantia de qualquer tipo.

Contribuições são aceitas sob a mesma licença.