google-classroom-mcp
Provides tools for interacting with Google Classroom, enabling AI agents to manage and retrieve courses, coursework, student submissions, announcements, materials, teachers, and students, including turning in and reclaiming assignments.
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., "@google-classroom-mcpList my active courses and show assignments due this week"
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.
Google Classroom Model Context Protocol (MCP) Server
A native, lightweight, and robust Model Context Protocol (MCP) server for the Google Classroom API. It connects LLM reasoning engines (Antigravity, Claude Desktop, and autonomous fleet agents) directly to Google Classroom streams, assignments, submissions, rosters, and educational resources.
π Architecture & Flow
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Antigravity / Claude Desktop (MCP Client) β
βββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββ
β JSON-RPC (Stdio)
βββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββ
β google-classroom-mcp β
β - index.mjs (MCP Protocol Dispatcher) β
β - auth.mjs (OAuth 2.0 Loopback Receiver) β
β - sync-schemas.mjs (Lazy Tool Schema Generator) β
β - sync.ps1 (Ecosystem Sync & Secret Guard) β
βββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββ
β HTTPS REST with Auto Token Refresh
βββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββ
β Google Classroom REST API (v1) β
β https://classroom.googleapis.com/v1/... β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββRelated MCP server: ClassroomScribe
π Available Tools & Implementation Methods
The server implements 12 high-agency tools conforming to @modelcontextprotocol/sdk:
1. list_courses
Method:
GET https://classroom.googleapis.com/v1/coursesParameters:
courseStates(array of strings, optional): Filter by status (ACTIVE,ARCHIVED,PROVISIONED,DECLINED,SUSPENDED). Defaults to['ACTIVE'].pageSize(number, optional): Maximum items to return (default 20).studentId(string, optional): Filter courses enrolled as student ("me"or user ID).teacherId(string, optional): Filter courses instructed as teacher ("me"or user ID).
Returns: Markdown list of matching courses with ID, name, section, room, enrollment code, and web link.
2. get_course
Method:
GET https://classroom.googleapis.com/v1/courses/{courseId}Parameters:
courseId(string, required): Unique Google Classroom course identifier.
Returns: Full course object schema including enrollment code, description, teacher group email, and calendar ID.
3. list_coursework
Method:
GET https://classroom.googleapis.com/v1/courses/{courseId}/courseWorkParameters:
courseId(string, required): Target course identifier.courseWorkStates(array of strings, optional): Filter (PUBLISHED,DRAFT,DELETED).pageSize(number, optional): Maximum assignments to fetch (default 30).orderBy(string, optional): Order criteria (dueDate desc,updateTime desc).
Returns: Formatted summary of assignments, problem sets, due dates/times, max points, and links.
4. get_coursework
Method:
GET https://classroom.googleapis.com/v1/courses/{courseId}/courseWork/{courseWorkId}Parameters:
courseId(string, required): Course identifier.courseWorkId(string, required): Coursework item identifier.
Returns: Complete assignment metadata, instructions, rubrics, and attached materials (Google Drive files, YouTube videos, links).
5. list_submissions
Method:
GET https://classroom.googleapis.com/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissionsParameters:
courseId(string, required): Course identifier.courseWorkId(string, required): Coursework item ID (or"-"for all coursework).userId(string, optional): Target student filter ("me"for current authenticated student).states(array of strings, optional): Filter (NEW,CREATED,TURNED_IN,RETURNED,RECLAIMED_BY_STUDENT).
Returns: Student submission states, lateness flags, assigned grades, draft grades, and turn-in links.
6. get_submission
Method:
GET https://classroom.googleapis.com/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions/{submissionId}Parameters:
courseId(string, required)courseWorkId(string, required)submissionId(string, required)
Returns: Detailed submission record with attached student drive files, links, and grade history.
7. list_announcements
Method:
GET https://classroom.googleapis.com/v1/courses/{courseId}/announcementsParameters:
courseId(string, required): Course identifier.announcementStates(array of strings, optional): Filter (PUBLISHED,DRAFT,DELETED).pageSize(number, optional): Max announcements (default 20).
Returns: Course stream announcements, updates, creator info, timestamps, and attached assets.
8. list_coursework_materials
Method:
GET https://classroom.googleapis.com/v1/courses/{courseId}/courseWorkMaterialsParameters:
courseId(string, required): Course identifier.courseWorkMaterialStates(array of strings, optional): Defaults to['PUBLISHED'].
Returns: Standalone class resources, lecture slide decks, syllabus documents, and shared materials.
9. list_teachers
Method:
GET https://classroom.googleapis.com/v1/courses/{courseId}/teachersParameters:
courseId(string, required)
Returns: List of instructors with display name, email, and user IDs.
10. list_students
Method:
GET https://classroom.googleapis.com/v1/courses/{courseId}/studentsParameters:
courseId(string, required)
Returns: List of enrolled classmates with display name, email, and user IDs.
11. turn_in_assignment
Method:
POST https://classroom.googleapis.com/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions/{submissionId}:turnInParameters:
courseId(string, required)courseWorkId(string, required)submissionId(string, required)
Returns: Confirmation that the student submission has been formally marked as turned in for grading.
12. reclaim_assignment
Method:
POST https://classroom.googleapis.com/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions/{submissionId}:reclaimParameters:
courseId(string, required)courseWorkId(string, required)submissionId(string, required)
Returns: Confirmation that the student submission has been unsubmitted/reclaimed for editing.
π Authentication & Token Lifecycle
Credentials: Provide standard Google Cloud OAuth 2.0 Client credentials (Desktop Application).
Initial Authorisation (
npm run auth):Launches a local HTTP loopback server on port
58246.Generates Google OAuth consent URL with offline access (
prompt=consent).Opens the browser to authorize.
Captures authorization code and exchanges it for a permanent
refresh_tokenand initialaccess_token.Persists securely to
.classroom-server-credentials.json(gitignored).
Automated Refreshing:
index.mjschecks token expiration before every API request.When remaining validity is
< 60 seconds, or on receiving HTTP401 Unauthorized, it transparently callshttps://oauth2.googleapis.com/tokento refresh the access token.
π Installation & Setup
# 1. Clone repository
git clone https://github.com/Aaradhya-Dev-Tamrakar/google-classroom-mcp.git
cd google-classroom-mcp
# 2. Install dependencies
npm install
# 3. Authenticate with Google Classroom
npm run auth
# 4. Generate Antigravity tool schemas
npm run syncβοΈ Configuration
Antigravity & Claude Desktop Registration
Add this server block to your mcp_config.json:
{
"mcpServers": {
"classroom": {
"command": "node",
"args": [
"F:\\Aaradhya-Dev-Tamrakar\\google-classroom-mcp\\index.mjs"
],
"env": {
"CLASSROOM_CREDENTIALS_PATH": "C:\\Users\\Aaradhya\\.classroom-server-credentials.json",
"CLASSROOM_OAUTH_PATH": "C:\\Users\\Aaradhya\\.classroom-credentials.json"
}
}
}
}π Synchronization & Maintenance (sync.ps1)
This repository follows the centralized ecosystem Git and secret governance standard:
# Routine synchronization & rebase push:
.\sync.ps1
# Custom semantic commit message:
.\sync.ps1 -m "feat(classroom): add rubric parsing support"
# Refresh Antigravity schemas before pushing:
.\sync.ps1 -SyncSchemas
# Dry-run inspection (runs secret scanner without touching git state):
.\sync.ps1 -WhatIf
# Safe pull only:
.\sync.ps1 -PullOnlySafety Features
Secret Scanner Guard: Blocks commits if OAuth credentials, tokens, private keys, or API secrets are staged.
Atomic conventional commit formatting: Autodetects added/modified files and formats clean commit prefixes.
Rebase-safety: Always executes
git pull --rebase --autostashbefore pushing to avoid merge bubbles.
π License
MIT License. Developed for Aaradhya's Personal Tool Ecosystem.
Available Tools
12 toolsget_courseA
Get detailed information about a specific course by Course ID.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | The unique identifier of the course. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says 'Get detailed information', which implies a read-only operation but does not explicitly state that, nor does it mention any permissions, rate limits, or side effects. For a tool with no annotations, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence with no filler. It front-loads the action and resource, and the 'by Course ID' clarifies the key parameter. Every word contributes to the meaning, so it is optimally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-ID tool with one parameter and no output schema, the description is adequate but minimal. It does not disclose what 'detailed information' includes, whether it returns the same fields as list_courses, or any potential restrictions. Given the lack of annotations, the description could be more complete, but the core action and required input are clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for the single parameter 'courseId', so the schema already explains its meaning. The description adds 'detailed information' but does not elaborate on the parameter format or any constraints beyond what the schema states. The baseline of 3 applies because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Get'), a resource ('detailed information about a specific course'), and the distinguishing key ('by Course ID'). It differentiates from sibling tools like list_courses and get_coursework by specifying the resource and the ID-based lookup, so an agent can identify it without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you have a course ID and need detailed info, but it does not explicitly mention when to prefer it over siblings or when not to use it. For example, it doesn't state that list_courses should be used when you don't have an ID. The guidance is implied but not explicit, so it's adequate but not strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_courseworkA
Get detailed information for a specific assignment, including description, attached Drive files, YouTube links, and rubrics.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | The unique identifier of the course. | |
| courseWorkId | Yes | The unique identifier of the coursework. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses what the tool returns ('detailed information... including description, attached Drive files, YouTube links, and rubrics'), which is useful transparency. The word 'Get' strongly implies a read-only operation, though it does not explicitly state 'no side effects' or mention permission needs. This is adequate for a simple get tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with zero filler. The core purpose is stated first, followed by concrete examples of what is included. Every clause adds value, and it is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter get tool with no output schema and no annotations, the description is complete enough: it tells the agent what the tool returns and implies the parameters are prerequisite identifiers. It does not mention error conditions or that courseWorkId might come from list_coursework, but these are minor given the tool's simplicity and the schema's clarity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both parameters already described ('unique identifier of the course/coursework'). The description's 'specific assignment' maps to courseWorkId but adds no format, source, or additional meaning beyond the schema. Baseline 3 is appropriate since the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Get detailed information') on a specific resource ('a specific assignment'), and enumerates concrete return contents (description, Drive files, YouTube links, rubrics). This distinguishes it from siblings like list_coursework (which lists many) and get_submission (which targets submissions, not assignments), so an agent can immediately tell what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'a specific assignment' clearly implies the tool is used when you already have a courseWorkId and need details for one item, setting clear context. However, it does not explicitly name alternatives or exclusions (e.g., 'use list_coursework to find IDs' or 'not for submissions'), so it falls just short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_submissionA
Get detailed student submission info including attached files, links, and assigned grade.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | The unique identifier of the course. | |
| courseWorkId | Yes | The coursework identifier. | |
| submissionId | Yes | The submission ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. The verb 'Get' communicates a read-only operation, and the listed output content adds context, but the description does not mention error behavior, permissions, side-effect freedom, or response shape details. It is adequate but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence: the action and object come first, and the trailing clause adds useful specifics without redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-ID retrieval tool, the description is nearly complete: it names the resource and key output facets, and the schema covers all required inputs. It does not provide a full return structure, but with no output schema and this complexity level, the coverage is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds no parameter-specific meaning beyond what the schema already conveys; the relationship between courseId, courseWorkId, and submissionId is left to the generic schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Get') and resource ('detailed student submission info') and concretely lists what is included: attached files, links, and assigned grade. This clearly distinguishes it from list_submissions and the write-oriented sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by the singular 'submission' and the three required identifiers, but the description does not explicitly say when to prefer this over list_submissions or provide any when-not/exclusion guidance. An agent must infer the boundary from the tool name and siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_announcementsB
List stream announcements, notices, and updates for a course.
| Name | Required | Description | Default |
|---|---|---|---|
| orderBy | No | Sort order, e.g. 'updateTime desc'. | |
| courseId | Yes | The unique identifier of the course. | |
| pageSize | No | Maximum number of announcements to return (default 20). | |
| announcementStates | No | Filter states: PUBLISHED, DRAFT, DELETED. Defaults to ['PUBLISHED']. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 'List' implies a read-only, non-destructive operation, and expanding the resource to 'notices, and updates' adds a little behavioral context. However, it does not mention authentication needs, pagination behavior, default state filtering, or what the response contains, so transparency is only partially addressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the action, resource, and scope with no filler. Every word earns its place, and the inclusion of 'notices, and updates' adds clarity without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple four-parameter list tool with no annotations and no output schema, the description plus schema covers the basics needed for a correct call: what the tool returns in general and that courseId is required. It omits return-value shape and sibling selection guidance, but the tool is straightforward enough that these gaps are not critical. A midpoint score reflects the adequate but unremarkable completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all four parameters individually documented. The description adds no parameter-level detail beyond the existing schema and only broadly signals course scoping via 'for a course'. A baseline 3 is appropriate because the schema carries the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' and identifies the resource as 'stream announcements, notices, and updates' for a course, which is clear and distinct from most siblings. However, it does not explicitly differentiate from related list tools such as list_coursework_materials or list_coursework, so it misses the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives. It only states that it lists announcements for a course, leaving the choice of tool entirely to inference. No prerequisites, exclusions, or sibling tool comparisons are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_coursesA
List courses where the user is a student or teacher (e.g. active or archived classes).
| Name | Required | Description | Default |
|---|---|---|---|
| pageSize | No | Maximum number of courses to return (default 20). | |
| studentId | No | Filter courses enrolled as student (e.g. 'me'). | |
| teacherId | No | Filter courses taught as teacher (e.g. 'me'). | |
| courseStates | No | Filter by states: ACTIVE, ARCHIVED, PROVISIONED, DECLINED, SUSPENDED. Defaults to ['ACTIVE']. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full burden of behavioral disclosure. It only states the scope (courses where the user is a student or teacher), implying read-only behavior, but does not mention return format, pagination, side effects, or authentication requirements. The description is minimal and leaves many behavioral aspects unknown.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no wasted words. The action is front-loaded and the scope is clear. It is appropriately sized for a simple list operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 optional parameters and no output schema, the description is adequate but minimal. It explains the tool's purpose and scope but does not specify what the response looks like (e.g., array of Course objects) or any default behavior (like default page size). The agent may need to infer return structure, which is a gap for full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add any parameter-specific meaning beyond the schema, such as defaults or relationships. It does not compensate for the schema's completeness, but the schema already documents each parameter well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List courses where the user is a student or teacher'. It clearly distinguishes this from sibling tools like get_course (singular) and list_coursework (different resource) by its focus on courses and the user's role. The examples 'active or archived' add context without confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: when you need a list of courses for the current user, use this tool. However, it does not explicitly contrast it with alternatives like get_course or explain when not to use it. The phrase 'e.g. active or archived' hints at filtering but gives no exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_courseworkC
List assignments, quizzes, and coursework for a specific course.
| Name | Required | Description | Default |
|---|---|---|---|
| orderBy | No | Sort order, e.g., 'dueDate desc' or 'updateTime desc'. | |
| courseId | Yes | The unique identifier of the course. | |
| pageSize | No | Maximum number of assignments to return (default 30). | |
| courseWorkStates | No | Filter by states: PUBLISHED, DRAFT, DELETED. Defaults to ['PUBLISHED']. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only says 'List' and provides no information about default state filtering, pagination, return format, or that only PUBLISHED coursework is returned by default, which is behavior an agent would need to know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with the verb and resource front-loaded. It earns its place without wasted words, though it is somewhat terse and could have included a bit more context without harming readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a straightforward list tool: it names the resource, scopes it to a course, and the schema covers parameters and defaults. However, with no output schema and no annotation, the agent gets little context about pagination limits or default filtering, leaving minor gaps for a complete picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema describes all four parameters thoroughly (100% coverage), so the description does not need to add parameter-level detail. The description's phrase 'assignments, quizzes, and coursework' loosely aligns with the courseWorkStates and orderBy parameters but does not add meaning beyond the schema, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and identifies the resource ('assignments, quizzes, and coursework') for a specific course, making the tool's purpose clear. It differentiates from list_courses by scoping to a course, though it does not explicitly name sibling alternatives such as get_coursework or list_coursework_materials.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives like get_coursework or list_coursework_materials. The description only states what the tool does, leaving the agent to infer selection criteria from sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_coursework_materialsA
List materials, syllabi, lecture slides, and resources posted under Classwork.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | The unique identifier of the course. | |
| pageSize | No | Maximum number of materials to return (default 20). | |
| courseWorkMaterialStates | No | Filter states: PUBLISHED, DRAFT, DELETED. Defaults to ['PUBLISHED']. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry full behavioral transparency. It states the core behavior (listing materials) but does not disclose important behavioral details such as the default state filter (PUBLISHED), pagination behavior, or that it only returns materials (not assignments). These are significant gaps for a tool with no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that directly states the tool's function. It is front-loaded with the key action and resource, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters, no annotations, and no output schema, the description is minimally adequate but lacks guidance on when to use it versus similar tools and does not mention default behaviors or pagination. It is not incomplete enough to fail, but it leaves room for improvement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage, documenting all three parameters (courseId, pageSize, courseWorkMaterialStates) with descriptions. The tool description adds no additional parameter meaning beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'List' with a clear resource 'materials, syllabi, lecture slides, and resources posted under Classwork'. This clearly distinguishes it from sibling tools like list_coursework (which lists assignments) and list_announcements. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for retrieving materials under Classwork, but it does not explicitly state when to use it versus list_coursework or other listing tools. There is no mention of exclusions or alternatives, leaving the agent to infer based on the resource type.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_studentsB
List students enrolled in a course.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | The unique identifier of the course. | |
| pageSize | No | Max students to return. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It only states the action, with no mention of pagination (despite a pageSize parameter), result format, ordering, or any side effects. This leaves the agent without key details about how the tool behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no redundant words. It is appropriately minimal and front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with no output schema and no annotations, the description is thin. It omits pagination behavior (pageSize usage, defaults), result structure, and any preconditions (e.g., course existence). An agent would need to guess or inspect the schema for these details, which the schema does not fully clarify either.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description adds no extra meaning beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (list) and resource (students enrolled in a course). It is unambiguous and distinct from sibling tools like list_teachers or list_coursework, which target different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you need students of a course, but it does not explicitly mention alternatives or when not to use it. With several sibling list tools, a note distinguishing this from list_teachers would improve guidance, but the basic context is inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_submissionsB
List student submissions for a coursework (status: TURNED_IN, RETURNED, NEW, late status, assigned grade).
| Name | Required | Description | Default |
|---|---|---|---|
| states | No | Filter by submission states: NEW, CREATED, TURNED_IN, RETURNED, RECLAIMED_BY_STUDENT. | |
| userId | No | Optional student filter ('me' for current user, or student user ID). | |
| courseId | Yes | The unique identifier of the course. | |
| pageSize | No | Maximum number of submissions to return. | |
| courseWorkId | Yes | The coursework identifier (or '-' for all coursework in the course). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full behavioral burden. It conveys a read-only listing operation and indicates the kind of data returned, but it does not disclose pagination behavior, ordering, response limits, or whether any side effects occur. The verb 'List' implies read-only, which helps, but the description could be more explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: one sentence states the main operation, with a short parenthetical about returned information. It contains no filler, though the parenthetical could be structured more clearly by separating states from return fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description should compensate by explaining return shape, pagination, and exclusions. It only partially mentions returned fields and gives no usage routing or behavioral details, so an agent is under-informed for a five-parameter list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage, so the schema already documents all five parameters. The description adds little parameter-level meaning beyond the schema; the statuses mentioned in the description are already represented by the states parameter and the course/coursework IDs are already documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action and resource: 'List student submissions for a coursework.' It also hints at returned data (statuses, late status, assigned grade) and is distinguishable from the sibling get_submission by the list-vs-single-operation semantics. The parenthetical is slightly imprecise because it mixes submission states with return fields, but the core purpose remains clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is provided, and no alternatives are mentioned. The description does not explain when to prefer this over get_submission or how it relates to turn_in_assignment/reclaim_assignement, leaving the agent to infer the intended use case from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_teachersA
List teachers of a course.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | The unique identifier of the course. | |
| pageSize | No | Max teachers to return. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states that the operation is a listing, but does not describe return format, pagination behavior, ordering, or error handling. This is a significant gap for a tool with no annotation safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no fluff. It front-loads the verb and resource, and every word contributes meaning. It is appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation, the description is adequate but has gaps. It does not specify the return structure, pagination semantics, or any edge-case behavior, which is especially relevant given the absence of both annotations and an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters (courseId and pageSize) are already documented. The tool description adds no extra parameter context, which is acceptable given the high schema coverage, but it does not compensate for any implicit assumptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('teachers of a course'), clearly identifying the operation. It naturally distinguishes itself from siblings like list_students and list_courses, so an agent can understand what this tool does without confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied: call this tool when you need teachers for a specific course. However, there is no explicit guidance on when to prefer this tool over alternatives or any exclusions, so the usage context is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reclaim_assignmentB
Reclaim a turned-in student submission (unsubmit).
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | The course ID. | |
| courseWorkId | Yes | The coursework ID. | |
| submissionId | Yes | The submission ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden of behavioral disclosure. It only states the action without explaining side effects, permission requirements, reversibility, or what happens if the submission is not in a turned-in state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, tightly worded sentence with no filler. The verb and key qualifier are front-loaded, making the description immediately actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with three String ID parameters and no output schema, the description provides the core action. However, it lacks behavioral safeguards such as prerequisites, failure states, or consequences, which are especially important given the lack of annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with each parameter simply described as 'The X ID.' The description itself contributes no additional parameter-level detail, so the baseline score of 3 applies because the schema already documents all three parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'reclaim' and clear resource 'turned-in student submission', with the parenthetical 'unsubmit' removing any ambiguity. This plainly contrasts with the sibling tool turn_in_assignment, which performs the opposite action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives. Although the sibling list includes turn_in_assignment, the description does not mention conditions, prerequisites, or exclusions that would help an agent decide between them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
turn_in_assignmentC
Turn in a student submission for grading.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | The course ID. | |
| courseWorkId | Yes | The coursework ID. | |
| submissionId | Yes | The submission ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral burden, but it only states the intent ('for grading') without disclosing that this is a state-changing action, whether it is irreversible, or what grading submission entails. Mutation effects are entirely undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no filler. The verb and object are front-loaded, making it scan instantly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is too terse. It omits post-submission behavior, confirmation of success, potential errors, or any sequencing/requirements, leaving agents to infer critical operational details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter has a basic description, so the schema carries the parameter meaning. The description adds no additional parameter-level detail but does not need to; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('turn in') and resource ('student submission') with the purpose 'for grading', which clearly identifies the action. It is distinguishable from siblings like reclaim_assignment even though no explicit differentiation is stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool vs. alternatives, such as preceding with list_submissions or that reclaim_assignment reverses the operation. No context or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
v1.0.0- First observed
get_course - First observed
get_coursework - First observed
get_submission - First observed
list_announcements - First observed
list_courses - First observed
list_coursework - First observed
list_coursework_materials - First observed
list_students - First observed
list_submissions - First observed
list_teachers - First observed
reclaim_assignment - First observed
turn_in_assignment
TDQS
Scored across 12 tools
Each tool targets a distinct resource-action pair: courses, coursework, submissions, announcements, materials, and people are cleanly separated. The get/list pairs are unambiguous, and turn_in/reclaim are the only write actions with clearly opposite purposes.
All tools follow a consistent verb_noun snake_case pattern, using get_ or list_ for reads and action verbs for state changes. Pluralization is predictable based on whether the resource is a collection or an individual item.
12 tools is well within the ideal 3-15 range and each tool corresponds to a meaningful Google Classroom operation. The count feels appropriately scoped for a classroom-focused MCP without unnecessary bloat.
The server covers the main read workflows well: courses, coursework, submissions, announcements, materials, teachers, and students. It also supports the student-facing actions of turning in and reclaiming assignments, though it lacks create/update/delete operations for coursework or grading functionality.
Maintenance
Related MCP Connectors
Read and edit GA4, Search Console and Google Tag Manager from any MCP client. 29 tools.
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
Google Ads MCP server β manage campaigns, keywords, and metrics.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceThis MCP server provides comprehensive read and write access to Google Classroom, enabling management of courses, rosters, assignments, and grades. It supports full lifecycle operations for educational environments including student submissions, teacher invitations, and coursework organization.-
- FlicenseNot gradedqualityCmaintenanceIntegrates Google Classroom with LLMs and AI agents via MCP. Enables listing courses, assignments, announcements, and generating prioritized TODO summaries.1-
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to read Google Classroom dataβincluding coursework, submissions, announcements, and Drive attachmentsβthrough a remote, OAuth-protected MCP server with interactive Google sign-in.-
- FlicenseNot gradedqualityCmaintenanceEnables students to access Google Classroom through MCP, listing courses, upcoming assignments, tasks, grades, announcements, materials, topics, and teachers, with optional tools to submit or cancel submissions.-