Skip to main content
Glama

google-classroom-mcp

MCP server for Google Classroom, built for the student and with support for several Google accounts at once. It lets Claude Code, Claude Desktop, Cursor or any MCP client look up your courses, pending assignments, due dates, grades and announcements and, if you ask it to, attach files or turn in an assignment.

It uses the official Google Classroom API with OAuth on your own account. It asks for Classroom and Drive permissions: read-only to download to your disk the attachments of assignments, materials and announcements (Google Docs, Sheets and Slides are exported to PDF, xlsx, etc.), and drive.file to upload your submissions to a "Classroom Submissions" folder in your Drive (with that permission the server only sees the files it uploads itself).

About submissions. The Google API only allows attaching files and turning in from the same application that created the assignment. If your teacher created it from the Classroom web app (the usual case), attaching returns 403 @ProjectPermissionDenied. That is a Google restriction, not the server's. For those assignments there is submit_in_browser: it drives Google Chrome with your session and makes the same clicks you would (see Submitting through the browser). submit_assignment(files=[...]) tries the API route and, if it fails, at least leaves your files in Drive.

Requirements

  • uv installed. On macOS: brew install uv. On any system: curl -LsSf https://astral.sh/uv/install.sh | sh.

  • A Google Cloud OAuth client secret (free, see below).

  • Google Chrome, only if you want to submit assignments through the browser.

  • Your Classroom account must allow third-party apps. If it is an institutional account, the administrator may have that blocked.

Related MCP server: ClassroomScribe

Installation

1. Create the client secret in Google Cloud (once, about 5 minutes):

  1. Go to https://console.cloud.google.com and create a project, for example classroom-mcp.

  2. APIs & Services > Library: enable Google Classroom API and Google Drive API (Drive is needed to download attachments).

  3. APIs & Services > OAuth consent screen (or "Google Auth Platform"): user type External, fill in name and email, and under Test users add all the Google accounts you use to sign in to Classroom.

  4. APIs & Services > Credentials > Create credentials > OAuth client ID, application type Desktop app. Download the JSON.

  5. Recommended: in Google Auth Platform > Audience, click Publish app. While the app is in "Testing" status, Google expires every authorization after 7 days and you have to repeat setup. In "Production" the authorization lasts indefinitely; the app is still yours and unverified, you will just see the "unverified app" notice once per account.

2. Authorize your account (opens the browser; the token is stored in ~/.config/google-classroom-mcp/accounts/<alias>.json with permissions only for your user):

uvx --from git+https://github.com/AlanMagno1/google-classroom-mcp google-classroom-mcp setup ~/Downloads/client_secret_XXXX.json

If Google warns that the app is not verified, choose "Continue": the app is yours.

Another account? Run setup again (without the JSON this time) and pick the other Google account in the browser. By default each account is saved with its email as the alias; if you prefer a short name use setup --as unam. With --hint you@university.edu Google goes straight to that account and setup refuses to save if you authorize with a different one (useful when the browser only has the wrong account open).

3. Register the server in Claude Code:

claude mcp add google-classroom -s user -- uvx --from git+https://github.com/AlanMagno1/google-classroom-mcp google-classroom-mcp

Done. Open Claude Code and ask it, for example:

What assignments do I have pending in Classroom?

Check https://classroom.google.com/c/NzE2NDU5MjM0/a/NjA1MzIx/details and tell me what it asks for.

Download the files for Data Mining practice 3 and summarize what has to be done.

Submit ~/Documents/practica3.ipynb to Data Mining practice 3.

Other clients (Claude Desktop, Cursor, etc.)

{
  "mcpServers": {
    "google-classroom": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/AlanMagno1/google-classroom-mcp", "google-classroom-mcp"]
    }
  }
}

Environment variables

Variable

Description

GOOGLE_CLASSROOM_MCP_CONFIG_DIR

Configuration folder. Default: ~/.config/google-classroom-mcp

GOOGLE_CLASSROOM_CLIENT_SECRET

Path to the client secret. Default: <config>/client_secret.json

GOOGLE_CLASSROOM_DOWNLOAD_DIR

Downloads folder. Default: ~/Downloads/google-classroom-mcp

GOOGLE_CLASSROOM_BROWSER_PROFILES

Folder with one Chrome profile per account. Default: <config>/browser-profiles

GOOGLE_CLASSROOM_BROWSER_HEADLESS

0 to show the Chrome window when submitting. Default: hidden

Several Google accounts

A single server handles all your accounts. Every tool accepts an optional account parameter (alias, email, or a piece of either):

  • If there is only one account, you never need to pass it.

  • list_courses and list_pending_assignments without account go through every account and mark which one each course belongs to.

  • Tools that take a course or an assignment work out on their own which account it is in.

If for some reason you want two separate servers, the GOOGLE_CLASSROOM_MCP_CONFIG_DIR variable still works with a different server name for each one.

Tools

All of them accept account? as the last parameter. course_id also accepts the course URL; the ids in Classroom URLs are base64 and the server decodes them on its own.

Tool

What it does

list_accounts()

Configured accounts (alias, email, name).

get_profile()

Checks the connection and returns the authenticated user of each account.

list_courses(include_archived?)

Courses you are enrolled in as a student, with the account of each one.

list_pending_assignments(course_id?)

Assignments you have not turned in yet, by account and course, sorted by due date. Flags the overdue ones.

get_course_contents(course_id)

Assignments, questions and materials of the course grouped by topic, with the state of your submission and grade.

get_assignment(coursework_id_or_url, course_id?)

Details of an assignment: instructions, due date, points, attachments and your submission. Accepts the full Classroom URL.

list_announcements(course_id, limit?)

Stream announcements, newest first.

download_assignment_files(coursework_id_or_url, course_id?, dest_dir?, include_submission?, export_format?)

Downloads every Drive attachment of an assignment or material to ~/Downloads/google-classroom-mcp/<course>/<assignment>/. With include_submission=True it also downloads the files of your submission. Links, videos and forms are returned with their URL.

download_file(file_id_or_url, filename?, dest_dir?, export_format?)

Downloads a single Drive file (the drive_id or url returned by the other tools) and returns the local path.

submit_in_browser(coursework_id_or_url, files?, course_id?, turn_in?)

The real submission, through the browser: drives a hidden Chrome with your session, attaches the local files in files, clicks "Turn in" and verifies through the API that it ended up as TURNED_IN. With turn_in=False it only attaches. Requires browser-login <alias> once per account.

reclaim_in_browser(coursework_id_or_url, course_id?)

Unsubmits an already turned-in assignment through the browser ("Unsubmit") and verifies through the API that it is no longer TURNED_IN. Attachments stay. This is the way to unsubmit the assignments the API rejects.

upload_file(path, folder?, name?)

Uploads a local file to Classroom Submissions/ in your Drive (or to the folder subfolder, or to a folder id/URL) and returns its drive_id and url.

submit_assignment(coursework_id_or_url, course_id?, files?, drive_ids?, links?, turn_in?)

Uploads the local files in files to Classroom Submissions/<course>/, attaches those plus the ones in drive_ids and/or links to your submission and, if turn_in=True, turns it in. If Google rejects the attachment, it returns in next_step how to finish from the web app. See the notice above.

reclaim_submission(coursework_id_or_url, course_id?)

Unsubmits an already turned-in assignment so you can modify it. Same restriction.

Google-native files have no binary to download, so they are exported: Docs and Slides to pdf, Sheets to xlsx, drawings to png. With export_format you can ask for another one (docx, txt, md, html, csv, pptx...). dest_dir accepts an absolute path or a folder relative to the downloads folder.

upload_file and submit_assignment(files=...) need the account to have been authorized with the drive.file permission. If you authorized it with an earlier version, those two tools will tell you which command to run; everything else keeps working without it.

Submitting through the browser

Since the API refuses to turn in assignments created by the teacher, submit_in_browser submits the same way you would: with Playwright it drives your installed Google Chrome on a separate profile, opens the assignment with the right account, "Add or create" > "File", uploads the file, "Turn in", and then confirms through the API that the state changed to TURNED_IN. reclaim_in_browser does the opposite: it clicks "Unsubmit", confirms and checks that the submission is no longer TURNED_IN. If something fails, either one leaves a screenshot in ~/Downloads/google-classroom-mcp/_browser/.

It requires Google Chrome installed and, for each account, a session signed in once in its own Chrome profile (one account per profile; Google's multi-account sign-in is not reliable for this):

google-classroom-mcp browser-login unam --email you@university.edu   # opens Chrome: sign in and close the window
google-classroom-mcp browser-login personal --email you@gmail.com
google-classroom-mcp browser-status                                  # session of each profile

Profiles live in ~/.config/google-classroom-mcp/browser-profiles/<alias> (variable GOOGLE_CLASSROOM_BROWSER_PROFILES). Always sign in from browser-login: on macOS the Chrome that Playwright opens encrypts cookies with a different key than your regular Chrome, so a session started elsewhere is no use to it. If Google blocks signing in from the controlled browser, browser-login ALIAS --plain opens a Chrome without automation but compatible with it. When submitting, Chrome runs hidden in the background; with GOOGLE_CLASSROOM_BROWSER_HEADLESS=0 the window is shown, useful to watch what happens if something fails. Automating the Classroom web app is not a use Google offers officially; it is your account and your assignments, but it is worth knowing.

Commands

google-classroom-mcp setup [client_secret.json] [--as ALIAS] [--hint EMAIL]   # saves the client secret and authorizes an account
google-classroom-mcp accounts                                  # lists the configured accounts
google-classroom-mcp remove ALIAS                              # removes an account
google-classroom-mcp check                                     # checks the connection of every account
google-classroom-mcp browser-login ALIAS [--email EMAIL] [--plain]   # signs in to that account's Chrome profile
google-classroom-mcp browser-status                            # session of each browser profile
google-classroom-mcp                                           # starts the MCP server over stdio (used by the client)

Permissions requested

Classroom: read access to courses, materials, announcements, topics, the course roster (to read your profile) and the profile email, and read and write access to your own coursework and submissions (classroom.coursework.me). Drive: read-only (drive.readonly) to download attachments, and drive.file to upload your submissions; with the latter the server can only see and touch the files it created itself, never the rest of your Drive, and it deletes nothing. Nothing is sent to any server other than Google's. upload_file, submit_assignment, submit_in_browser, reclaim_submission and reclaim_in_browser create files or modify your submission: Claude should only use them when you explicitly ask.

If you already had accounts authorized with an earlier version, they keep working for everything except uploading; for that, run google-classroom-mcp setup --as <alias> --hint <email> again once per account.

Development

git clone https://github.com/AlanMagno1/google-classroom-mcp
cd google-classroom-mcp
uv sync
uv run google-classroom-mcp check

To try local changes in Claude Code without publishing:

claude mcp add google-classroom -s user -- uv --directory /path/to/google-classroom-mcp run google-classroom-mcp

License

MIT

Available Tools

9 tools
get_assignmentA

Detalle de una tarea o pregunta: instrucciones, fecha límite, puntos, materiales adjuntos y el estado de tu entrega (archivos, calificación). Acepta la URL completa (https://classroom.google.com/c/XXX/a/YYY/details) o el id de la tarea junto con course_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
course_idNo
coursework_id_or_urlYes

TDQS

A3.7/5.0
Behavior3/5

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 what the tool returns and that it accepts either a full URL or an id/course_id pair. It does not explicitly mention read-only behavior, permissions, error handling, or rate limits, though the 'get' verb implies a safe read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no filler. The first sentence delivers the core purpose and expected output; the second gives concrete input format guidance. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the required parameter and the return content well, but omits the account parameter's role and any operational details such as error behavior or prerequisites. For a simple read tool with one required parameter, this is near adequate but still leaves a notable gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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. It explains the required parameter coursework_id_or_url (full URL or id) and how course_id relates to it, but it says nothing about the account parameter, leaving its purpose and usage ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific operation: retrieving details of a single task or question, and lists the returned fields (instructions, deadline, points, materials, submission status). This distinguishes it from siblings like list_pending_assignments or get_course_contents, which have broader or different scopes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: when you already have a coursework URL or id plus course_id. However, it does not explicitly state when not to use it or compare it with alternatives such as list_pending_assignments, leaving some routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_course_contentsA

Trabajo de clase de un curso agrupado por tema: tareas (con el estado de tu entrega y calificación), preguntas y materiales. Acepta el id o la URL del curso.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
course_idYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that the tool returns current-user delivery status and grades and that it accepts either a course ID or URL, but it does not mention read-only behavior, required permissions, pagination, or other side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences deliver the resource scope, the contents returned, and the accepted input format with no filler. The most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple retrieval tool with two parameters and no output schema, the description gives a reasonable account of return contents and input format. However, it omits any explanation of the account parameter and any caveats about behavior, so it is adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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. It clarifies that course_id accepts either an ID or a course URL, but it never explains the optional account parameter, leaving part of the input semantics undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states that the tool returns a course's classwork grouped by topic, including assignments with submission status and grade, questions, and materials. This is specific and distinguishes it from siblings like get_assignment or list_announcements, though it does not explicitly name the contrast.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The context of when to call this tool is implied by describing the aggregate course content it returns, but there is no explicit guidance on choosing it over list_pending_assignments, get_assignment, or list_announcements, nor any exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_profileB

Verifica la conexión y devuelve el usuario autenticado de cada cuenta (o de la indicada).

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo

TDQS

B3.1/5.0
Behavior2/5

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 that the tool verifies connectivity and returns authenticated user data, and that it can operate per account. However, it does not mention side effects, authentication requirements, error behavior, or what happens when no account is available.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence communicates the core purpose and the parameter behavior without redundancy. Every part of the sentence contributes useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low parameter count and simple input schema, the description is minimally viable. It tells the agent what the tool does and how the optional account affects behavior. However, with no output schema and no annotations, the lack of detail about the returned user object and connection-check semantics leaves some gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must clarify the account parameter. The phrase 'de cada cuenta (o de la indicada)' indicates that the optional account parameter selects a specific account, with the default covering all accounts. This adds meaningful semantic value, though it stops short of explaining accepted formats or values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: verify the connection and return the authenticated user for each account (or a specified one). The verb-resource pair is specific and distinct from the sibling tools, though it does not explicitly contrast with any sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool versus alternatives such as list_accounts or get_course_contents. The tool's use case can be inferred, but the description does not state explicit conditions or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_accountsA

Cuentas de Google configuradas (alias y correo). Sin conexión a la API.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the behavioral load. 'Sin conexión a la API' usefully discloses that this is a local/no-API operation, implying a safe, read-only listing. It does not go into return format or empty-result behavior, but for a simple account list this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short fragments with no filler. The core identity of the tool is front-loaded, and the behavioral note about no API connection adds value without bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter local listing tool, this is nearly complete: it specifies the returned fields and the key behavior (no API call). It does not mention return format or the possibility of an empty list, but those are minor for this simple use case.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline of 4 applies. There are no parameter details needed, and the description correctly focuses on the output instead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (configured Google accounts) and the expected output fields (alias and email). It lacks an explicit verb, but combined with the tool name 'list_accounts' the purpose is unambiguous and easily distinguished from the sibling course/assignment tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives or when not to use it. The resource is distinct enough from the siblings, but the description does not state any selection conditions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_announcementsC

Anuncios del tablón de un curso, del más reciente al más antiguo.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
accountNo
course_idYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry full behavioral burden. It mentions sorting order but omits critical behaviors: pagination (limit parameter), default limits, whether announcements include attachments or metadata, and whether any authentication or permissions are needed. The agent is left without details on what happens with the limit or how results are returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One concise sentence that captures the core purpose and ordering. It is appropriately front-loaded with the main action. Omitting details is a trade-off but not verbose, so it earns a 4 for clarity relative to length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given three parameters, no annotations, and no output schema, the description is insufficient. It does not clarify the role of limit and account, nor does it specify the output format (e.g., fields of each announcement). The sorting detail is helpful but not enough for full context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 for all parameters. It does not explain course_id, limit, or account at all, leaving agents to infer from parameter names. Since there is no parameter documentation in the schema, the lack of explanation is a significant gap, though parameter names are somewhat self-explanatory.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly indicates it lists announcements for a course, sorted by most recent to oldest, which defines the core function. However, it does not explicitly distinguish itself from sibling tools like list_courses or list_pending_assignments, but the resource (announcements) is distinct enough.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. It does not mention prerequisites (e.g., requiring a course from list_courses) or when to prefer other tools. Usage is implied for listing announcements but with no exclusions or context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_coursesA

Cursos de Classroom en los que estás inscrito como alumno. Sin account recorre todas las cuentas configuradas.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
include_archivedNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the behavioral burden. It does disclose the multi-account traversal behavior and the student-enrollment scope. However, it does not mention pagination, output format, permissions, or whether archived courses are handled beyond the include_archived parameter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only two short Spanish sentences with no filler or redundant phrases. It is front-loaded with the main purpose and then adds the key account-related nuance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with two optional parameters and no annotations or output schema, the description covers the core behavior and account aggregation, but it leaves include_archived and the expected return shape unstated. It is adequate but has clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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. It meaningfully explains the account parameter (when omitted, it iterates all configured accounts), but it provides no additional semantics for include_archived at all, leaving that parameter to be understood only from its name and schema default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's resource and scope: Classroom courses in which the user is enrolled as a student. It also distinguishes the tool from siblings such as get_course_contents or get_assignment by emphasizing an aggregate course list rather than a single item.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context about when to use it (courses where the user is a student) and the behavior when account is not provided (recorre todas las cuentas configuradas). It does not explicitly name alternatives or exclusions, but the context is enough for basic tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_pending_assignmentsA

Tareas que aún no has entregado (estado NEW, CREATED o RECLAIMED_BY_STUDENT), agrupadas por cuenta y curso y ordenadas por fecha límite. Sin account ni course_id revisa todos los cursos activos de todas las cuentas. Incluye si ya venció.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
course_idNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the burden of behavioral disclosure. It reveals the status filter, grouping, ordering by deadline, and inclusion of overdue indicator. It does not mention pagination, rate limits, or authorization, but for a read-only list tool this is reasonable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences deliver all essential information—what is listed, statuses included, grouping, sorting, and default scope—without redundantly repeating the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers statuses, grouping, sorting, default behavior, and overdue flag. Since there is no output schema, an agent gets enough to call the tool correctly. Minor missing details (sort direction, pagination, return format) prevent a perfect score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no descriptions and only shows account/course_id as nullable strings. The description adds crucial semantics: omitting them means scanning all accounts/courses(), which is more than the bare schema provides. It stops short of explaining expected ID formats.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List'), names the exact resource ('pending assignments'), enumerates the included statuses (NEW, CREATED, RECLAIMED_BY_STUDENT), and specifies grouping and sorting. This clearly distinguishes it from siblings like list_courses or get_assignment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the behavior when parameters are omitted ('Sin account ni course_id revisa todos los cursos activos de todas las cuentas'), giving a clear decision rule. It does not explicitly contrast with sibling tools, but the context makes the appropriate use obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reclaim_submissionB

Retira una entrega ya enviada (equivale a "Anular entrega") para poder modificarla. Misma restricción de Google que submit_assignment. Úsala solo si el usuario lo pide.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
course_idNo
coursework_id_or_urlYes

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It reveals the action is a mutating withdrawal but does not state potential side effects, irreversibility, permission requirements, or the specific Google restriction it references. The mention of a restriction without details is insufficient for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and to the point, with two sentences that convey the purpose and a usage condition without redundancy. It is front-loaded with the core action and efficiently structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations, no output schema, and 0% parameter coverage, the description is inadequate. It omits parameter explanations, the nature of the Google restriction, and any operational details, leaving the agent with significant gaps that could lead to incorrect invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description provides no information about any of the three parameters, including the required coursework_id_or_url. The description does not clarify how account, course_id, or coursework_id_or_url should be used or their meaning beyond what the schema's names imply.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (retira/resolves a submitted submission) and its purpose (to allow modification), using a specific verb and resource. It also equates it with 'Anular entrega', making the function unambiguous. Although it references submit_assignment, it still provides a clear purpose distinct from that sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs to use only if the user asks ('Úsala solo si el usuario lo pide'), giving a clear condition. However, it relies on a stated restriction 'Misma restricción de Google que submit_assignment' without specifying what that restriction is, leaving the agent to infer or lack critical context about when the tool is valid.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_assignmentA

Adjunta archivos de Drive (ids o URLs de Drive) y/o enlaces a tu entrega de una tarea y, si turn_in=True, la entrega. Para subir un archivo local a Drive primero usa el servidor MCP de Google Drive y pasa aquí su id. Úsala solo cuando el usuario lo pida explícitamente.

Aviso: Google solo permite adjuntar y entregar desde la app que creó la tarea. Si el
profesor la creó desde la web de Classroom, este paso devuelve 403
@ProjectPermissionDenied y hay que adjuntar desde classroom.google.com.
ParametersJSON Schema
NameRequiredDescriptionDefault
linksNo
accountNo
turn_inNo
course_idNo
drive_idsNo
coursework_id_or_urlYes

TDQS

A3.7/5.0
Behavior3/5

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 conditional turn_in behavior and the 403 failure mode, which is valuable. However, it does not state whether submission is reversible, whether existing attachments are overwritten, or what other side effects occur beyond attaching/submitting.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core function, followed by a workflow note and a critical warning. Every sentence adds information and there is no filler, though it is slightly long due to the warning and workflow context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema and no annotations, it explains the key parameters and a likely error, but omits the meaning of course_id and account, and does not describe what a successful response looks like. It is adequate but leaves meaningful gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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. It explains drive_ids and links as Drive files/URLs and links, and clarifies turn_in's conditional behavior, but it leaves course_id and account undefined and does not clarify the required coursework_id_or_url beyond its name. The compensation is incomplete for a 6-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action: attaching Drive files (IDs/URLs) and/or links to an assignment, with conditional submission via turn_in=True. This clearly distinguishes it from read-only siblings like get_assignment and from the opposite action reclaim_submission.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to use the tool only when the user asks, and it gives an alternative workflow for local files (upload to Drive via the Google Drive MCP server, then pass the ID). It also warns about a case where the tool should not be used (403 ProjectPermissionDenied) and directs the user to classroom.google.com instead.

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.

  1. 9 tool updatesv0.1.0
    • First observedget_assignment
    • First observedget_course_contents
    • First observedget_profile
    • First observedlist_accounts
    • First observedlist_announcements
    • First observedlist_courses
    • First observedlist_pending_assignments
    • First observedreclaim_submission
    • First observedsubmit_assignment

TDQS

A3.7/5.0

Scored across 9 tools

Disambiguation5/5

Each tool targets a distinct resource and action: accounts, profile, courses, pending assignments, course contents, single assignment, announcements, submission, and reclaim. Even account-related tools differ clearly in purpose: one lists local configuration, the other verifies authentication.

Naming Consistency5/5

All tool names follow a consistent lowercase verb_noun pattern (list_, get_, submit_, reclaim_). No mixed conventions or vague verbs appear.

Tool Count5/5

Nine tools is well-scoped for a student-facing Google Classroom server, covering viewing, retrieving, submitting, and un-submitting without unnecessary bloat.

Completeness4/5

Core student workflows are covered: list courses, see pending work, inspect assignments, view announcements, and submit/reclaim. A minor gap is that there is no aggregate list of all assignments including completed/graded ones across courses; get_course_contents fills this per course but requires a course id.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers