ufsc-moodle-mcp
This server integrates AI agents with UFSC Moodle to read course data, extract assignment files with local OCR, manage groups/communication, and perform audited grading and PDF resource updates.
Retrieve authenticated user/site info, courses, course contents, materials, students, assignments, quizzes, forums, messages, and groups.
Download and read Moodle files, extract native text, or run local Poppler+Tesseract OCR with visual layout data; reuse cached files.
List individual/group submissions and consolidated grading overviews, resolving effective project groups and handling group grading states.
Prepare, commit, and verify batch grading plans with human-approval safeguards, hashes, idempotency, audit logs, and no-op detection.
Provide individual grades/feedback while preserving omitted fields.
Send Moodle messages, read messages/notifications, and post or reply to forum discussions.
Create groups, add/remove members, and create groups with members atomically with validation and idempotency.
Replace and independently verify PDF files in existing
mod_resourceactivities via dry-run/atomic update, preserving cmid and public URL.Introspect server capabilities, version, OCR status, limits, and tool catalog.
Provides tools for interacting with the UFSC Moodle instance, enabling agents to list courses, participants, assignments, submissions, and quizzes; read course files and submissions with optional OCR; prepare, commit, and verify grading workflows; and send messages to students.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ufsc-moodle-mcp list my UFSC Moodle courses and pending assignments"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
UFSC Moodle MCP Server (ufsc-moodle-mcp v1.3.0)
Servidor Model Context Protocol (MCP) em TypeScript desenvolvido para o Moodle da UFSC (https://presencial.moodle.ufsc.br), com suporte a Streamable HTTP (para integração direta com ChatGPT, Codex, Claude, Orca/Antigravity e agentes autônomos) e Stdio.
Novidades da Versão 1.3.0
Atualização Atômica e Verificada de Recursos Didáticos em PDF (
mod_resource):Integração sem Navegador com Google Drive MCP: Permite ao ChatGPT ou agente de IA exportar uma apresentação do Google Drive para
application/pdfe substituir diretamente o arquivo em um recurso de disciplina no Moodle (mod_resource), sem qualquer necessidade de automação de navegador (Playwright/Puppeteer).Preservação Rígida da Identidade do Módulo: O
courseModuleId(cmid), a URL pública de acesso (https://presencial.moodle.ufsc.br/mod/resource/view.php?id=...), a seção e as configurações de visibilidade do recurso são rigorosamente preservadas.Estratégia Híbrida de Upload e Atualização: Utiliza a rota oficial
/webservice/upload.phppara envio seguro à área de rascunhos (draftfile) associada ao token e atualiza o recurso via controlador nativo/course/modedit.php, invalidando caches e registrando o histórico.Validação Estrutural e Criptográfica de PDFs: Valida assinatura de bytes mágica (
%PDF-), marcador de término (%%EOF), parse sintático e contagem de páginas viaunpdf, ausência de criptografia/senha e calcula o hash SHA-256 canônico.Trava de Proteção contra Troca Incorreta (
expectedCurrentFilename): Parâmetro de salvaguarda que impede a substituição se o nome do arquivo atual no Moodle divergir do esperado pelo usuário.Simulação com
dryRun: true: Executa todas as validações de autorização, integridade do PDF e inspeção do recurso sem realizar nenhuma gravação no Moodle.Garantia de Idempotência: Chave
operationIdpara prevenir gravações repetidas em retentativas de rede.Ferramenta Independente
verify_course_resource_file: Baixa o arquivo do Moodle de forma isolada, confere integridade do PDF e valida o hash SHA-256 e tamanho com os valores esperados.Trilha de Auditoria Auditável: Log persistente em
/config/resource-audit.jsonlcom timestamp, actor, cmid, hashes antes/depois e confirmação de integridade.
Related MCP server: dutic-mcp
Novidades da Versão 1.2.1
OCR Dinâmico Proporcional com Fallback de Idiomas e
textExtractionComplete:Budget Proporcional ao Documento: O timeout global de OCR é calculado dinamicamente com base nas páginas elegíveis (
numPagesToOcr * pageTimeoutMs), garantindo no mínimo 60 segundos por página (ex.: até 120s para 2 páginas escaneadas, até 300s para 5 páginas), sem abortar prematuramente documentos digitalizados densos.Timeout por Página Configurável (
ocrPageTimeoutMs): Parâmetro explícito nas ferramentasread_moodle_fileeget_submission_content, com valor padrão de 60.000 ms e variável de ambienteMOODLE_OCR_PAGE_TIMEOUT_MS.Fallback Controlado de Idiomas: Se o OCR falhar ou sofrer timeout com o conjunto multi-idioma (ex.:
eng+por), o servidor executa retry automático utilizando o idioma primário (eng) caso ainda reste budget útil (≥ 10s), reutilizando a imagem PNG renderizada sem custo de novopdftoppm.Sinalização Explícita de Completude (
textExtractionComplete): Campo booleano de alto nível que indica se todas as páginas do documento foram lidas com sucesso (seja via texto nativo ou via OCR), permitindo ao cliente distinguir instantaneamente extrações completas de parciais.Reuso de Arquivos em Disco (
fileId): Permite reprocessar arquivos temporários com outros parâmetros de OCR sem refazer o download a partir do Moodle.
Tratamento Otimizado de Avaliações Sem Alterações:
Detecção Rigorosa de No-Op: Na ferramenta
prepare_grading_batch, se os valores propostos (nota e/ou feedback) forem equivalentes aos já registrados no Moodle (ou se um campo for omitido mantendo o valor existente), o plano marca as ações comopreserve(gradeAction: 'preserve',feedbackAction: 'preserve',gradeChanged: false,feedbackChanged: false,anyEffectiveChange: false).Status
prepared_no_changes: Quando nenhuma alteração efetiva for detectada no lote,statusé retornado como"prepared_no_changes"ereadyToCommitcomofalse.Commit Protegido sem Escrita (
unchanged_no_action_required): Secommit_grading_batchfor acionado com um plano sem mudanças efetivas, o servidor não executa chamadas Web Service de escrita (mod_assign_save_grade), registra a auditoria comoperationStatus: 'unchanged_no_action_required'e retornawritesPerformed: 0de forma segura e idempotente.
Garantia Transparente de Autorização Humana em 4 Níveis:
A resposta de
prepare_grading_batchexpõe a estruturahumanApprovalRequired.levels, esclarecendo categoricamente a separação entre:technicalValidation: Validação estrutural de tipos, limites e integridade de identificadores.planIntegrity: Integridade criptográfica do plano aprovado viaapprovedPlanHash(SHA-256 canônico).clientConfirmation: Flag declarada pelo cliente (confirmedByReviewer: true) que atesta que o chamador revisou o plano.humanAuthorization: Prerrogativa indelegável e exclusiva do docente/professor humano. O agente de IA não pode se autoautorizar a publicar notas ou feedbacks.
Funcionalidades Principais da Série 1.2.x
Resolução Definitiva de Grupos de Tarefas Coletivas:
Separa explicitamente agrupamentos gerais de turma (ex.:
62318-"INE5458-08208 (20262)", que contêm docentes e monitores) dos grupos reais de projeto (assignmentGroupId,assignmentGroupName,assignmentGroupMembers).Nunca inclui professores ou estudantes de outras turmas entre os integrantes da entrega coletiva.
Detecta e reporta deterministicamente ambiguidade quando um estudante participa de múltiplos grupos na tarefa (
groupResolutionStatus: 'ambiguous',ambiguousGroupCandidates), sem escolher silenciosamente o primeiro grupo retornado pelo Moodle.Suporta consulta transparente por
studentIdou diretamente porgroupId.Trata o retorno numérico
lastattempt.submissiongroup: 67199do Moodle 4.1.5+.
Representação Fiel de Avaliações em Grupo:
Separa o estado da linha coletiva com
userid=0(onde o Moodle reportagradingstatus: "notgraded") do estado agregado real dos integrantes (aggregatedGradingStatus: 'fully_graded' | 'partially_graded' | 'not_graded' | 'inconsistent').Expõe nota comum (
commonGroupGrade), alerta de divergência de notas entre integrantes (hasGradeDivergence), workflow e visibilidade.
OCR Local Automático no Servidor com Layout Visual Estruturado:
Integra Poppler (
pdftoppm) e Tesseract (tesseract) locais em container Alpine sem envio de documentos acadêmicos para terceiros.Modos:
off(padrão compatível),auto(preserva texto nativo e executa OCR apenas nas páginas escaneadas/sem texto),force(OCR em todas as páginas) estatus(diagnóstico sem execução).Suporta documentos mistos (páginas nativas + páginas escaneadas) sem duplicação de texto.
Extrai blocos visuais posicionados (
bbox, coordenadas normalizadasnormX/normY, região espacial 3x3 na página, ordem de leitura e confiança).Protegido por semáforo de concorrência, clamping de DPI contra canvas bombs, timeouts com
SIGKILLe limpeza garantida de diretórios temporários0700.
Visão Consolidada em Lote (
get_assignment_grading_overview):Agrupa em poucas chamadas Web Service todas as informações da turma: grupos, membros, arquivos deduplicados por
fileKey, notas, comentários de avaliação, workflow, publicação e inconsistências, com paginação (limit/cursor) e proteção de PII.
Fluxo Auditado e Controlado de Avaliações (
prepare-> Revisão Docente ->commit->verify):prepare_grading_batch: Operação estritamente somente-leitura, zero escritas no Moodle. Calcula diff, preserva notas quando apenas feedback é enviado, preserva feedback quando apenas nota é enviada, detecta conflitos e geraplanId+planHash(SHA-256).commit_grading_batch: ExigeplanId,approvedPlanHash,confirmedByReviewer: true,operationId,publicationStateenotificationPolicy. Bloqueiastale_plan_conflictse houve alteração no Moodle pós-preparação. Grava exclusivamente emassignfeedbackcomments_editor(gradingFeedbackComments). Idempotência garantida e recuperação de falha parcial comresumeFailedOnly.verify_grading_batch: Reconsulta o Moodle em tempo real (fresh: true) e audita se notas, feedbacks, workflow e visibilidade conferem rigorosamente com o plano aprovado.Trilha de auditoria persistente redigida em JSONL (
MOODLE_GRADING_AUDIT_LOG_PATH), registrando hashes SHA-256 e sem vazar segredos ou tokens.
Descoberta e Portabilidade MCP (
get_moodle_capabilities):Schemas portáveis sem
format: "uri"(evitando que conectores ChatGPT/OpenAI filtrem parâmetros de URL).Notificações de mudança de ferramentas ativas (
listChanged: true).Ferramenta de introspecção
get_moodle_capabilities.
Catálogo Completo de Ferramentas (30 Tools)
# | Ferramenta | Descrição |
1 |
| Metadados do servidor, versão (v1.3.0), suporte a OCR, limites, capacidades e guia de refresh. |
2 |
| Dados do usuário autenticado no Moodle ( |
3 |
| Lista disciplinas acessíveis com filtro por código/semestre (ex.: |
4 |
| Lista seções, tópicos, arquivos (PDFs, slides) e módulos da disciplina. |
5 |
| Lista participantes da disciplina com matrícula, papéis e grupos. |
6 |
| Lista tarefas da disciplina com enunciado, anexos, datas e flags de workflow/teamsubmission. |
7 |
| Lista submissões individuais e coletivas em lote, com notas e grupos resolvidos. |
8 |
| Conteúdo detalhado da entrega por |
9 |
| Baixa e preserva os bytes originais do arquivo com URL temporária autenticada por token de capacidade de 256 bits e URI MCP. |
10 |
| Baixa e extrai texto nativo ou executa OCR local (por |
11 |
| Visão consolidada em lote de entregas, grupos, notas, feedbacks, workflow e inconsistências. |
12 |
| Somente-leitura. Valida e prepara plano de avaliação em lote com diff, cálculo de hashes e detecção de conflitos. |
13 |
| Publica o plano aprovado pelo professor com concorrência otimista, idempotência e controle de workflow/notificação. |
14 |
| Consulta ao vivo o Moodle para auditar notas, feedbacks, workflow e visibilidade pós-publicação. |
15 |
| Avaliação individual pontual segura, preservando campos omitidos ( |
16 |
| Lista questionários da disciplina. |
17 |
| Consulta notas e tentativas de um aluno em um questionário. |
18 |
| Envia mensagem instantânea direta para um aluno no Moodle. |
19 |
| Lista mensagens diretas e notificações recebidas/enviadas. |
20 |
| Lista fóruns da disciplina (Avisos, Dúvidas). |
21 |
| Lista tópicos de um fórum ou lê postagens de uma discussão. |
22 |
| Publica aviso/tópico ou responde a postagem em fórum. |
23 |
| Lista grupos da disciplina, participantes, agrupamentos e regras |
24 |
| Consulta participantes confirmados e vagas de um grupo. |
25 |
| Cria novo grupo na disciplina (com nome escolhido ou único gerado automaticamente). |
26 |
| Adiciona participante(s) a um grupo com validação de matrícula e capacidade. |
27 |
| Remove participante(s) de um grupo de forma idempotente e auditada. |
28 |
| Operação composta para criar grupo e matricular alunos em uma única chamada. |
29 |
| Substitui com segurança e validação atômica o PDF de um recurso |
30 |
| Reconsulta ao vivo o Moodle, efetua download independente, valida integridade do PDF e confere tamanho e hash SHA-256 com os esperados. |
Fluxo Recomendado para Avaliação de Trabalhos
flowchart TD
A["1. Identificar Tarefas e Grupos<br/>(get_assignments, get_assignment_grading_overview)"] --> B["2. Obter Entregas e OCR Visual<br/>(get_submission_content com ocrMode='auto')"]
B --> C["3. Análise Pedagógica pelo Agente/Professor"]
C --> D["4. Preparar Lote (SOMENTE-LEITURA)<br/>(prepare_grading_batch)"]
D --> E["5. Revisão Humana Obrigatória<br/>(Apresentação da prévia ao Professor)"]
E --> F["6. Publicação Autorizada<br/>(commit_grading_batch com approvedPlanHash)"]
F --> G["7. Verificação Independente ao Vivo<br/>(verify_grading_batch)"]Variáveis de Ambiente
Variável | Padrão | Descrição |
|
| URL base do Moodle da UFSC. |
| — | Token Web Service estático ( |
| — | Credenciais CAS UFSC para obtenção dinâmica de token. |
|
| Porta do servidor HTTP MCP. |
| — | Token Bearer obrigatório para autenticar clientes MCP. |
| — | URL pública externa do proxy (ex.: |
|
| Habilita o processamento local de OCR. |
|
| Idiomas padrão do Tesseract. |
|
| Limite máximo de páginas por arquivo para OCR. |
|
| Resolução de rasterização Poppler. |
|
| Timeout global base de OCR por documento (ajustado dinamicamente pelo número de páginas). |
|
| Timeout individual de OCR por página renderizada. |
|
| Limite de processos de OCR concorrentes. |
|
| Caminho do log JSONL de auditoria de avaliações. |
|
| Diretório para persistência de operações em lote. |
Instalação e Execução
Pré-requisitos
Node.js: Versão 22.x ou superior
Poppler & Tesseract (opcionais, necessários apenas para OCR local de PDFs escaneados):
Ubuntu/Debian:
sudo apt-get install poppler-utils tesseract-ocr tesseract-ocr-por tesseract-ocr-engmacOS:
brew install poppler tesseract tesseract-lang
1. Execução Local via Stdio (Claude Desktop / Cursor)
# Clonar o repositório
git clone https://github.com/jeanmartina/ufsc-moodle-mcp.git
cd ufsc-moodle-mcp
# Instalar dependências e compilar
npm install
npm run build
# Executar via Stdio
node dist/index.js2. Execução como Servidor Streamable HTTP / SSE (ChatGPT / Webhooks / Agentes)
# Definir variáveis de ambiente no arquivo .env
cp .env.example .env
# Iniciar o servidor HTTP na porta 8088
npm run serveGuia de Configuração com Clientes MCP
Claude Desktop
Adicione ao seu claude_desktop_config.json (no macOS: ~/Library/Application Support/Claude/claude_desktop_config.json; no Linux/Windows: ~/.config/Claude/claude_desktop_config.json):
{
"mcpServers": {
"moodle-ufsc": {
"command": "node",
"args": ["/caminho/absoluto/para/ufsc-moodle-mcp/dist/index.js"],
"env": {
"MOODLE_URL": "https://presencial.moodle.ufsc.br",
"MOODLE_API_TOKEN": "seu_token_webservice_moodle",
"MOODLE_USERNAME": "seu.usuario",
"MOODLE_PASSWORD": "sua_senha"
}
}
}
}Cursor (.cursor/mcp.json)
{
"mcpServers": {
"moodle-ufsc": {
"command": "node",
"args": ["/caminho/absoluto/para/ufsc-moodle-mcp/dist/index.js"],
"env": {
"MOODLE_URL": "https://presencial.moodle.ufsc.br",
"MOODLE_API_TOKEN": "seu_token_webservice_moodle"
}
}
}
}ChatGPT (Streamable HTTP Conector)
Inicie o servidor HTTP com uma chave secreta:
PORT=8088 MCP_AUTH_TOKEN=seu_token_bearer node http-server.mjsNo ChatGPT, configure uma Custom Action ou MCP Connector apontando para o endpoint HTTPS do seu proxy (ou tunnel):
URL:
https://seu-servidor.dominio.br/mcp/moodleAuthentication: Bearer Token (
seu_token_bearer)
Execução via Docker
O repositório já inclui um Dockerfile multi-stage otimizado baseado em Alpine Linux com Poppler e Tesseract pré-instalados:
# Construir a imagem Docker
docker build -t ufsc-moodle-mcp:latest .
# Executar o container HTTP
docker run -d \
--name ufsc-moodle-mcp \
-p 8088:8088 \
-e MOODLE_URL=https://presencial.moodle.ufsc.br \
-e MOODLE_API_TOKEN=seu_token \
-e MCP_AUTH_TOKEN=seu_bearer_token \
ufsc-moodle-mcp:latestAtualização de PDFs em Recursos Didáticos (mod_resource) via Google Drive MCP
Para substituir arquivos de aula (slides, apostilas, ementas) no Moodle sem automação de navegador:
flowchart LR
A["1. Google Drive MCP<br/>(export_file -> PDF URI)"] --> B["2. Simulação Moodle MCP<br/>(replace_course_resource_file com dryRun=true)"]
B --> C["3. Substituição Atômica<br/>(replace_course_resource_file com dryRun=false)"]
C --> D["4. Verificação Independente<br/>(verify_course_resource_file)"]Exemplo de Chamada via ChatGPT / Agente:
{
"name": "replace_course_resource_file",
"arguments": {
"courseId": 49476,
"courseModuleId": 1564872,
"expectedCurrentFilename": "INE5458 - DeFi and On Chain Finance.pdf",
"sourceFileUri": "https://docs.google.com/presentation/d/12ETsNXe2fZLpThBLwy0EucWfC8rjtccnNwQsFWfeCaA/export/pdf",
"dryRun": false,
"operationId": "replace-defi-slides-20261107"
}
}O Moodle MCP realiza:
Validação do papel docente de edição do usuário no curso (
checkCourseEditingPermission).Validação se o módulo existe e é do tipo
mod_resource.Validação do arquivo atual contra a trava de segurança
expectedCurrentFilename.Resolução da origem (Google Drive HTTPS export, Data URI, Base64 ou arquivo local).
Validação estrutural do PDF (magic bytes
%PDF-, finalizador%%EOF, integridade e contagem de páginas comunpdf, conferência de ausência de senha/criptografia).Upload do novo arquivo para a área de rascunho (
draftfile) do Moodle.Atualização atômica do módulo via
/course/modedit.php, preservando intactos ocourseModuleIde o link público de acesso.Reconsulta e conferência em tempo real dos metadados e hash SHA-256 no Moodle.
Registro da operação na trilha de auditoria
/config/resource-audit.jsonl.
Como Atualizar o Catálogo em Clientes MCP (ChatGPT Connectors)
Clientes como o ChatGPT mantêm cache local das ferramentas descobertas via tools/list:
Acesse Configurações -> Conectores / Apps -> UFSC Moodle MCP.
Clique em Atualizar ferramentas (Refresh tools) ou reconecte o conector.
Inicie uma nova conversa para que o assistente consulte o catálogo v1.3.0 atualizado.
🧪 Testes Automatizados
O repositório conta com suíte abrangente de testes unitários e de integração utilizando Vitest:
npm test📄 Licença
Distribuído sob a licença MIT. Consulte o arquivo LICENSE para mais informações.
Available Tools
28 toolsadd_group_memberAdicionar participante(s) a um grupo da disciplinaAIdempotent
Adiciona um ou mais alunos matriculados a um grupo existente, validando moodle/course:managegroups, matrícula na disciplina, limite máximo de participantes (maxMembers do mod_groupselect) e unicidade de grupo. Operação idempotente e auditada que confirma o estado final no Moodle antes de retornar.
Inputs: groupId (required), userId, userIds, courseId, +3 more.
commit_grading_batchPublicar lote de avaliações aprovado pelo professor (idempotente, auditado e com controle de concorrência)AIdempotent
Executa exclusivamente um plano preparado por prepare_grading_batch e formalmente autorizado pelo professor. Distingue 4 níveis de controle: (1) validação técnica do plano, (2) integridade criptográfica pelo approvedPlanHash, (3) confirmação declarada via confirmedByReviewer=true e (4) autorização humana efetiva do docente. Se o plano não contiver alterações efetivas (status="prepared_no_changes"), commit_grading_batch retorna "unchanged_no_action_required" com 0 escritas no Moodle de forma totalmente idempotente. Protegido por verificação otimista de concorrência e registro em log de auditoria local redigido.
Inputs: planId (required), operationId (required), approvedPlanHash (required), publicationState (required), +4 more.
create_course_groupCriar novo grupo na disciplina (idempotente e compatível com mod_groupselect)AIdempotent
Cria um novo grupo em uma disciplina validando moodle/course:managegroups, permitindo escolher um nome explícito (sem nunca sobrescrever nem reutilizar grupos preexistentes) ou gerar automaticamente um nome único a partir dos grupos existentes. Se a atividade mod_groupselect exigir um agrupamento (targetgrouping > 0), associa o grupo automaticamente e confirma o estado final no Moodle antes de retornar.
Inputs: name, courseId, idnumber, groupingId, +6 more.
create_group_with_membersCriar grupo e matricular participantes em uma única operação compostaAIdempotent
Cria um grupo novo na disciplina (com nome escolhido ou único gerado automaticamente, disponível no mod_groupselect) e adiciona os participantes informados de forma idempotente, validando previamente permissões, matrícula e limite máximo de vagas, relatando qualquer falha parcial e confirmando o estado final no Moodle.
Inputs: userIds (required), name, courseId, idnumber, +9 more.
download_moodle_fileBaixar arquivo original do Moodle (entrega acessível ao agente)ARead-onlyIdempotent
Baixa os bytes originais preservados de um arquivo do Moodle (submissões individuais ou em grupo, anexos de enunciados e materiais da disciplina) reutilizando a autenticação da integração, sem depender de navegador e sem converter/substituir o PDF por texto. Retorna metadados verificados (fileId, tamanho, MIME, SHA-256, validade), downloadUrl temporária autenticada por token de capacidade e resourceUri MCP.
Inputs: fileurl (required), filename, maxBytes, timeoutMs, +1 more.
get_assignment_grading_overviewVisão consolidada em lote de entregas, grupos, notas, feedbacks, workflow e cobertura da tarefaARead-onlyIdempotent
Recupera em uma única operação consolidada todo o panorama de avaliação de uma tarefa do Moodle: metadados da tarefa, grupos efetivos do projeto (excluindo grupos gerais de turma), integrantes confirmados (sem docentes), entregas coletivas e individuais com arquivos deduplicados, notas individuais e agregadas por grupo (fully_graded, partially_graded, not_graded, inconsistent), comentários de avaliação existentes (gradingFeedbackComments), estados de workflow e visibilidade, cobertura percentual e inconsistências detectadas.
Inputs: assignmentId (required), fresh, limit, cursor, +9 more.
get_assignmentsListar tarefas/trabalhos da disciplinaARead-onlyIdempotent
Lista todas as tarefas (assignments) de uma disciplina, incluindo enunciado, anexos do enunciado (baixáveis via download_moodle_file), configuração de entrega em grupo (teamsubmission), prazos e nota máxima.
Inputs: courseId.
get_course_contentsListar tópicos, materiais e atividades da disciplinaARead-onlyIdempotent
Retorna todas as seções/tópicos, materiais (arquivos PDF, slides, links) e atividades (tarefas, fóruns, questionários) de uma disciplina. As URLs de arquivos retornadas podem ser baixadas via download_moodle_file ou lidas via read_moodle_file.
Inputs: courseId, sectionNumber.
get_course_groupsListar grupos, agrupamentos e regras mod_groupselect da disciplinaARead-onlyIdempotent
Lista todos os grupos de uma disciplina no Moodle (core_group_get_course_groups), seus participantes atuais, agrupamentos (groupings), permissão moodle/course:managegroups, sugestão de próximo nome único e a configuração completa das atividades mod_groupselect (como agrupamento associado, limites mínimo/máximo de participantes, prazos e permissões de criação).
Inputs: courseId, activityCmid, includeMembers, includeGroupSelect.
get_coursesListar disciplinas do professor/usuárioARead-onlyIdempotent
Lista todas as disciplinas (cursos) em que o usuário está inscrito ou leciona no Moodle da UFSC. Permite filtrar por código/nome/semestre (ex: "20262" ou "INE5429") ou buscar um courseId específico.
Inputs: limit, search, courseId, onlyVisible.
get_forum_discussionsLer tópicos e postagens de um fórumARead-onlyIdempotent
Lista os tópicos/discussões de um fórum ou lê todas as postagens/respostas de uma discussão específica.
Inputs: limit, forumId, discussionId.
get_forumsListar fóruns da disciplinaARead-onlyIdempotent
Lista os fóruns de uma disciplina (ex: "Avisos" e "Fórum de Discussão"), retornando seus IDs para leitura ou publicação de avisos.
Inputs: courseId.
get_group_membersConsultar participantes confirmados de um grupoARead-onlyIdempotent
Retorna a lista atualizada e confirmada de integrantes de um grupo específico no Moodle, juntamente com contagem de membros, limite máximo configurado (maxMembers), vagas restantes e disponibilidade na atividade mod_groupselect.
Inputs: groupId (required), courseId, activityCmid.
get_messagesListar mensagens recebidas/enviadas no MoodleBRead-onlyIdempotent
Lista as mensagens diretas ou notificações recentes da conta do professor no Moodle.
Inputs: type, limit, direction, readStatus.
get_moodle_capabilitiesConsultar capacidades, versão, OCR, limites e ferramentas do UFSC Moodle MCPARead-onlyIdempotent
Retorna metadados de versão e protocolo do servidor UFSC Moodle MCP (v1.2.1), a lista completa de 28 ferramentas registradas e disponíveis, funcionalidades ativas, status detalhado dos motores de OCR local (Poppler pdftoppm + Tesseract e idiomas instalados), limites operacionais, suporte a avaliação em lote controlada (prepare/commit/verify) e guia de atualização de cache de catálogo em clientes MCP externos.
Inputs: checkMoodleConnection.
get_quiz_gradeConsultar nota e tentativas de um aluno em um questionárioARead-onlyIdempotent
Retorna a melhor nota e o histórico de tentativas de um aluno em um questionário (quiz) do Moodle.
Inputs: quizId (required), studentId (required).
get_quizzesListar questionários (quizzes) da disciplinaBRead-onlyIdempotent
Lista todos os questionários (quizzes) de uma disciplina, com datas de abertura/fechamento, limite de tempo e nota máxima.
Inputs: courseId.
get_site_infoInformações da conta e do MoodleBRead-onlyIdempotent
Retorna informações do usuário autenticado (userid, nome completo, username) e da instância do Moodle da UFSC.
Inputs: no named parameters.
get_studentsListar estudantes/participantes da disciplinaARead-onlyIdempotent
Lista os participantes inscritos em uma disciplina (alunos, professores, monitores) com nome, e-mail, papéis (roles) e grupos.
Inputs: role, search, courseId.
get_submission_contentLer conteúdo completo da entrega de um aluno ou grupo (com OCR automático opcional, layout visual e separação de comentários)ARead-onlyIdempotent
Obtém os detalhes completos da entrega individual e/ou coletiva em grupo (teamsubmission / userid=0) em uma tarefa, resolvendo deterministicamente o grupo efetivo da tarefa (excluindo grupos gerais de turma como INE5458-08208), deduplicando arquivos por fileKey, suportando OCR automático local (ocrMode="auto"|"force"|"status") com blocos visuais posicionados e separando explicitamente submissionComments (comentários da entrega) de gradingFeedbackComments (comentários da avaliação).
Inputs: assignmentId (required), groupId, ocrMode, courseId, +10 more.
get_submissionsListar entregas dos alunos e grupos em uma tarefaBRead-onlyIdempotent
Lista as entregas individuais e coletivas (userid=0) de uma tarefa ou disciplina, diferenciando grupos gerais de turma de grupos efetivos do projeto (assignmentGroupId / assignmentGroupMembers sem professores), e separando o estado bruto da linha coletiva no Moodle (rawMoodleGradingStatus) do estado real agregado das avaliações dos integrantes (aggregatedGradingStatus: not_graded | partially_graded | fully_graded | inconsistent, commonGroupGrade e memberEvaluations).
Inputs: groupId, courseId, studentId, assignmentId, +3 more.
post_forum_discussionPublicar aviso/tópico ou resposta em fórum da disciplinaB
Publica um novo aviso/tópico em um fórum da disciplina (ex: fórum de Avisos) ou responde a uma postagem existente.
Inputs: message (required), subject (required), pinned, forumId, +1 more.
prepare_grading_batchPreparar plano de avaliação em lote para revisão humana (estritamente somente-leitura)ARead-onlyIdempotent
Prepara, valida e calcula o diff completo de um lote de avaliações (notas e/ou gradingFeedbackComments por groupId ou studentId) SEM realizar nenhuma escrita no Moodle. Distingue alterações solicitadas de alterações efetivas: se notas/feedbacks propostos forem idênticos aos já armazenados, classifica a ação como "preserve", reporta status="prepared_no_changes" e readyToCommit=false. Detecta conflitos (grupos gerais inválidos, ambiguidade, bloqueios, notas fora da faixa ou divergências), gera planId + planHash (SHA-256) e detalha os 4 níveis de garantia exigidos para autorização humana.
Inputs: items (required), assignmentId (required), courseId, allowMemberGradeOverride, +2 more.
provide_feedbackAvaliar entrega individual de aluno (salvar nota e/ou gradingFeedbackComments preservando campos omitidos)AIdempotent
Registra ou atualiza a nota e/ou o comentário da avaliação (assignfeedback_comments) de um aluno em uma tarefa do Moodle, preservando valores existentes quando grade, feedback ou workflowState forem omitidos. Para avaliações em lote ou de grupos com etapa de revisão do professor, prefira prepare_grading_batch -> commit_grading_batch -> verify_grading_batch.
Inputs: studentId (required), assignmentId (required), grade, feedback, +2 more.
read_moodle_fileLer e extrair texto/layout visual de arquivo do Moodle (com OCR local automático opcional)ARead-onlyIdempotent
Lê qualquer arquivo autorizado do Moodle (por fileurl ou reutilizando fileId já baixado em TempFileStore sem novo download), preservando o arquivo original via downloadUrl/resourceUri e extraindo texto nativo (PDF, DOCX, ODT, PPTX, ZIP, código) ou executando OCR local automático no servidor (ocrMode="auto"|"force"|"status" via Poppler pdftoppm + Tesseract) com blocos visuais posicionados (coordenadas, região na página, confiança e ordem de leitura).
Inputs: fileId, fileurl, ocrMode, filename, +8 more.
remove_group_memberRemover participante(s) de um grupo da disciplinaAIdempotent
Remove um ou mais participantes de um grupo da disciplina validando moodle/course:managegroups e matrícula no curso. Operação idempotente e auditada que confirma a remoção no Moodle antes de retornar.
Inputs: groupId (required), userId, userIds, courseId, +2 more.
send_messageEnviar mensagem direta no MoodleB
Envia uma mensagem instantânea direta pelo Moodle para um aluno ou usuário (core_message_send_instant_messages).
Inputs: text (required), toUserId (required).
verify_grading_batchVerificar em tempo real no Moodle o resultado de um lote de avaliações publicadoARead-onlyIdempotent
Reconsulta os dados diretamente no Moodle (fresh=true, nunca confiando apenas na resposta de escrita) e confere, para cada grupo e cada integrante afetado, se nota, comentário da avaliação (gradingFeedbackComments), contagem de membros, estado de workflow e visibilidade correspondem exatamente ao plano aprovado.
Inputs: planId, operationId, expectedPublicationState.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 28 tools
Most tools have clearly distinct resource+action targets, and the read/write boundary is well documented (e.g. prepare vs commit vs verify in the grading flow). A few clusters still overlap: get_submissions, get_submission_content and get_assignment_grading_overview all return submission/grade data at different granularities, and get_course_groups vs get_group_members both return member lists. provide_feedback also overlaps in outcome with the batch grading tools, though its description explicitly redirects bulk cases to prepare/commit.
Nearly all names follow a snake_case verb_noun pattern (get_courses, create_course_group, add_group_member, post_forum_discussion, download_moodle_file), which is predictable and readable. Minor deviations exist: «provide_feedback» uses a less standard verb than send_message/post_forum_discussion for what is effectively an update operation, and some get_* names are long compound phrases (get_assignment_grading_overview, get_moodle_capabilities) breaking the simple verb_noun shape.
At 28 tools the surface sits above the comfortable 3-15 band and feels heavy, with six group-management tools and seven grading/submission tools. The breadth is partly justified because the server spans genuinely separate domains (grading workflows, group management, files/OCR, forums, messaging), but a few read variants (get_submissions vs get_assignment_grading_overview vs get_submission_content) inflate the count more than necessary.
The core teaching lifecycle is well covered: discover courses/contents/students, read assignments/quizzes/submissions, grade individually or via a guarded batch flow, manage groups and members, post to forums, send messages, and fetch/read files with OCR. The main gaps are the absence of a delete/update group operation (create/add/remove exist but no remove_course_group) and no edit/delete for forum posts or messages, which could dead-end some management workflows.
Maintenance
Related MCP Connectors
PLATO (Pusan National University LMS) MCP server via Moodle Web Service API + ubboard scraping
Render, verify, describe, and safely edit Mermaid diagrams through MCP.
MCP server for the Inistate platform: module discovery, entry management, and activity submission.
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMoodle REST API client with batch downloading and MCP protocol support for Claude Code and OpenCode, enabling course management, grade checking, assignment tracking, file downloads, and more.6MIT
- AlicenseAqualityBmaintenanceMCP server for the DUTIC virtual classroom (Moodle) at UNSA. Allows viewing tasks (including hidden ones), courses, resources, and downloading files, from terminal or AI agents.247 npmMIT
- FlicenseAqualityCmaintenanceMCP server for the Moodle-based Campus Virtual FCEIA UNR, providing tools to read courses, assignments, forums, and grades, plus write operations (posting, grading, messaging, events) with dry-run safety.201-
- AlicenseNot gradedqualityCmaintenanceEnables read-only Moodle access through MCP for querying courses, content, assignments, grades, forums, discussions, submissions, and calendar events, while supporting multiple profiles and local ICS export.358 npmMIT