mcp-classroom
MCP server for Google Classroom — read assignments, check submission states, upload files to Drive, and view attached files. Pairs with a Claude Code skill + Playwright for browser automation to work around Google Workspace write restrictions.
What it can do
| Feature | How | |---|---| | List courses | MCP | | List & get assignments | MCP (slim response — no heavy file metadata) | | Check submission state & grade | MCP | | List files attached to a submission | MCP | | Upload file to Google Drive | MCP | | Attach file to submission | Playwright (API blocked by Workspace admins) | | Turn in / Mark as done | Playwright (API blocked by Workspace admins) | | Unsubmit (reclaim) | Playwright (API blocked by Workspace admins) |
Why Playwright? Google Workspace for Education admins can restrict third-party apps from modifying student submissions via the API (
@ProjectPermissionDenied). Playwright automates the browser instead, bypassing that restriction entirely.
---
Requirements
- Python 3.11+
- Node.js (for
playwright-cli) - A Google Cloud project with the Classroom API and Drive API enabled
---
1. Google Cloud Console setup
1.1 Create a project
- Go to console.cloud.google.com
- Create a new project (e.g.
mcp-classroom)
1.2 Enable APIs
In APIs & Services → Library, enable:
- Google Classroom API
- Google Drive API
1.3 Configure OAuth consent screen
- Go to APIs & Services → OAuth consent screen
- User type: External
- Fill in app name, support email, developer email
- Add scopes:
https://www.googleapis.com/auth/classroom.courses.readonly
https://www.googleapis.com/auth/classroom.coursework.me
https://www.googleapis.com/auth/classroom.coursework.students
https://www.googleapis.com/auth/classroom.student-submissions.me.readonly
https://www.googleapis.com/auth/classroom.rosters.readonly
https://www.googleapis.com/auth/classroom.announcements.readonly
https://www.googleapis.com/auth/drive.file
https://www.googleapis.com/auth/drive.readonly
- Add your Google account as a test user
- Publishing status: you can leave it in Testing while developing, or publish to Production to avoid the unverified app warning
1.4 Create OAuth credentials
- Go to APIs & Services → Credentials
- Click Create Credentials → OAuth client ID
- Application type: Desktop app
- Download the JSON file
- Rename it to
client_secret_<...>.jsonand place it in the project root (next topyproject.toml)
---
2. Install the MCP server
# Clone the repo
git clone https://github.com/your-username/mcp-classroom.git
cd mcp-classroom
# Install Python dependencies
pip install -e .
First run — authenticate
mcp-classroom
A browser window will open asking you to authorize the app with your Google account. After approval, a token.json is saved locally (gitignored).
---
3. Register with Claude Code
Add the server to your Claude Code MCP config (~/.claude/claude.json or via claude mcp add):
{
"mcpServers": {
"google-classroom": {
"command": "mcp-classroom",
"args": []
}
}
}
Or if running from source: ``json { "mcpServers": { "google-classroom": { "command": "python", "args": ["-m", "src.server"], "cwd": "/absolute/path/to/mcp-classroom" } } } ``
---
4. Install Playwright (for browser automation)
npm install -g playwright-cli
npx playwright install chromium
Save your Google session (one time)
playwright-cli open --browser=chrome https://accounts.google.com/signin
# Log in manually in the browser window
playwright-cli state-save ~/classroom-auth.json
playwright-cli close
---
5. Install the Claude Code skill (optional but recommended)
The skill tells Claude how to use the MCP + Playwright together without you having to explain the workflow every time.
- Copy
skill/SKILL.mdto your Claude skills directory:
~/.claude/skills/google-classroom/SKILL.md
- Edit the skill file and fill in your own course IDs and assignment IDs (run
list_coursesandlist_courseworkonce to get them). - Update the auth state path inside the skill to match where you saved
classroom-auth.json. - Reload plugins in Claude Code:
/reload-plugins
---
Available MCP tools
| Tool | Description | |---|---| | list_courses | List active courses (slim: id, name, section, state) | | get_course | Get full details of a course | | list_coursework | List assignments (slim: id, title, state, dueDate) | | get_coursework | Get assignment details + description (no teacher file attachments) | | list_my_submissions | List your submissions — state, grade, attachment count | | get_my_submission | Get one submission's details | | list_submission_attachments | List titles and Drive IDs of files you've attached | | upload_file_to_drive | Upload a local file to Google Drive | | list_drive_files | Search files in your Drive | | add_drive_attachment | Attach a Drive file to a submission (may be blocked by Workspace) | | add_link_attachment | Attach a URL to a submission (may be blocked by Workspace) | | remove_attachment | Remove an attachment (may be blocked by Workspace) | | turn_in_submission | Turn in a submission (may be blocked by Workspace) | | reclaim_submission | Unsubmit a submission (may be blocked by Workspace) | | list_announcements | List course announcements | | list_students | List students in a course | | list_teachers | List teachers in a course |
Tools marked "may be blocked by Workspace" return
403 @ProjectPermissionDeniedon institutional Google Workspace accounts. Use Playwright automation instead for those operations.
---
File structure
mcp-classroom/
├── src/
│ ├── server.py # MCP tool definitions
│ ├── classroom.py # Classroom API calls
│ ├── drive.py # Drive API calls
│ └── auth.py # OAuth flow + scopes
├── skill/
│ └── SKILL.md # Claude Code skill template
├── tests/
├── pyproject.toml
├── requirements.txt
└── README.md
---
Gitignored (never commit these)
token.json— your OAuth tokenclient_secret_*.json— your OAuth client credentials











