Skip to main content
Glama

provide_feedback

Submit grading and personalized feedback for student assignments in Moodle to support learning progress and assessment.

Instructions

Proporciona feedback sobre una tarea entregada por un estudiante

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
assignmentIdYesID de la tarea
feedbackYesTexto del feedback a proporcionar
gradeNoCalificación numérica a asignar
studentIdYesID del estudiante

Implementation Reference

  • The handler function that executes the provide_feedback tool. It validates input parameters, calls the Moodle API (mod_assign_save_grade) to save the grade and feedback comment for a student's assignment submission.
    private async provideFeedback(args: any) { if (!args.studentId || !args.assignmentId || !args.feedback) { throw new McpError( ErrorCode.InvalidParams, 'Student ID, Assignment ID, and feedback are required' ); } console.error(`[API] Providing feedback for student ${args.studentId} on assignment ${args.assignmentId}`); const response = await this.axiosInstance.get('', { params: { wsfunction: 'mod_assign_save_grade', assignmentid: args.assignmentId, userid: args.studentId, grade: args.grade || 0, attemptnumber: -1, // Último intento addattempt: 0, workflowstate: 'released', applytoall: 0, plugindata: { assignfeedbackcomments_editor: { text: args.feedback, format: 1, // Formato HTML }, }, }, }); return { content: [ { type: 'text', text: `Feedback proporcionado correctamente para el estudiante ${args.studentId} en la tarea ${args.assignmentId}.`, }, ], }; }
  • Input schema definition for the provide_feedback tool, specifying parameters and required fields.
    inputSchema: { type: 'object', properties: { studentId: { type: 'number', description: 'ID del estudiante', }, assignmentId: { type: 'number', description: 'ID de la tarea', }, grade: { type: 'number', description: 'Calificación numérica a asignar', }, feedback: { type: 'string', description: 'Texto del feedback a proporcionar', }, }, required: ['studentId', 'assignmentId', 'feedback'],
  • src/index.ts:174-252 (registration)
    Tool registration in the ListToolsRequestSchema response (lines 174-198) and dispatch in the CallToolRequestSchema switch case (lines 251-252).
    name: 'provide_feedback', description: 'Proporciona feedback sobre una tarea entregada por un estudiante', inputSchema: { type: 'object', properties: { studentId: { type: 'number', description: 'ID del estudiante', }, assignmentId: { type: 'number', description: 'ID de la tarea', }, grade: { type: 'number', description: 'Calificación numérica a asignar', }, feedback: { type: 'string', description: 'Texto del feedback a proporcionar', }, }, required: ['studentId', 'assignmentId', 'feedback'], }, }, { name: 'get_submission_content', description: 'Obtiene el contenido detallado de una entrega específica, incluyendo texto y archivos adjuntos', inputSchema: { type: 'object', properties: { studentId: { type: 'number', description: 'ID del estudiante', }, assignmentId: { type: 'number', description: 'ID de la tarea', }, }, required: ['studentId', 'assignmentId'], }, }, { name: 'get_quiz_grade', description: 'Obtiene la calificación de un estudiante en un quiz específico', inputSchema: { type: 'object', properties: { studentId: { type: 'number', description: 'ID del estudiante', }, quizId: { type: 'number', description: 'ID del quiz', }, }, required: ['studentId', 'quizId'], }, }, ], })); this.server.setRequestHandler(CallToolRequestSchema, async (request) => { console.error(`[Tool] Executing tool: ${request.params.name}`); try { switch (request.params.name) { case 'get_students': return await this.getStudents(); case 'get_assignments': return await this.getAssignments(); case 'get_quizzes': return await this.getQuizzes(); case 'get_submissions': return await this.getSubmissions(request.params.arguments); case 'provide_feedback': return await this.provideFeedback(request.params.arguments);
  • src/index.ts:238-281 (registration)
    The CallToolRequestSchema handler that dispatches to the provide_feedback method based on tool name.
    this.server.setRequestHandler(CallToolRequestSchema, async (request) => { console.error(`[Tool] Executing tool: ${request.params.name}`); try { switch (request.params.name) { case 'get_students': return await this.getStudents(); case 'get_assignments': return await this.getAssignments(); case 'get_quizzes': return await this.getQuizzes(); case 'get_submissions': return await this.getSubmissions(request.params.arguments); case 'provide_feedback': return await this.provideFeedback(request.params.arguments); case 'get_submission_content': return await this.getSubmissionContent(request.params.arguments); case 'get_quiz_grade': return await this.getQuizGrade(request.params.arguments); default: throw new McpError( ErrorCode.MethodNotFound, `Unknown tool: ${request.params.name}` ); } } catch (error) { console.error('[Error]', error); if (axios.isAxiosError(error)) { return { content: [ { type: 'text', text: `Moodle API error: ${ error.response?.data?.message || error.message }`, }, ], isError: true, }; } throw error; } }); }

Latest Blog Posts

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/cfsandoval/Mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server