Manage Google Classroom courses, assignments, and students with Agents.
A Model Context Protocol (MCP) server that exposes Google Classroom's API for managing courses, coursework, announcements, rosters, submissions, and guardians.
Overview
The Google Classroom MCP Server provides full lifecycle management of your Google Classroom environment:
Create and manage courses, topics, announcements, and coursework
Manage student and teacher rosters, invitations, and guardian links
Read and grade student submissions
Perfect for:
Educators automating course setup and content distribution
Administrators managing rosters and guardian communications at scale
Developers building learning management integrations on top of Google Classroom
Tools
Courses
Returns a list of courses the requesting user is permitted to view, optionally filtered by student, teacher, or course state.
Inputs:
- `student_id` (string, optional) — Restrict to courses with this student- `teacher_id` (string, optional) — Restrict to courses with this teacher- `course_states` (string, optional) — Restrict to courses in these states (e.g. ACTIVE, ARCHIVED)- `page_size` (integer, optional) — Maximum number of courses to return- `page_token` (string, optional) — Token for the next page of results
- `id` (string, required) — Identifier of the course to patch- `update_mask` (string, required) — Comma-separated list of fields to update (e.g. name,section)- `body` (string, required) — JSON string with the fields to update
Permanently deletes a course. Only course owners may delete a course.
Inputs:
- `id` (string, required) — Identifier of the course to delete
output:
{}
Course Aliases
Creates an alias for a course so it can be referenced by an alternative identifier.
Inputs:
- `course_id` (string, required) — Identifier of the course- `body` (string, required) — JSON string representing the CourseAlias object
output:
{ "alias": "d:intro-python-2025"}
Returns all aliases for a course.
Inputs:
- `course_id` (string, required) — Identifier of the course- `page_size` (integer, optional) — Maximum number of aliases to return- `page_token` (string, optional) — Token for the next page of results
- `course_id` (string, required) — Identifier of the course- `alias` (string, required) — The alias to delete
output:
{}
Announcements
Posts a new announcement to a course.
Inputs:
- `course_id` (string, required) — Identifier of the course- `body` (string, required) — JSON string representing the Announcement object
output:
{ "id": "111222333", "courseId": "123456789", "text": "Welcome to the course! Please review the syllabus.", "state": "PUBLISHED",
Returns announcements in a course, optionally filtered by state.
Inputs:
- `course_id` (string, required) — Identifier of the course- `announcement_states` (string, optional) — Filter by state (PUBLISHED, DRAFT, DELETED)- `order_by` (string, optional) — Sort order (e.g. updateTime desc)- `page_size` (integer, optional) — Maximum number of results- `page_token` (string, optional) — Token for the next page
output:
{ "announcements": [ { "id": "111222333"
Returns a single announcement.
Inputs:
- `course_id` (string, required) — Identifier of the course- `id` (string, required) — Identifier of the announcement
output:
{ "id": "111222333", "courseId": "123456789", "text": "Welcome to the course! Please review the syllabus.", "state": "PUBLISHED",
Updates only the fields specified in update_mask.
Inputs:
- `course_id` (string, required) — Identifier of the course- `id` (string, required) — Identifier of the announcement- `update_mask` (string, required) — Fields to update (e.g. text,state)- `body` (string, required) — JSON string with updated fields
output:
{ "id": "111222333", "courseId": "123456789"
Deletes an announcement. Only draft announcements may be deleted; published announcements must be archived first.
Inputs:
- `course_id` (string, required) — Identifier of the course- `id` (string, required) — Identifier of the announcement
output:
{}
Changes which students an announcement is assigned to.
Inputs:
- `course_id` (string, required) — Identifier of the course- `id` (string, required) — Identifier of the announcement- `body` (string, required) — JSON string with assignee mode and student IDs
output:
{ "id": "111222333", "courseId": "123456789", "text": "Welcome to the course!", "state"
Course Work
Creates an assignment, short-answer question, or multiple-choice question in a course.
Inputs:
- `course_id` (string, required) — Identifier of the course- `body` (string, required) — JSON string representing the CourseWork object
output:
{ "id": "222333444", "courseId": "123456789", "title": "Assignment 1: Hello World", "description": "Write your first Python program."
Returns coursework items in a course, optionally filtered by state.
Inputs:
- `course_id` (string, required) — Identifier of the course- `course_work_states` (string, optional) — Filter by state (PUBLISHED, DRAFT, DELETED)- `order_by` (string, optional) — Sort order (e.g. updateTime desc)- `page_size` (integer, optional) — Maximum number of results- `page_token` (string, optional) — Token for the next page
output:
{ "courseWork": [ { "id": "222333444"
Returns a single coursework item.
Inputs:
- `course_id` (string, required) — Identifier of the course- `id` (string, required) — Identifier of the coursework item
- `course_id` (string, required) — Identifier of the course- `id` (string, required) — Identifier of the coursework item- `update_mask` (string, required) — Fields to update (e.g. title,maxPoints)- `body` (string, required) — JSON string with updated fields
output:
{ "id": "222333444", "courseId": "123456789"
Deletes a coursework item.
Inputs:
- `course_id` (string, required) — Identifier of the course- `id` (string, required) — Identifier of the coursework item
output:
{}
Changes which students a coursework item is assigned to.
Inputs:
- `course_id` (string, required) — Identifier of the course- `id` (string, required) — Identifier of the coursework item- `body` (string, required) — JSON string with assignee mode and student IDs
Returns submissions for a coursework item, optionally filtered by user or state.
Inputs:
- `course_id` (string, required) — Identifier of the course- `course_work_id` (string, required) — Identifier of the coursework item (use `-` for all)- `user_id` (string, optional) — Restrict to submissions by this student- `states` (string, optional) — Filter by state (TURNED_IN, RETURNED, CREATED)- `page_size` (integer, optional) — Maximum number of results- `page_token` (string, optional) — Token for the next page
output:
{ "studentSubmissions": [
Returns a single student submission.
Inputs:
- `course_id` (string, required) — Identifier of the course- `course_work_id` (string, required) — Identifier of the coursework item- `id` (string, required) — Identifier of the submission
Updates fields on a submission, such as the assigned grade. Only certain fields may be updated by students or teachers.
Inputs:
- `course_id` (string, required) — Identifier of the course- `course_work_id` (string, required) — Identifier of the coursework item- `id` (string, required) — Identifier of the submission- `update_mask` (string, required) — Fields to update (e.g. assignedGrade,draftGrade)- `body` (string, required) — JSON string with updated fields
output:
{ "id": "333444555", "courseId"
Returns a turned-in submission to the student. The submission state changes to RETURNED.
Inputs:
- `course_id` (string, required) — Identifier of the course- `course_work_id` (string, required) — Identifier of the coursework item- `id` (string, required) — Identifier of the submission
output:
{}
Allows a student to reclaim a turned-in submission for further editing. The submission state changes back to NEW.
Inputs:
- `course_id` (string, required) — Identifier of the course- `course_work_id` (string, required) — Identifier of the coursework item- `id` (string, required) — Identifier of the submission
output:
{}
Course Work Materials
Creates a material resource (document, video, link, etc.) in a course.
Inputs:
- `course_id` (string, required) — Identifier of the course- `body` (string, required) — JSON string representing the CourseWorkMaterial object
Returns materials in a course, optionally filtered by Drive item or URL.
Inputs:
- `course_id` (string, required) — Identifier of the course- `material_drive_id` (string, optional) — Filter by Google Drive item ID- `material_link` (string, optional) — Filter by material URL- `page_size` (integer, optional) — Maximum number of results- `page_token` (string, optional) — Token for the next page
output:
{ "courseWorkMaterial": [ { "id": "444555666"
Returns a single course material.
Inputs:
- `course_id` (string, required) — Identifier of the course- `id` (string, required) — Identifier of the material
- `course_id` (string, required) — Identifier of the course- `page_size` (integer, optional) — Maximum number of results- `page_token` (string, optional) — Token for the next page
- `course_id` (string, required) — Identifier of the course- `page_size` (integer, optional) — Maximum number of results- `page_token` (string, optional) — Token for the next page
- `course_id` (string, required) — Identifier of the course- `user_id` (string, required) — Identifier of the teacher to remove
output:
{}
Topics
Creates a topic in a course to organize coursework and materials.
Inputs:
- `course_id` (string, required) — Identifier of the course- `body` (string, required) — JSON string representing the Topic object
output:
{ "courseId": "123456789", "topicId": "777888999", "name": "Unit 1: Variables and Data Types", "updateTime": "2025-01-15T10:00:00.000Z"}
Returns all topics in a course.
Inputs:
- `course_id` (string, required) — Identifier of the course- `page_size` (integer, optional) — Maximum number of results- `page_token` (string, optional) — Token for the next page
output:
{ "topic": [ { "courseId": "123456789", "topicId": "777888999", "name": "Unit 1: Variables and Data Types"
Returns a single topic.
Inputs:
- `course_id` (string, required) — Identifier of the course- `id` (string, required) — Identifier of the topic
output:
{ "courseId": "123456789", "topicId": "777888999", "name": "Unit 1: Variables and Data Types", "updateTime": "2025-01-15T10:00:00.000Z"}
Updates only the fields specified in update_mask.
Inputs:
- `course_id` (string, required) — Identifier of the course- `id` (string, required) — Identifier of the topic- `update_mask` (string, required) — Fields to update (e.g. name)- `body` (string, required) — JSON string with updated fields
Returns pending invitations, optionally filtered by user or course.
Inputs:
- `user_id` (string, optional) — Restrict to invitations for this user- `course_id` (string, optional) — Restrict to invitations for this course- `page_size` (integer, optional) — Maximum number of results- `page_token` (string, optional) — Token for the next page
- `student_id` (string, required) — Identifier of the student- `invited_email_address` (string, optional) — Filter by guardian email address- `page_size` (integer, optional) — Maximum number of results- `page_token` (string, optional) — Token for the next page