google-classroom-mcp
Provides read-only access to Google Classroom, with tools for listing courses, retrieving course details, viewing coursework and due dates, checking upcoming assignments across active courses, reading announcements, and pulling teacher and student rosters plus submission states and grades for 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-mcpwhat assignments are due this week across my classes?"
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-mcp
Read-only Google Classroom access for DeepSeek — and any other MCP-capable agent.
This is a Model Context Protocol server that turns your Google Classroom account into tools an LLM can call: courses, coursework, due dates, announcements, rosters and student submissions.
DeepSeek's API does not speak MCP by itself, so point an MCP-capable harness at this server
and select a DeepSeek model there. Works with DeepSeek Harness,
opencode, Claude Desktop, Cursor, or the bundled example agent (examples/deepseek_agent.py)
that calls the DeepSeek API directly.
Tools
Tool | Returns |
| Courses you teach or attend (id, name, section, room, state, link) |
| One course with description and enrollment code |
| Assignments, quizzes, questions and materials, with due dates |
| Upcoming coursework across all active courses, sorted by due date |
| Recent announcements in a course |
| Teacher roster (name, email) |
| Student roster (name, email) |
| Submission state and grades for one assignment |
Every tool is read-only. The server cannot create, edit or delete anything in Classroom.
Related MCP server: Google Classroom MCP
Setup
1. Create a Google OAuth client
Open the Google Cloud Console and create a project.
APIs & Services → Library: enable the Google Classroom API.
APIs & Services → OAuth consent screen: choose External, fill in the required fields, and add your own Google account under Test users. In Testing mode Google expires refresh tokens after 7 days. For a durable personal setup, click Publish app (no verification needed for personal use; you will see an "unverified app" warning during sign-in).
APIs & Services → Credentials → Create credentials → OAuth client ID: application type Desktop app, then download the JSON.
Save the file as
~/.google-classroom-mcp/client_secret.json(Windows:%USERPROFILE%\.google-classroom-mcp\client_secret.json), or setCLASSROOM_MCP_CLIENT_SECRET_FILEto its path.
2. Install
git clone https://github.com/praisethefacts/google-classroom-mcp
cd google-classroom-mcp
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .3. Sign in once
google-classroom-mcp-authA browser window opens; grant the read-only scopes. The refreshable token is cached at
~/.google-classroom-mcp/token.json.
4. Connect an MCP host
opencode (~/.config/opencode/opencode.json):
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"google-classroom": {
"type": "local",
"command": ["google-classroom-mcp"],
"enabled": true
}
}
}Claude Desktop / Cursor (claude_desktop_config.json or .cursor/mcp.json):
{
"mcpServers": {
"google-classroom": {
"command": "google-classroom-mcp"
}
}
}If the host cannot find google-classroom-mcp, use the absolute path to the script inside
your venv (Windows: ...\.venv\Scripts\google-classroom-mcp.exe).
DeepSeek Harness (dsh)
DeepSeek Harness installs integrations as
plugin bundles. Use the ready-made
dsh-plugin-google-classroom
bundle: open Plugins in DSH and install
github:praisethefacts/dsh-plugin-google-classroomor skip the bundle and load the overlay directly:
dsh web --patch examples/dsh-overlay.cordis.ymlBoth run the server with uvx (no separate pip install needed), so only steps 1–3 above
still apply — the Google OAuth client and one-time sign-in. Copy the overlay's insert row
into $DSH_HOME/profiles/<name>/cordis.patch.yml to keep it across runs. DSH scrubs
credential-looking environment variables before launching stdio servers, so keep the default
file-based token at ~/.google-classroom-mcp/token.json rather than CLASSROOM_MCP_* env
vars.
5. Optional: run it from a plain DeepSeek script
pip install -e ".[example]"
set DEEPSEEK_API_KEY=sk-... # PowerShell: $env:DEEPSEEK_API_KEY="sk-..."
python examples/deepseek_agent.py "What do I have due this week?"The example starts the MCP server, converts its tools into OpenAI-style function schemas,
and lets deepseek-chat call them in a loop.
Environment variables
Variable | Purpose |
| Override the config directory (default |
| Path to the OAuth client JSON |
| Path to the cached token (default |
| Inline OAuth client instead of a file |
| Inline token JSON, for hosted/remote setups |
| Used only by |
Security
Only read-only Classroom scopes are requested (see
classroom_mcp/auth.py).The token lives outside the repository and is git-ignored. Never commit it.
Revoke access anytime at myaccount.google.com/permissions.
Development
pip install -e ".[dev]"
pytest -qLicense
Available Tools
8 toolsget_courseA
Get one course by id, including description and enrollment code.
Args: course_id: Course id from list_courses (numeric string).
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the return payload (description and enrollment code), which is genuine behavioral information, but says nothing about failure modes (invalid/unknown id), permissions, or authentication requirements.
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?
Two compact lines: purpose first, then the parameter note. No filler, nothing repeated from the schema's structured 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?
For a one-parameter read tool with no output schema and no annotations, the description covers the essentials: what is fetched, what comes back, and where the id originates. Only error/empty-result behavior is unaddressed, which is a minor gap at this complexity.
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 0%, so the description must compensate — and it does, documenting the single parameter's provenance ('from list_courses') and its format ('numeric string'). That is meaningful semantics the bare string-typed schema does not supply.
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?
States a specific verb+resource ('Get one course by id') and names the fields returned (description, enrollment code). It is distinguishable from the list_* siblings by being singular and by pointing at list_courses as the id source, though it never explicitly contrasts itself.
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 is implied rather than stated: the note that course_id comes from list_courses suggests the retrieve-after-list flow. There is no explicit when-to-use/when-not-to-use guidance or mention of alternative ways to reach course data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_announcementsC
Recent announcements for a course.
Args: course_id: Course id from list_courses. limit: Maximum number of announcements to return.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| course_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears the full behavioral burden. It hints at a recency window via 'Recent' but never defines it, and says nothing about ordering, pagination, whether results are read-only, or permission requirements for the course.
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?
Front-loaded single line followed by a compact args block; nothing is padded. Minor duplication of schema field names in the Args section, but it costs little.
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 two-parameter read tool with no output schema, the description is minimally viable, but the undefined 'recent' window and absent return/ordering notes leave gaps an agent may need to probe for.
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 0%, so the description must compensate, and it does document both parameters — notably the useful cross-reference that course_id comes from list_courses. The limit explanation restates the parameter name rather than adding meaning (e.g., default, cap, or paging behavior).
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?
States the resource (announcements) and scope (for a course) clearly enough that an agent knows what it returns. It is the only announcements-oriented tool among the siblings, so no explicit differentiation was needed, but the phrasing is nominal rather than a verb+resource statement.
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, no prerequisites, and no alternatives named. An agent cannot tell from the description when this should be preferred over the other list_* tools or what conditions limit its usefulness.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_coursesA
List Google Classroom courses for the signed-in account (teacher or student).
Args: course_states: Optional state filter. Defaults to ["ACTIVE"]. Other values: "ARCHIVED", "PROVISIONED", "DECLINED", "SUSPENDED"; pass several to include multiple states.
| Name | Required | Description | Default |
|---|---|---|---|
| course_states | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that results are scoped to the signed-in account and cover both teacher and student roles, but it says nothing about pagination, result limits, ordering, or required OAuth scopes for a list operation that can grow large.
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 purpose sentence is front-loaded and the parameter note is compact and free of padding. Slightly more structure than needed for a one-parameter tool, but nothing wasteful.
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 single-parameter read tool with no output schema and no annotations, this is close to sufficient, but a listing tool should mention pagination behavior or a result cap so the agent knows how to retrieve everything. That omission is the main remaining gap.
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 0%, so the description must compensate and largely does: it explains course_states is optional, gives the full value set (ARCHIVED, PROVISIONED, DECLINED, SUSPENDED alongside ACTIVE), and notes that multiple values can be combined. The only gap is the stated default ["ACTIVE"] differing from the schema's null default.
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?
States a specific verb and resource ("List Google Classroom courses") plus the scope ("for the signed-in account") and the two role perspectives covered (teacher or student). This clearly distinguishes it from siblings like get_course or list_coursework, though it doesn't name those alternatives.
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 is implied by the verb and the account scoping, but there is no explicit guidance on when to use list_courses versus get_course for a single course, nor any note about when archived/provisioned states should be requested. Adequate but leaves selection logic to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_courseworkA
List coursework (assignments, quizzes, questions, materials) for a course.
Args: course_id: Course id from list_courses. states: Optional state filter. Defaults to ["PUBLISHED"]; can include "DRAFT" or "DELETED". limit: Maximum number of items to return.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| states | No | ||
| course_id | Yes |
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. It does disclose one genuine behavioral trait beyond the schema: results default to PUBLISHED-only unless states is widened. It omits pagination behavior, ordering, and auth requirements, which is a notable gap for a list endpoint 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 purpose line is front-loaded and the three argument notes are terse and each earn their place. The Args block formatting is slightly verbose for only three parameters, but nothing is wasted.
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 annotations and no output schema, the description is the only source of behavioral context. It identifies the returned item types, which partly covers the return shape, but gives no pagination, ordering, or truncation semantics for a list tool — enough to call it, not enough to use it confidently.
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 0%, so the description must compensate, and it does: course_id is sourced ('from list_courses'), states is explained with its default and permissible values, and limit is described as a maximum item count. It lacks format details (e.g., whether states combines as OR, limit bounds), so it stops short of a 5.
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?
States a specific verb (List) and resource (coursework) and even enumerates what counts as coursework (assignments, quizzes, questions, materials), scoped 'for a course'. It does not explicitly contrast itself with siblings like list_courses, though the course_id reference to list_courses makes the hierarchy inferable.
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 is implied: call this to enumerate coursework within a course. The states note ('Defaults to ["PUBLISHED"]; can include "DRAFT" or "DELETED"') gives useful filtering context, but there is no explicit when-to-use vs alternative or exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_due_soonB
Upcoming coursework across all active courses, sorted by due date.
Args: days: Look-ahead window in days (default 7). include_overdue: Also include items whose due date already passed.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| include_overdue | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose useful behavior beyond the schema: results are sorted by due date and limited to active courses. However, it says nothing about read-only nature, result volume, pagination, or what happens to courses not marked active.
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?
Front-loads the one-line purpose, then uses a compact Args block. The parameter restatement is justified because the schema has zero description coverage, though it is slightly terse on format details.
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 two-parameter read tool with no output schema and no annotations, the description covers purpose, scope, ordering, and both parameters adequately. It stops short of describing return shape (e.g., coursework fields, grouping by course) or result limits, which an agent would benefit from.
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 0%, so the description must compensate, and it does: 'days' is defined as a look-ahead window with a stated default, and 'include_overdue' is explained as also returning items whose due date has passed. Only minor gaps remain, such as whether 'days' counts from now and how overdue items interact with the window.
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?
States a concrete verb+resource ('Upcoming coursework across all active courses') plus ordering ('sorted by due date'), so the agent knows it is a scoped, time-windowed list rather than a generic coursework fetch. It does not explicitly name list_coursework as the unfiltered alternative, so differentiation from siblings is only implicit.
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 'upcoming' framing implies the intended context, but there is no explicit statement of when to use this over list_coursework, nor any prerequisite or exclusion guidance. The agent must infer the choice from the tool name and the first sentence alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_studentsA
Student roster (names and emails) for a course.
Args: course_id: Course id from list_courses.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes |
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' plus the return-content disclosure (names and emails) establishes this as a read, and the course_id provenance is useful. However, it says nothing about permissions, pagination, or what happens with an invalid course_id.
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?
Two short lines, front-loaded with the resource and return fields before the argument note. No wasted prose, though the 'Args:' block is slightly formal for a single parameter.
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 one-parameter read tool with no output schema and no annotations, the description covers the essentials: what it returns and where the argument comes from. Missing pagination/volume and error context keeps it from a 5.
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 0% — the schema only says 'Course Id'. The description compensates by identifying the argument's source ('Course id from list_courses'), which is real value beyond the schema. It does not describe the id's format or failure behavior, so not a 5.
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?
States a specific resource and scope ('student roster for a course') and discloses the returned fields (names and emails), which distinguishes it from siblings like list_teachers or list_submissions. It does not explicitly name or contrast with those siblings, so it falls short of a 5.
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 is only implied: the tool is clearly for enumerating a course's students, and the note that course_id comes 'from list_courses' hints at the prerequisite call. There is no explicit when-to-use vs when-not-to-use guidance or named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_submissionsB
Submission state and grades for one assignment.
Args: course_id: Course id from list_courses. coursework_id: Coursework id from list_coursework. user_id: "me" (default) for the signed-in student's submission, a student's numeric id/email, or "-" for all students (teachers only). limit: Maximum number of submissions to return.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| user_id | No | me | |
| course_id | Yes | ||
| coursework_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies 'submission state and grades' are returned but does not disclose auth requirements, pagination behavior, whether the limit truncates or throttles, or the default user scoping beyond what is in the schema. For a read tool with zero annotation coverage, 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?
One-line purpose followed by a structured Args block. Efficient, though the purpose sentence omits an explicit verb and relies on the name for action. No wasted sentences.
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?
Covers parameters well and states the return content at a high level, but for a read tool with no annotations and no output schema, it omits auth requirements, pagination/limit semantics, and error behavior. Adequate but with clear gaps.
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 0%, so the description must compensate, and it does: user_id explains the 'me' default, numeric id/email forms, and the teacher-only '-' value; limit is defined as maximum submissions; course_id and coursework_id are traced to their source tools. This meaningfully exceeds the bare schema titles.
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?
States a specific resource and scope: submission state and grades for one assignment. The verb is implicit ('list') matching the name. It clearly distinguishes itself from sibling list_* tools by naming the assignment-submissions domain, though it does not explicitly contrast with list_students or list_coursework.
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 explicit when-to-use or when-not-to-use guidance. It implies teacher/student context via the '-' value but does not state that listing all students requires teacher privileges as a selection condition, nor does it point to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_teachersA
Teacher roster (names and emails) for a course.
Args: course_id: Course id from list_courses.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes |
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. It discloses the returned fields (names and emails), which is useful behavioral context, but says nothing about read-only safety, permissions/privacy constraints on student-teacher data, result ordering, or pagination.
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 purpose line is front-loaded and waste-free, and the Args block is terse. The block is slightly redundant with the schema, but with 0% schema coverage it earns its place.
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 single-parameter, no-output-schema list tool this is close to complete: the agent knows what it returns and where the id comes from. Only pagination/ordering behavior and any access constraints are absent.
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 0%, so the description must compensate, and it does: it names the single parameter and tells the agent where the value comes from (list_courses), which is the key semantic an agent needs. It stops short of format/validation details, but the core meaning is added.
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?
States a specific verb (list) and resource (teachers), plus the payload returned (names and emails) and its scope (for a course). It is distinguishable from list_students by resource, but it does not explicitly differentiate itself from that sibling or from get_course.
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 is implied: this is the roster tool for a course, and the arg note points the agent to list_courses to obtain the required id. There is no explicit statement of when to prefer this over list_students/get_course or of any prerequisite conditions beyond the id source.
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.
8 tool updates
v0.1.0- First observed
get_course - First observed
list_announcements - First observed
list_courses - First observed
list_coursework - First observed
list_due_soon - First observed
list_students - First observed
list_submissions - First observed
list_teachers
TDQS
Scored across 8 tools
Each tool targets a distinct resource and scope: courses, single course, coursework, due-soon across courses, announcements, teachers, students, and submissions. The only near-overlap is list_coursework vs list_due_soon, but the descriptions clearly distinguish per-course listing from cross-course due-date aggregation.
Consistent snake_case verb_noun pattern throughout (list_courses, get_course, list_coursework, etc.). The single 'get_course' appropriately pairs with 'list_courses' for singular retrieval, so the convention is predictable.
Eight tools is well-scoped for a read-oriented Classroom client. Each tool earns its place by covering a distinct entity or query, with no redundancy or filler.
Read coverage is solid (courses, coursework, submissions, announcements, rosters), but the surface is entirely read-only. Common Classroom mutations—creating courses/coursework, submitting assignments, grading, posting announcements, or updating/deleting—are absent, creating dead ends for write-oriented workflows.
Maintenance
Related MCP Connectors
Read-only MCP tools for AI agent discovery, structured resources, and NIULAI information.
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.
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
Related MCP Servers
- 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.-
- FlicenseAqualityCmaintenanceEnables Claude to read and write Google Classroom data, including courses, coursework, materials, announcements, rosters, submissions, and Drive attachment contents.15-
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to operate Google Classroom, letting users list courses and students, check assignment submissions, and create coursework and announcements through natural language.-