MCP server for Google Classroom API integration (courses, topics, coursework, materials, attachments, submissions)
Solid foundation with 15 well-named tools, comprehensive schemas, and clear descriptions. All tools have input schemas with proper types and descriptions. Tool names follow verb_noun convention (list_, create_, attach_, turn_in_, reclaim_). Descriptions average ~150 chars and explain WHAT, WHEN, and RETURN. However, output schemas are documented only in prose (not as formal JSON Schema), and error handling lacks recovery guidance. Missing idempotency hints on write tools and confirmation patterns for destructive operations.
Attach a Drive file or link to a student submission BEFORE turning it in. Add attachments first, then call classroom_turn_in_submission. Args: - course_id, coursework_id, submission_id (strings) - drive_file_id (string, optional): Drive file to attach - link_url (string, optional): URL to attach (provide exactly one) Returns: Confirmation.
Post an announcement to a course stream. Requires teacher rights. Args: - course_id (string), text (string, 1-10000 chars) Returns: The new announcement's id.
Create a new topic in a course. Requires teacher rights on the course; will fail with a permission error for student accounts. Args: - course_id (string), name (string, 1-100 chars) Returns: The new topic's id and name.
Dump a complete course snapshot: all topics, coursework, materials, announcements, and roster in one call. Useful for getting a full picture of a course at once.
List announcements posted to a course stream.
Output schemas documented only in prose descriptions, not as formal JSON Schema. LLMs cannot parse unstructured text to understand return field types and structure for downstream tool chaining.
Write tools (turn_in_submission, attach_to_submission, create_topic, create_announcement) lack error recovery guidance. Descriptions state what they do but not what to do if they fail, or whether operations are idempotent/reversible.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2025-06-18+ | v2 |
List the Google Classroom courses (classes) the authenticated user is enrolled in or teaches. Args: - course_states (string[]): Filter by state, default ["ACTIVE"] - limit (number): Max courses, 1-200 (default 50) - response_format ('markdown' | 'json'): default 'markdown' Returns: Each course's id, name, section, description heading, room, ownerId, enrollmentCode, and courseState. Use the returned course id with the other tools.
List coursework (assignments, questions) in a course, including attached materials, due dates, point values, and the topic each belongs to. Args: - course_id (string): Course ID - topic_id (string, optional): Restrict to one topic - limit (number): Max items 1-200 (default 50) - response_format ('markdown' | 'json') Returns: Each item's id, title, description, workType, state, dueDate, maxPoints, topicId, alternateLink, and materials (attachments).
List CourseWorkMaterials — posted reading/lesson materials in a course. These are not assignments; they're reference materials teachers post for students to read.
List students (and their email addresses) enrolled in a course. Requires teacher or admin rights; students cannot list their classmates.
List student submissions for a single assignment (coursework). Shows each student's submission state, attachments, and grade.
List all topics (the section headers teachers use to group work) within a course. Teachers often use topics to represent units, subjects, or lessons. Args: - course_id (string): Course ID - response_format ('markdown' | 'json') Returns: Each topic's topicId and name. Pass topicId to classroom_list_coursework to filter materials/assignments by topic.
Reclaim a turned-in submission (pull it back to make edits), equivalent to "Unsubmit". Only works if the assignment still allows it and state is TURNED_IN. Args: - course_id, coursework_id, submission_id (strings) Returns: Confirmation.
Turn in (submit) a student assignment submission. This hands the work to the teacher and is the equivalent of clicking "Turn in". State must currently be CREATED or NEW. Args: - course_id, coursework_id, submission_id (strings) Returns: Confirmation. NOTE: This changes submission state and is not trivially reversible (use classroom_reclaim_submission to pull it back if still allowed).
Show which Google account this server is currently authorized as. Use this to confirm the server is pointed at the Google login that actually holds your classes. If it's the wrong account, delete the cached token (token.json) and run `npm run auth` again, choosing the correct account on the consent screen. Args: - response_format ('markdown' | 'json') Returns: the authorized account's email, name, and id.
Read the text content of a Google Drive file attached to Classroom coursework, materials, or announcements. Handles each type appropriately: - Google Docs → exported as plain text - Google Sheets → exported as CSV - Google Slides → exported as plain text - text/csv/markdown/html/json/xml/rtf → downloaded directly - PDFs, images, and other binary files → returns metadata + link (content can't be rendered as text) Args: - drive_file_id (string): The Drive file id from an attachment's driveFile.driveFile.id - response_format ('markdown' | 'json') Returns: name, mime_type, size, link, and (when readable) content. Long content is truncated to a character limit with a note. Error Handling: - 403/permission → the Drive scope may be missing; re-run `npm run auth` - 404 → the file id is wrong or you lack access to that file
classroom_attach_to_submission requires exactly one of drive_file_id or link_url, but schema does not enforce mutual exclusivity. LLMs may pass both or neither, causing silent failures.
Descriptions for list_materials and list_announcements are under 100 chars and lack context on when to use them vs other discovery tools. Minimal guidance for LLM tool selection.
No confirmation or dry-run pattern for irreversible operations (turn_in_submission, create_announcement). Agents cannot preview consequences before committing.