google-classroom-student-mcp
A read-only Google Classroom MCP server that lets students ask an AI about classes, assignments, due dates, missing work, grades, feedback, materials, announcements, and grade targets.
List active classes and course IDs.
Show work not turned in, with Classroom links.
Export upcoming due dates as an ICS calendar file.
Show upcoming due dates and overdue/missing assignments.
List class assignments and full details/attachments for one assignment.
Check submission status, lateness, grade, and teacher comments.
Summarize grades and calculate points needed for a target grade.
Show recent announcements, course materials with Drive links, and class teachers.
Provide a catch-up digest of new announcements, grades, overdue work, and upcoming due dates.
Read-only access to a student's Google Classroom account: lists active courses, homework not yet turned in, upcoming and missing/overdue assignments with due dates, points earned on returned work (grades), recent announcements, and posted course materials.
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-student-mcpWhat do I still need to turn in for all 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 server for students
Ask your AI what's actually left to do in Google Classroom.
npx google-classroom-student-mcp setupThat one command prints the config for your AI app. Details are in Quick start with npx.
This is the Google Classroom MCP server: a free, open source MCP server that lets Claude Desktop, Claude Code, Cursor and other MCP apps read your Classroom classes, assignments, due dates, missing work, grades on returned work with the comments your teachers leave on them, the points you need to reach a target grade, announcements, course materials and a catch up digest. It is read only. It can never turn in, edit or delete anything. Not affiliated with Google.
Free forever. No sign up and no subscription. Your login details only ever go to Google.
Try it now
Ask these right after setup:
"What do I still need to turn in?"
"What's overdue?"
"What's due this week across all my classes?"
"What did my teacher say about my work?"
"What do I need to score to get a 90?"
"What's new since yesterday?"
Sample answer
The third question goes to get_upcoming_due_dates. It reads your classes and prints one line per assignment, soonest first. Here is what an answer looks like:
- Essay outline (English) due Fri, Oct 23
- Lab write up (Biology) due Fri, Oct 23, 11:59 p.m. UTC
- Problem set 4 (Calculus) due Mon, Oct 26Every line has the assignment title, the class and the due date. Work you already turned in is left out. Pass days_ahead set to 7 to that tool for a week ahead. Classroom keeps due times in UTC, and the server prints them in your own time zone. More sample answers are in Questions students ask.
Related MCP server: Classroom MCP
Quick start with npx
Install the Google Classroom MCP server with npx, then add it to your AI app. Run npx google-classroom-student-mcp setup to print the config blocks below, with the three Google values filled in when they are set in your environment. Pick your app.
Claude Desktop
Add this to claude_desktop_config.json:
{
"mcpServers": {
"classroom": {
"command": "npx",
"args": ["-y", "google-classroom-student-mcp"],
"env": {
"GOOGLE_CLIENT_ID": "your-id",
"GOOGLE_CLIENT_SECRET": "your-secret",
"GOOGLE_REFRESH_TOKEN": "paste-from-login"
}
}
}
}Claude Code
Run this one command:
claude mcp add google-classroom-student-mcp \
-e GOOGLE_CLIENT_ID=your-id \
-e GOOGLE_CLIENT_SECRET=your-secret \
-e GOOGLE_REFRESH_TOKEN=paste-from-login \
-- npx -y google-classroom-student-mcpOr put the same JSON block as Claude Desktop in a .mcp.json file in your project folder, or run claude mcp add-json with it.
Cursor
Put this in .cursor/mcp.json in your project folder, or in ~/.cursor/mcp.json to use it everywhere:
{
"mcpServers": {
"classroom": {
"command": "npx",
"args": ["-y", "google-classroom-student-mcp"],
"env": {
"GOOGLE_CLIENT_ID": "your-id",
"GOOGLE_CLIENT_SECRET": "your-secret",
"GOOGLE_REFRESH_TOKEN": "paste-from-login"
}
}
}
}Other MCP apps take the same mcpServers JSON, with command set to npx and args set to ["-y", "google-classroom-student-mcp"].
Setup (about 10 minutes, one time)
Google makes every app ask for its own permission, so you create a small private "app" that only you use.
Go to the Google Cloud console and create a project.
Turn on the Google Classroom API for it (APIs & Services > Library).
Under APIs & Services > OAuth consent screen, set it up as External, and add your own Google account as a test user.
Under Credentials, create an OAuth client ID of type Desktop app. Copy the client ID and secret.
Run the one time sign in:
GOOGLE_CLIENT_ID=your-id GOOGLE_CLIENT_SECRET=your-secret npx google-classroom-student-mcp loginOpen the link it prints, approve read only access, and copy the three values it prints.
Optional: set CLASSROOM_TIMEZONE to a time zone name such as America/Toronto. Work with a due date but no due time counts as due at the end of that day in this zone. Without it, the time zone of the computer running the server is used.
Add them to your AI app's MCP config. Run
npx google-classroom-student-mcp setupand paste the block for your app, or use one of the formats from the Quick start above.Restart your AI app and ask "what's due this week?"
Run npx google-classroom-student-mcp doctor any time to check that your setup works.
Quick test without the app setup: set
GOOGLE_ACCESS_TOKENto a token from the OAuth Playground with the Classroom read only scopes. It stops working after about an hour.
Questions students ask
Here are the questions students ask, and the tool that answers each one. The answer comes back in the chat, ready to read.
Your question | Tool | What the answer holds |
"What do I still need to turn in?" |
| Every assignment you have not handed in, with a link to open it in Classroom |
"What does this assignment ask for?" |
| The teacher's description, the files and links attached to it, its due date, points and your status |
"Can you give me my due dates as a calendar file?" |
| Build an ICS calendar file of upcoming due dates |
"What's overdue?" |
| Work that was due and is still not handed in |
"What's due this week across all my classes?" |
| Work that is due soon, soonest first |
"What did my teacher say about my work?" |
| The comment the teacher left on the graded work, with the score and a link to open it in Classroom |
"What do I need to score to get a 90?" |
| The points you need on the work that is left to reach that percent in each class |
"What did my teachers post lately?" |
| Recent announcements from every class |
"What's new since yesterday?" |
| New announcements, new grades, overdue work and what is due next |
Here is what the answers look like.
Sample answer for get_todo
The question "What do I still need to turn in?" goes to get_todo. It prints everything you have not handed in, and it puts the Classroom page of each one under the title so you can open the work itself.
0 due today, 2 overdue
- Lab safety form (English) due Fri, Oct 9
link: https://classroom.google.com/c/English/course/1/courseWork/w2
- Chapter 3 questions (Biology) due Mon, Oct 19
link: https://classroom.google.com/c/Biology/course/2/courseWork/w4
- Essay outline (English) due Fri, Oct 23
link: https://classroom.google.com/c/English/course/1/courseWork/w1
- Lab write up (Biology) due Fri, Oct 23, 11:59 p.m. UTC
link: https://classroom.google.com/c/Biology/course/2/courseWork/w3
- Problem set 4 (Calculus) due Mon, Oct 26
link: https://classroom.google.com/c/Calculus/course/3/courseWork/w5The first line counts what is due today and what is overdue. Work you already turned in is left out, and work with no due date goes last. Pass course_ids to check a few classes only. You can also pass course_name, for example Biology, to pick a class by part of its name without looking up its ID first.
Sample answer for get_missing_assignments
The question "What's overdue?" goes to get_missing_assignments. It prints the work that was due and is still not handed in, the most recent due date first.
- Chapter 3 questions (Biology) was due Mon, Oct 19
- Lab safety form (English) was due Fri, Oct 9Sample answer for get_whats_new
The question "What's new since yesterday?" goes to get_whats_new. It prints one digest with new announcements, new grades, overdue work and what is due next. The times in this sample are in UTC.
New announcements (last 7 days)
- Biology (Wed, Oct 21, 8:00 a.m. UTC) Field trip permission slip due Friday
- English (Tue, Oct 20, 9:00 a.m. UTC) Bring your textbook
New grades (last 7 days)
- Midterm review (Calculus) graded 88/100 on Tue, Oct 20, 3:00 p.m. UTC
teacher said: Good work on the analysis. Watch the units on question 3.
link: https://classroom.google.com/c/Calculus/course/3/courseWork/w6
Overdue work
- Chapter 3 questions (Biology) was due Mon, Oct 19
- Lab safety form (English) was due Fri, Oct 9
Due next (14 days)
- Essay outline (English) due Fri, Oct 23
- Lab write up (Biology) due Fri, Oct 23, 11:59 p.m. UTC
- Problem set 4 (Calculus) due Mon, Oct 26Pass since_days to look further back and days_ahead to look further ahead.
Tools
All tools are read only.
Tool | What it does |
| Your active classes and their IDs |
| Everything assigned that you haven't turned in |
| Build an ICS calendar file of upcoming due dates |
| Work due soon, soonest first |
| Past due work you haven't turned in |
| Assignments for a class with due dates and status |
| Everything about one assignment: description, attachments, due date, points and status |
| Did your teacher get your work: turned in time, late flag, grade and the teacher's comment for one assignment |
| Points earned on returned work for each class, with the comment the teacher left |
| Points needed on the work left to reach a target percent |
| Recent announcements |
| Materials posted in a class |
| Teachers of a class with their email when Classroom shares it |
| One catch up digest: new announcements, new grades, overdue work and what is due next |
The same list is in plain text in llms.txt, one line per tool with its description and the arguments it takes. That file ships with the package, so site indexes and AI apps that read plain text files can pick it up.
get_todo, get_assignments, get_assignment_details, get_announcements and get_course_materials print the Classroom page of each item under the title, so the AI can hand the student a direct link to the work. get_course_materials also prints the Drive link of every file attached to a material. Classroom sends a link only for published items.
Google Classroom has no overall course grade, so get_my_grades adds up graded work only and says so. When a class weights its work by grading category, it also prints a weighted percent, using only the categories that have graded work. get_target_grade still uses plain points.
get_my_grades and get_whats_new print what the teacher wrote when they returned the work, under the score, with the Classroom page of the work. get_my_grades lists the graded work that has a comment under each class.
get_todo, export_due_dates_calendar, get_upcoming_due_dates, get_missing_assignments, get_my_grades, get_target_grade and get_whats_new accept an optional list of course IDs (course_ids), so you can ask about a few classes only instead of all of them. get_upcoming_due_dates and get_whats_new also accept an optional number of days to look ahead (days_ahead). get_announcements and get_whats_new also accept an optional number of days to look back (since_days), which defaults to 7 days in the digest and means no date filter in announcements. get_announcements and get_course_teachers accept course IDs (course_ids) too. get_course_teachers also accepts course_name. get_target_grade takes a required target_percent from 0 to 100, which is the class percent you want.
get_target_grade adds up the points earned on graded work and the points the work that is left is worth. It then works out how many of those points you need to reach target_percent. Work counts as left when it has points and no grade yet, and work the teacher already returned without a grade is left out. If the target needs more points than the work left is worth, the answer says so and gives the best percent you can still reach. The server only sees the points on each piece of work, not any weighting the teacher may use, so the answer counts every point the same.
get_whats_new is the catch up digest. It prints new announcements, new grades with the comment the teacher left, overdue work and what is due next in one answer. An announcement counts as new when it was posted or changed inside the window. The date of a new grade comes from the teacher's comment on the work when there is one, otherwise from the last change to the assignment. The comment itself is printed under the grade.
Google Classroom vs Brightspace MCP
Google Classroom and D2L Brightspace are different platforms, so they need different servers. This one reads Google Classroom. The Brightspace MCP reads D2L Brightspace. Here is how they line up.
Google Classroom MCP (this one) | Brightspace MCP | |
Platform | Google Classroom, the one inside Google Workspace for Education | D2L Brightspace, common in colleges and universities |
Install |
|
|
Sign in | You make your own OAuth app in the Google Cloud console, run one time sign in, then paste the client ID, the client secret and the refresh token | You pick your school and sign in with your own school account in a browser window. Any sign in method your school uses works, and your password is never stored |
After setup | While your Cloud app is in testing mode, Google expires the refresh token every 7 days, so you run the login command again now and then | It stays signed in quietly, and a browser window only opens when your school asks you to sign in again |
What your school has to do | Nothing. Your own Google account and your own Cloud project are enough, though a school admin can block third party apps | Nothing. It uses your own student sign in, so no API key from an administrator is needed |
Classes and work | Active classes, then every assignment with its due date, its points, whether you turned it in and a link to open it in Classroom | Enrolled courses, then assignments and quizzes with the real submission status of each one |
Grades | Points earned on returned work, added up per class, plus a target grade tool that says how many points you need on the work that is left. Google Classroom has no overall grade, so the percentage is only over graded work | Grade breakdown per course with points, percentages and instructor comments, plus a target grade tool that tells you what you need on the work that is left |
News | Recent announcements, and a catch up digest with new announcements, new grades, overdue work and what is due next | Recent announcements, and a catch up digest that also covers newly marked work, unread discussions and quizzes you have not tried yet |
Course files | Materials posted in a class, each with a link to open it and the Drive link of every attached file | Course modules, files, links, the syllabus, the files attached to an assignment, discussions, class lists and calendar events such as exams and labs. It can also save a course file to a folder you pick and build a calendar file of your deadlines |
Read only | Yes, it can never turn in, edit or delete anything | Yes, it only reads from Brightspace |
Price and license | Free forever, open source, MIT license | Open source, MIT license, and it runs on your own computer |
Both servers only read, so neither one can hand in your work for you. If your classes are in Google Classroom, install this one. If your school runs D2L Brightspace, install the Brightspace MCP instead.
Other Brightspace servers exist too, such as brightspace-mcp-server and brightspace-mcp. The author keeps a side by side comparison of them at brightspace-mcp.netlify.app/compare.
Privacy and security
Your credentials stay on your computer and are only sent to Google.
Nothing is sent to any other server by this project.
Only read only permissions are requested. Remove access any time at myaccount.google.com/permissions.
Troubleshooting
Message | Fix |
Not signed in | Run |
Sign in failed, expired or revoked | While your app is in testing mode, Google expires refresh tokens after 7 days. Run |
Access denied | Your school's Google admin may block third party apps. Ask your admin or use a personal account. |
Not found | Check the course or item ID in your request. |
Rate limited | Too many requests. Wait a minute and try again. |
Google did not return a refresh token | Remove the app from your connected apps and run |
Development
npm install
npm run build
npm testTests run against a fake Google server, so they need no account or network. Other tests check that the tool table in this README, llms.txt and glama.json still list every tool, that the tool descriptions in llms.txt and glama.json match the code, that every sample answer in this README and in llms.txt matches what the tool really prints, and that the version matches package.json.
The version that --version prints and the MCP handshake sends comes from package.json, so bump the version there and nowhere else.
The test runner needs Node 22.12 or newer. The server itself runs on Node 20 or newer.
More free student MCP servers
All free, open source and read only where they touch your accounts. Browse the full list at brightspacemcp.com/more-mcps.
This server is also listed in the Smithery, Glama and mcp.so directories.
Server | What it does |
D2L Brightspace for AI. Due dates with real submission status, grades, a target grade calculator and course files. | |
Canvas LMS for AI, read only. Due dates, missing work, grades and announcements. | |
Moodle for AI, read only. Due dates, overdue work, grades and announcements. | |
GPA, grade conversion and the grade you need on the final, for AI. Works offline, no account. | |
APA, MLA and Chicago citations from a DOI, an ISBN or typed details. No account. | |
Exam study schedules, spaced repetition dates, pomodoro plans and assignment milestones. Works offline. | |
Search scholarly papers, find open access copies and related work through OpenAlex. No key needed. | |
Clean, convert, dedupe and lint BibTeX, RIS and CSL JSON reference lists, and make cite keys. Works offline. | |
Find free legal copies of textbooks on OpenStax, DOAB and Open Library, look up editions by ISBN and suggest cheaper older ones. | |
Chemistry and physics homework math: molar mass, balancing equations, grams to moles, unit conversion and significant figures. Works offline. | |
Offline writing metrics for essays. Word and page counts, readability scores, passive voice, repeated openers, filler words, long sentences and word limit checks, so students can check their work against assignment requirements. No account, no network. | |
Syllabus to calendar MCP server. Extract dates from syllabus text, build an ics calendar, expand recurring classes and merge calendars. Works offline, no account. | |
Job application tracker MCP server. Track internships, jobs, interviews and deadlines offline, see what is coming up, and export your list as CSV or Markdown. No account and no API keys. |
Picking between the two school platforms? See Google Classroom vs Brightspace MCP.
License
MIT
Available Tools
14 toolsexport_due_dates_calendarExport due dates calendarARead-only
Build an ICS calendar file of upcoming due dates so they can be imported into a calendar app. Pass course_ids to limit it, or leave empty for all active classes. Use this when the user asks 'Can you give me my due dates as a calendar file?'
| Name | Required | Description | Default |
|---|---|---|---|
| course_ids | No | Classroom course IDs to check. Leave empty for all active classes. | |
| course_name | No | Part of a class name or section, for example Biology. It is matched without checking case and added to course_ids, so you can skip get_my_courses. Leave empty to use course_ids only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, and the description adds the key behavioral fact that the result is an ICS file meant for calendar import, plus the default scope of all active classes when no filter is given. It omits anything about time range covered by 'upcoming' or file size/limits.
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?
Three short sentences, output artifact first, filtering second, triggering user phrasing last — every sentence carries information and nothing is padding.
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 present, the description correctly identifies the returned artifact as an ICS file, and both optional filters are covered by the schema. Only the meaning of 'upcoming' (the date window) is left unspecified.
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%, so both parameters are already documented, including the get_my_courses hint and the name-matching behavior. The description only restates the course_ids scoping and default, and never mentions course_name, so it adds little beyond the schema baseline.
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 artifact ('Build an ICS calendar file of upcoming due dates'), which cleanly separates it from siblings like get_upcoming_due_dates that return raw date data rather than an importable file.
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?
Gives an explicit trigger ('Use this when the user asks... as a calendar file?') and states both scoping modes. It does not name the nearest alternative (get_upcoming_due_dates), so an agent must infer that the file-export intent is the deciding factor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_announcementsAnnouncementsARead-only
Recent announcements, each with a link to open it in Classroom. Pass course_ids or since_days to limit how far back they go, or leave empty for all active classes. Use this when the user asks 'Did my teacher post anything new?' or 'What did my teacher announce?'
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | How many classes to skip. Up to 15 classes are read at a time, so pass 15 to see the next 15. Leave empty to start at the first class. | |
| course_ids | No | Classroom course IDs to check. Leave empty for all active classes. | |
| since_days | No | Only show announcements updated within this many days back from now. Leave empty to show every recent announcement. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description usefully adds that results link back to Classroom and that the default scope is all active classes, but says nothing about result volume, pagination windows, or auth requirements beyond what the schema's offset text implies.
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 sentences, front-loaded with what the tool returns, followed by filtering guidance and use-case triggers. The quoted example questions cost some length but serve the routing decision; nothing is redundant enough to penalize.
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?
A simple read-only list tool with fully described parameters and annotations; the description covers output shape and scoping, which is sufficient. Minor gap: no mention of the 15-classes-per-page reading behavior that the schema hints at, which would matter for an agent planning retrieval.
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 all three parameters (course_ids, since_days, offset) are already documented, including the offset pagination hint. The sentence about course_ids/since_days reinforces the filtering defaults but adds little beyond the schema, which sets the baseline at 3.
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?
Names the specific resource (announcements) and states what each item contains (a link to open it in Classroom), which is enough to distinguish it from siblings like get_course_materials or get_whats_new. It never uses a direct verb like 'list' or 'fetch', so the operation is inferred rather than 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?
Gives concrete usage conditions via example user questions ('Did my teacher post anything new?') and explains the filter choices: pass course_ids or since_days, or leave empty for all active classes. It does not name an alternative sibling tool or state when NOT to use it, so it stops short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assignment_detailsAssignment detailsARead-only
Everything about one assignment: what the teacher wrote in the description, the files and links attached to it, its due date, points and your status. Pass the course ID and the assignment ID. Use this when the user asks 'What does this assignment ask for?' or 'What do I need to turn in?' about one specific assignment.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | Classroom course ID. Use get_my_courses to find it. | |
| course_work_id | Yes | The assignment ID. Use get_assignments to find it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered; the description adds value by disclosing the returned payload (description body, attachments, due date, points, personal status), which matters since there is no output schema. It does not cover error behavior, permissions, or what happens with an invalid 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?
Three sentences, front-loaded with the capability, then the payload, then the invocation and usage triggers. No sentence is filler; the usage examples do real routing work.
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 full schema coverage and annotations covering the safety profile, the description supplies the remaining pieces an agent needs: what is returned, how to call it, and when it applies. Nothing material is missing.
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 the schema already documents both parameters, including pointers to get_my_courses and get_assignments for lookup. The description only restates 'Pass the course ID and the assignment ID', adding no format or type guidance beyond the schema, so the baseline 3 applies.
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 ('Everything about one assignment') and enumerates exactly what is returned: description text, attachments/links, due date, points, and submission status. This is clearly distinguishable from sibling list tools like get_assignments or get_upcoming_due_dates.
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?
Gives concrete triggering user questions ('What does this assignment ask for?', 'What do I need to turn in?') and scopes usage to 'one specific assignment', which implicitly separates it from the list tools. It never names an alternative sibling explicitly or states a when-not condition, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assignmentsClass assignmentsARead-only
Assignments for one class, picked by course_id or course_name, with due dates and status, each with a link to open it in Classroom. Use this when the user asks 'What's due in this class?' or wants every assignment and its points for a single class.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | No | Classroom course ID. Pass this or course_name. | |
| course_name | No | Part of a class name or section, for example Biology, matched without checking case. Pass this or course_id, so you can skip get_my_courses. It must match exactly one active class. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds useful disclosure about what comes back (due dates, status, deep link), which matters because there is no output schema, but says nothing about behavior on an ambiguous course_name or an unmatched class beyond what the schema already states.
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 sentences, front-loaded with the resource and scope, then the usage trigger. 'Single class' appears twice but the repetition reinforces the key constraint rather than wasting space.
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, the description tells the agent what selector to use, what the results contain, and when to reach for it. Nothing essential to a correct call is missing.
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 both parameters are documented in the schema, including case-insensitive partial matching and the exactly-one-match rule. The description only restates the either/or choice, adding no syntax or matching nuance of its own, so baseline 3 applies.
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?
Names a specific resource (assignments) and scopes it to exactly one class selected by course_id or course_name, which separates it from get_assignment_details (one assignment) and get_todo/get_upcoming_due_dates (cross-class lists). It does not name those siblings explicitly, so the differentiation is inferred from scope rather than 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?
Gives a concrete trigger phrase ('What's due in this class?') and the intent 'every assignment and its points for a single class', which is a usable selection rule. It stops short of stating when NOT to use it, e.g. across all classes or for a single assignment's detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_course_materialsClass materialsARead-only
Posted materials for one class, picked by course_id or course_name, grouped by topic with the Drive link of every attached file. Use this when the user asks 'What materials did my teacher post?' or 'What did we cover in unit 3?' or wants the readings, slides and handouts for one class.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | No | Classroom course ID. Pass this or course_name. | |
| course_name | No | Part of a class name or section, for example Biology, matched without checking case. Pass this or course_id, so you can skip get_my_courses. It must match exactly one active class. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds real behavioral value: results are grouped by topic and every attached file exposes a Drive link, which tells the agent what it will actually receive. It does not say what happens when no materials are posted or when a course name is ambiguous, though the schema covers the latter.
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 with what the tool returns, then when to use it. The quoted example questions are a bit padded, but each one maps to a distinct phrasing an agent might encounter, so they mostly earn their space.
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 only two optional params, no output schema, and read-only annotations, the description covers purpose, invocation route, and return shape. The main remaining gap is edge-case behavior (empty material lists, ambiguous course names), which is partly handled in the 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% and the schema already explains that either course_id or course_name suffices, that name matching is case-insensitive, and that it must resolve to exactly one active class. The description only restates 'picked by course_id or course_name', adding no new selector semantics, so baseline 3 applies.
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 (fetch posted materials for one class) plus how results are organized: grouped by topic with the Drive link of each attached file. That output shape plus the course_id/course_name selector distinguishes it cleanly from siblings like get_assignments or get_announcements.
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?
Gives concrete trigger phrasing ('What materials did my teacher post?', 'What did we cover in unit 3?') and names the content types it covers (readings, slides, handouts). It lacks an explicit when-not or a direct pointer to a competing sibling, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_course_teachersClass teachersARead-only
Teachers of your classes with their email addresses when Classroom shares them. Pass course_id for one class, or course_ids or course_name for several, and each class gets its own list. With none of them it covers all active classes. Use this when the user asks 'Who teaches this class?' or 'How do I email my teacher?'
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | How many classes to skip. Up to 15 classes are read at a time, so pass 15 to see the next 15. Leave empty to start at the first class. | |
| course_id | No | Classroom course ID. Pass this or course_name. | |
| course_ids | No | Classroom course IDs to check. Leave empty for all active classes. | |
| course_name | No | Part of a class name or section, for example Biology. It is matched without checking case and added to course_ids, so you can skip get_my_courses. Leave empty to use course_ids only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered; the description adds the meaningful caveat that email addresses only appear when Classroom shares them, and that results are grouped per class rather than flattened. It does not mention pagination or result ordering, though the schema's offset field covers paging.
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 paragraph is front-loaded with what is returned, then how to scope the call, then when to reach for it, with no filler sentences. The quoted user phrasings are slightly verbose but earn their place as selection cues.
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, the description carries the burden of describing returns and does so (per-class lists, email addresses conditionally included). Selection semantics, defaults, and the sharing caveat together are sufficient for a read-only four-parameter lookup 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?
Schema coverage is 100%, so the baseline is 3, and the description adds genuine relationship semantics: course_id targets one class while course_ids/course_name target many, and an empty selection means all active classes. It does not, however, explain how course_name matches are resolved beyond what the schema already states.
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 opening clause names a specific resource (teachers of your classes) and the payload (email addresses, when Classroom shares them), which distinguishes it from sibling list tools such as get_my_courses or get_assignments. An agent can tell immediately that this returns instructor identities rather than course metadata.
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?
It explicitly covers all three selection modes (course_id for a single class, course_ids or course_name for several, and no argument for all active classes) and adds concrete user phrasings ('Who teaches this class?', 'How do I email my teacher?') that trigger the tool. Exclusion conditions are implicit in the mode breakdown, but the routing instruction for course_name versus get_my_courses is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_missing_assignmentsMissing assignmentsARead-only
Past due work that has not been turned in. Pass course_ids to limit it, or leave empty for all active classes. Use this when the user asks 'What's overdue?' or 'What am I behind on?'
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | How many classes to skip. Up to 15 classes are read at a time, so pass 15 to see the next 15. Leave empty to start at the first class. | |
| course_ids | No | Classroom course IDs to check. Leave empty for all active classes. | |
| course_name | No | Part of a class name or section, for example Biology. It is matched without checking case and added to course_ids, so you can skip get_my_courses. Leave empty to use course_ids only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true and openWorldHint=true already tell the agent this is a safe, open read, so the description only needs to add context. It adds the 'active classes' scope but does not mention that results are read 15 classes at a time or what a result row contains.
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?
Three short sentences, front-loaded with the core definition, then filtering, then usage triggers. The quoted user questions consume space but serve routing, so nothing is clearly 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 read-only list tool with full schema coverage and clear annotations, an agent has enough to call it correctly. The missing piece is any hint at the return shape (course, assignment, due date), which matters more because there is no 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 offset, course_ids and course_name are fully documented already. The description restates the course_ids empty-vs-populated behavior without adding format or syntax detail, so the baseline 3 applies.
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 a precise filter condition: past due work that has not been turned in. That definition naturally separates it from get_todo and get_upcoming_due_dates, though no sibling is named explicitly.
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?
Gives concrete user phrasings that should trigger it ('What's overdue?', 'What am I behind on?') plus the scoping rule (pass course_ids to limit, leave empty for all active classes). It stops short of naming the alternative tools for adjacent questions like upcoming work.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_coursesMy coursesARead-only
List the student's active Google Classroom classes with their IDs. Use this when the user asks 'What classes am I in?' or needs a course ID to pass to another tool.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds one real behavioral detail beyond that: the list is limited to 'active' classes, implying archived/inactive courses are excluded. It says nothing about ordering, pagination, or how 'active' is determined, so the added context is modest.
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 sentences, no filler, and the core purpose is front-loaded before the usage hint. Every clause carries information an agent would otherwise have to infer.
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 zero-parameter read tool with readOnly/openWorld annotations, this is sufficient: the description covers what is returned (courses plus IDs), the scope (active), and the reason to call it. No output schema exists, but the return content is characterized well enough for correct invocation.
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 tool takes zero parameters, so there is no parameter semantics to explain and the baseline of 4 applies. The phrase 'with their IDs' usefully describes the payload shape rather than any input.
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') plus the exact resource ('the student's active Google Classroom classes') and the key returned field ('their IDs'). This is clearly separable from siblings like get_assignments, get_my_grades, or get_course_materials, which operate on content within courses rather than the course roster 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?
Gives a concrete trigger ('What classes am I in?') and a downstream reason to call it ('needs a course ID to pass to another tool'), which is exactly the routing signal an agent needs. It stops short of naming an explicit alternative or a when-not condition, so it lands just below the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_gradesMy gradesARead-only
Grades on returned work for each class, with the comment the teacher left on the work. Google Classroom has no overall grade, so this adds up graded work only, and adds a weighted percent when the class uses grading categories with weights. Pass course_ids to limit it, or leave empty for all active classes. Use this when the user asks 'How am I doing in my classes?' or 'What grades have I gotten back?'
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | How many classes to skip. Up to 15 classes are read at a time, so pass 15 to see the next 15. Leave empty to start at the first class. | |
| course_ids | No | Classroom course IDs to check. Leave empty for all active classes. | |
| course_name | No | Part of a class name or section, for example Biology. It is matched without checking case and added to course_ids, so you can skip get_my_courses. Leave empty to use course_ids only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the readOnlyHint annotation: it explains that only returned work is counted, that Google Classroom has no overall grade, and that weighted percentages are calculated when grading categories exist. It does not cover authentication, rate limits, or return formatting details, but it discloses the key aggregation behavior.
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 front-loaded with the tool's purpose and calculation behavior, then moves to parameter guidance and example usage. Every sentence contributes relevant information without unnecessary repetition.
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 absence of an output schema, the description does a good job explaining that results include per-class grades, teacher comments, and weighted percentages. Completeness is slightly limited because it does not describe edge cases such as classes with no returned work or the exact response shape.
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 all three parameters are already documented in the schema. The description reinforces course_ids behavior but does not add new meaning for course_name or offset beyond what the schema already provides.
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 resource and scope: grades on returned work per class, including teacher comments and weighted percentages. It is specific enough to distinguish the tool from general assignment or course tools, but it does not explicitly name or contrast with close siblings like get_target_grade or get_missing_assignments.
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?
It gives clear usage context with example user questions ('How am I doing in my classes?') and explains how course_ids can limit results. However, it does not state when not to use this tool or name alternative tools for related grade questions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_submission_statusSubmission statusARead-only
Did my teacher get my work? For one assignment, shows whether it is turned in, when it was turned in, whether it was late, the grade if it was returned and the comment the teacher left. Pass the course ID and the assignment ID. Use this when the user asks 'Did my teacher get my work?' or 'Was my assignment marked late?'
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | Classroom course ID. Use get_my_courses to find it. | |
| course_work_id | Yes | The assignment ID. Use get_assignments to find it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds value beyond that by enumerating the returned data points (turn-in state, timestamp, lateness, grade, teacher comment), which matters because there is no output schema. It omits what happens when no submission exists, a modest 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 leading question orients the reader immediately, followed by scope, parameters, and triggers in a logical order. The phrase 'Did my teacher get my work?' appears twice (opening and usage example), which is mild redundancy but not harmful.
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-only lookup with no output schema, the description covers purpose, inputs, and the shape of the result, which is sufficient to invoke correctly. It could be more complete by noting behavior when the assignment has no submission record.
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% and both parameters already point at the discovery tools (get_my_courses, get_assignments). The description's 'Pass the course ID and the assignment ID' merely restates the required inputs without adding format or edge-case meaning, so the baseline 3 applies.
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?
Names a specific resource and scope — 'For one assignment, shows whether it is turned in, when it was turned in, whether it was late, the grade... and the comment' — which is exactly what the tool returns. The single-assignment scope implicitly separates it from list-style siblings such as get_missing_assignments and get_todo, so an agent can place it without opening the schema.
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?
Gives concrete trigger phrasings: 'Use this when the user asks "Did my teacher get my work?" or "Was my assignment marked late?"' That is clear when-to-use context. It does not name alternatives (e.g., get_missing_assignments for a whole-course view) or state when not to use it, which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_target_gradeTarget gradeARead-only
Points needed on the work that is left to reach a target percent in each class. Adds up the points earned on graded work and the points the work left is worth, then says how many of those points you still need. target_percent is the percent you want, from 0 to 100. Pass course_ids to limit it, or leave empty for all active classes. Use this when the user asks 'What do I need to score to get a 90?' or 'Can I still get an A in this class?'
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | How many classes to skip. Up to 15 classes are read at a time, so pass 15 to see the next 15. Leave empty to start at the first class. | |
| course_ids | No | Classroom course IDs to check. Leave empty for all active classes. | |
| course_name | No | Part of a class name or section, for example Biology. It is matched without checking case and added to course_ids, so you can skip get_my_courses. Leave empty to use course_ids only. | |
| target_percent | Yes | The class percent you want, from 0 to 100. For example 90. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful behavior: it explains the arithmetic behind the answer and notes that up to 15 classes are read per call (the offset parameter's schema text carries the pagination detail). It doesn't cover edge cases such as classes with no graded work or ungraded categories.
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 core purpose is front-loaded in the first sentence, and the mechanism sentence plus the example questions earn their place. Slightly long, with minor redundancy between the mechanism sentence and the target_percent restatement, 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?
There is no output schema, so the description must carry the return-value burden; it does say the result is a per-class count of points still needed, which is the key shape. It stops short of describing all returned fields (e.g., current percent or points already earned), leaving a small gap for a computation 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?
With 100% schema description coverage, the schema already documents offset, course_ids, course_name, and target_percent in detail. The description restates target_percent's 0-100 range and the course_ids scoping rule but adds no new semantic meaning, and it never mentions course_name or offset, so baseline 3 applies.
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 computation and resource: 'Points needed on the work that is left to reach a target percent in each class,' and explains the mechanism (points earned plus points remaining). This implicitly separates it from get_my_grades, but it never names that sibling explicitly, so differentiation relies on inference.
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?
It gives concrete triggering conditions via example user questions ('What do I need to score to get a 90?', 'Can I still get an A in this class?') and clarifies scoping behavior for empty course_ids. It also notes that course_name exists so you can skip get_my_courses, but it doesn't state when NOT to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_todoTo-do listARead-only
Everything assigned that the student has not turned in yet, each with a link to open it in Classroom. Pass course_ids to limit it, or leave empty for all active classes. Use this when the user asks 'What do I still have to do?' or 'What's left to turn in across all my classes?'
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | How many classes to skip. Up to 15 classes are read at a time, so pass 15 to see the next 15. Leave empty to start at the first class. | |
| course_ids | No | Classroom course IDs to check. Leave empty for all active classes. | |
| course_name | No | Part of a class name or section, for example Biology. It is matched without checking case and added to course_ids, so you can skip get_my_courses. Leave empty to use course_ids only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds one useful return detail (each item carries a Classroom link) and the course_ids scoping behavior. It says nothing about ordering, result volume, or the 15-class pagination behavior that the offset parameter implies, so the added context is modest.
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?
Three sentences, front-loaded with what the tool returns, then parameters, then user-facing triggers. The course_ids sentence duplicates the schema and could be dropped, but overall it is tight and purposeful.
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 read-only, zero-required-parameter listing tool with a fully documented schema and no output schema, the description covers what is returned (unfinished items plus links) and how to scope it. The main remaining gap is expected result volume and ordering, which matters for an agent planning a response.
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% and every parameter is documented in detail, including the 15-class paging semantics and the case-insensitive course_name matching. The description only restates that course_ids limits scope and empty means all active classes, adding no meaning beyond the schema. Baseline 3 applies.
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 resource and scope: everything assigned but not turned in, with a link to open it in Classroom. That is clear enough to act on. It does not, however, distinguish itself from the close sibling get_missing_assignments or get_upcoming_due_dates, which an agent would plausibly confuse it with.
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?
It gives concrete trigger phrasing ('What do I still have to do?', 'What's left to turn in across all my classes?'), which anchors usage well. It offers no when-not-to-use guidance or pointer to the overlapping siblings, so the routing decision is only half covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_upcoming_due_datesUpcoming due datesARead-only
Work that is due soon and not turned in, soonest first. Pass course_ids or days_ahead to narrow it, or leave both empty. Use this when the user asks 'What's due this week across all my classes?' or 'What's coming up?'
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | How many classes to skip. Up to 15 classes are read at a time, so pass 15 to see the next 15. Leave empty to start at the first class. | |
| course_ids | No | Classroom course IDs to check. Leave empty for all active classes. | |
| days_ahead | No | Only show work due within this many days from now. Leave empty for every future due date. | |
| course_name | No | Part of a class name or section, for example Biology. It is matched without checking case and added to course_ids, so you can skip get_my_courses. Leave empty to use course_ids only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and openWorldHint already supplied, the description adds useful behavior: results are ordered soonest-first and exclude turned-in work. It says nothing about the 15-class pagination cap or the shape of the returned list beyond the ordering, leaving meaningful gaps.
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?
Three short sentences, front-loaded with the core definition followed by filtering and usage examples. The structure is easy to scan; the example questions are justified because they anchor intent matching.
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?
There is no output schema, and the description does not say what each result contains (course, assignment name, due date) or that reads are capped at 15 classes. For a list tool whose output shape must be inferred, this is adequate but incomplete.
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 are already fully documented, and the baseline of 3 applies. The description reinforces that course_ids and days_ahead narrow the result and are optional, but omits course_name and offset, adding little meaning beyond 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 first sentence names a specific resource and filter ('Work that is due soon and not turned in, soonest first'), which tells an agent exactly what this returns. It lacks explicit differentiation from siblings like get_todo and get_missing_assignments, which overlap conceptually, 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?
It gives concrete example user phrasings ('What's due this week across all my classes?') and states that filters are optional, which sets clear usage context. It does not say when to prefer get_todo or get_missing_assignments instead, so alternatives are left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_whats_newWhat's newARead-only
One catch up digest for every class: new announcements, newly graded work with the comment the teacher left, overdue work and what is due next. Pass course_ids to limit it, since_days for how far back to look and days_ahead for how far ahead to look. Use this when the user asks 'What's new since yesterday?' or 'What changed in my classes?'
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | How many classes to skip. Up to 15 classes are read at a time, so pass 15 to see the next 15. Leave empty to start at the first class. | |
| course_ids | No | Classroom course IDs to check. Leave empty for all active classes. | |
| days_ahead | No | How many days ahead to look for work that is due next. Leave empty for the next 14 days. | |
| since_days | No | How many days back to look for new announcements and new grades. Leave empty for the last 7 days. | |
| course_name | No | Part of a class name or section, for example Biology. It is matched without checking case and added to course_ids, so you can skip get_my_courses. Leave empty to use course_ids only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description contributes real behavioral content: that results are aggregated into one digest per class and that graded items carry the teacher's comment, which is not derivable from annotations or schema. It does not mention pagination or result volume, though the schema documents the 15-class page size via offset.
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 sentences of purpose followed by one sentence of parameter scoping and one of usage triggers, with the digest contents front-loaded. No filler and every clause carries information.
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 an all-optional, read-only aggregation tool with no output schema this covers what is aggregated, how to scope it and when to reach for it. The remaining gap is pagination behavior — the digest reads 15 classes at a time, which matters for a multi-class teacher but is only discoverable in the offset field.
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 every parameter is already documented including defaults (7 days back, 14 days ahead) and the course_name matching rule. The description only restates course_ids/since_days/days_ahead at a higher level and never mentions offset or course_name, so it adds little beyond 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?
States a concrete deliverable — a single catch-up digest per class containing new announcements, newly graded work with the teacher's comment, overdue items and upcoming due work. That composition immediately separates it from the narrower siblings (get_announcements, get_my_grades, get_missing_assignments, get_upcoming_due_dates), so an agent can pick it without opening a schema.
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?
Gives explicit trigger phrases ('What's new since yesterday?', 'What changed in my classes?') and explains how to narrow scope via course_ids, since_days and days_ahead. It stops short of naming the sibling tools it replaces for narrower questions, so an agent has to infer that distinction rather than being told.
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
v0.1.10- Changed
export_due_dates_calendar1 field changed- added
Input schema / properties / course_nameAdded value: +{ + "description": "Part of a class name or section, for example Biology. It is matched without checking case and added to course_ids, so you can skip get_my_courses. Leave empty to use course_ids only.", + "type": "string" +}
- Changed
get_announcements1 field changed- added
Input schema / properties / offsetAdded value: +{ + "description": "How many classes to skip. Up to 15 classes are read at a time, so pass 15 to see the next 15. Leave empty to start at the first class.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +}
- Changed
get_assignments3 fields changed- changed
Input schema / properties / course_id / descriptionPrevious value: -"Classroom course ID. Use get_my_courses to find it."New value: +"Classroom course ID. Pass this or course_name." - added
Input schema / properties / course_nameAdded value: +{ + "description": "Part of a class name or section, for example Biology, matched without checking case. Pass this or course_id, so you can skip get_my_courses. It must match exactly one active class.", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "course_id" -]
- Changed
get_course_materials3 fields changed- changed
Input schema / properties / course_id / descriptionPrevious value: -"Classroom course ID. Use get_my_courses to find it."New value: +"Classroom course ID. Pass this or course_name." - added
Input schema / properties / course_nameAdded value: +{ + "description": "Part of a class name or section, for example Biology, matched without checking case. Pass this or course_id, so you can skip get_my_courses. It must match exactly one active class.", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "course_id" -]
- Added
get_course_teachers - Changed
get_missing_assignments2 fields changed- added
Input schema / properties / course_nameAdded value: +{ + "description": "Part of a class name or section, for example Biology. It is matched without checking case and added to course_ids, so you can skip get_my_courses. Leave empty to use course_ids only.", + "type": "string" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "How many classes to skip. Up to 15 classes are read at a time, so pass 15 to see the next 15. Leave empty to start at the first class.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +}
- Changed
get_my_grades2 fields changed- added
Input schema / properties / course_nameAdded value: +{ + "description": "Part of a class name or section, for example Biology. It is matched without checking case and added to course_ids, so you can skip get_my_courses. Leave empty to use course_ids only.", + "type": "string" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "How many classes to skip. Up to 15 classes are read at a time, so pass 15 to see the next 15. Leave empty to start at the first class.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +}
- Added
get_submission_status - Changed
get_target_grade2 fields changed- added
Input schema / properties / course_nameAdded value: +{ + "description": "Part of a class name or section, for example Biology. It is matched without checking case and added to course_ids, so you can skip get_my_courses. Leave empty to use course_ids only.", + "type": "string" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "How many classes to skip. Up to 15 classes are read at a time, so pass 15 to see the next 15. Leave empty to start at the first class.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +}
- Changed
get_todo2 fields changed- added
Input schema / properties / course_nameAdded value: +{ + "description": "Part of a class name or section, for example Biology. It is matched without checking case and added to course_ids, so you can skip get_my_courses. Leave empty to use course_ids only.", + "type": "string" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "How many classes to skip. Up to 15 classes are read at a time, so pass 15 to see the next 15. Leave empty to start at the first class.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +}
- Changed
get_upcoming_due_dates2 fields changed- added
Input schema / properties / course_nameAdded value: +{ + "description": "Part of a class name or section, for example Biology. It is matched without checking case and added to course_ids, so you can skip get_my_courses. Leave empty to use course_ids only.", + "type": "string" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "How many classes to skip. Up to 15 classes are read at a time, so pass 15 to see the next 15. Leave empty to start at the first class.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +}
- Changed
get_whats_new2 fields changed- added
Input schema / properties / course_nameAdded value: +{ + "description": "Part of a class name or section, for example Biology. It is matched without checking case and added to course_ids, so you can skip get_my_courses. Leave empty to use course_ids only.", + "type": "string" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "How many classes to skip. Up to 15 classes are read at a time, so pass 15 to see the next 15. Leave empty to start at the first class.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +}
3 tool updates
v0.1.9- Added
export_due_dates_calendar - Changed
get_announcements2 fields changed- added
Input schema / properties / course_ids / descriptionAdded value: +"Classroom course IDs to check. Leave empty for all active classes." - added
Input schema / properties / since_daysAdded value: +{ + "description": "Only show announcements updated within this many days back from now. Leave empty to show every recent announcement.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +}
- Added
get_assignment_details
10 tool updates
v0.1.5- First observed
get_announcements - First observed
get_assignments - First observed
get_course_materials - First observed
get_missing_assignments - First observed
get_my_courses - First observed
get_my_grades - First observed
get_target_grade - First observed
get_todo - First observed
get_upcoming_due_dates - First observed
get_whats_new
TDQS
Scored across 14 tools
Most tools target clearly distinct slices of data (courses, grades, announcements, materials, teachers), and descriptions carefully explain the 'what do I still have to do' vs 'what's due soon' vs 'what's overdue' split. The tightest overlap is get_submission_status vs get_assignment_details, since the latter also reports the student's status, and get_whats_new aggregates several other tools' outputs — an agent may hesitate between the specific and the aggregate.
Every tool is snake_case with a predictable verb_noun shape (get_my_courses, get_todo, get_missing_assignments, get_course_teachers), and the single non-get verb (export_due_dates_calendar) describes a genuinely different action. Scope qualifiers like get_my_* vs get_course_* are used consistently.
14 tools sits in the sweet spot and each one maps to a distinct student question (what am I in, what's due, what's late, what did I get, what's new, who teaches me). The aggregate tools (get_whats_new, export_due_dates_calendar) earn their place as conveniences rather than duplicating surface for its own sake.
Read-only student workflows are well covered end-to-end: discovery of courses, per-class and cross-class assignment views, submission detail, grades, target-grade math, materials, announcements, and teacher contact. Gaps are minor but real — no way to fetch attachment/drive file contents, no archived-course access, and no write/submit operations if the server is intended to grow beyond read-only.
Maintenance
Related MCP Connectors
Search university course materials, your flashcards, quizzes, streak and quota. All tools read-only.
Read-only Google Search Console and Google Analytics for AI agents.
Read-only access to your Citlyze workspace: AI search visibility, citations, and recommendations.
Read-only access to your Priomate tasks, notes, inbox and team projects.
Related MCP Servers
- 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 interact with Google Classroom to check submission statuses, list students and assignments, and create coursework, announcements, and topics through natural language.-
- 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.-
- AlicenseAqualityBmaintenanceGives MCP-capable agents read-only access to a Google Classroom account, exposing courses, coursework, due dates, announcements, rosters and student submissions as callable tools. Nothing can be created, edited or deleted through it.8MIT