A Microsoft Edu streaming HTTPS MCP server for managing education resources including assignments, rubrics, classes, users, groups, and modules via Microsoft Graph API
EduMCPServer has 19 tools with mixed quality. Strengths: all tools have descriptions (10-200 chars), most input parameters have type definitions, and tool names follow verb_object conventions (assignment_get, class_get, user_update). Critical weaknesses: (1) Many descriptions lack actionable context, e.g., 'get the authentication status of the user' (54 chars) is vague about return format or use cases. (2) Parameter descriptions are sparse or generic, search_classes has a 'query' param with minimal guidance on syntax. (3) No output schemas are documented in the source; return types are inferred from names only. (4) Error handling is not visible in tool definitions. (5) Several tools use flexible/untyped 'updates' object parameters (group-update, user-update, rubric-create-get) without schema constraints. (6) Response field naming inconsistencies, assignment_get accepts 'classId' but related tools use 'classId', 'assignmentId' without consistent patterns for composition. (7) No documented pagination for list operations (list_recent_classes accepts 'count' but no offset/cursor return). (8) Idle parameters in schema (e.g., rubric-create-get has unvalidated 'qualities' array). Overall, this is a competent but incomplete toolset typical of educational APIs, names are clear, but descriptions and schemas need substantial refinement for reliable LLM usage.
Fetches all submissions for a specific assignment.
Fetches the outcome of a specific submission for a specific assignment.
Use this function when you need to get assignment details or list assignments. Provide classId + assignmentId for a specific assignment, classId only for all assignments in a class, or no params for all your assignments.
get the authentication status of the user.
Gets all classes or a specific class with optional search.
Retrieve a single class by its unique identifier. Returns full class details.
Two tools performing identical operation: 'class_get' and 'get_class' both retrieve class by ID. This violates composition: separate identical tools waste LLM reasoning cycles and invite conflicts.
Flexible/untyped 'updates' object parameters (group-update, user-update) have no schema constraints. LLM cannot know valid field names: displayName? ownerIds? email? This forces trial-and-error and invites silent failures.
'rubric-create-get' combines two operations (create + retrieve). Should be split: 'rubric-create' and 'rubric-get'. Combined operations prevent granular agent control and force multi-responsibility tools.
'qualities' parameter in rubric-create-get is typed 'array' with no object schema. Description says 'Array of quality objects with description and criteria' but LLM cannot determine object field names or types. Requires schema definition.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 69 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 45 | - | v1 |
Fetches a group based on groupId or display name.
Fetches the members of a group based on groupId.
Updates a group based on groupId. Only fields included in the input will be changed.
List the most recently updated classes. Useful for checking current status and recent class activity.
Gets all modules for a class or a specific module. Provide classId + moduleId for a specific module, or classId only for all modules in a class.
Gets all resources for a module or a specific resource. Provide classId + moduleId + resourceId for a specific resource, or classId + moduleId for all resources.
Creates a rubric if one doesn't already exist with the same display name.
Lists all rubrics created by the authenticated user.
Search for classes matching a query. Returns matching class records with ID, name, summary, and URL.
Retrieves only specific attributes from Entra ID. Specify which fields you need (e.g., displayName, jobTitle, skills, AgeGroup).
Fetches a user based on userid, UPN or search string.
Fetches the groups a user belongs to based on userId.
Updates a user based on userId. Only fields included in the input will be changed.
No output schemas documented for any tool. Return types are inferred from function names only. LLMs cannot plan downstream calls without knowing what fields a response contains (e.g., does assignment_get return gradeId, submissionCount, dueDate?).
Mutually exclusive parameters lack documented constraints: group-get (groupId vs displayName), user-get (userId vs userPrincipalName vs search). Descriptions do not state 'exactly one required' or 'all three optional, behaviors differ'.
List operations (list_recent_classes, rubric_list, module-get, user-groups-get) lack pagination guidance: no documented next_cursor, offset, or total_count fields. Lists are capped implicitly (count ≤100) but return structure unclear.
Parameter descriptions use examples in free-form text (user-attributes-select-get: 'e.g., displayName, jobTitle, skills, AgeGroup'). Should use enum constraint or reference documentation. LLM cannot know if 'skills' and 'AgeGroup' are valid without trial.
Several tool descriptions are vague about return format or use cases. E.g., 'Fetches the outcome of a specific submission' (assignment-submissions-outcome-get) does not clarify: is outcome a grade score, feedback text, rubric assessment, or all three?
No error handling guidance in tool definitions. How should LLM handle: class not found? User not authorized to view assignment? Invalid rubric quality structure? Tools provide no recovery hints.