使用说明
谷歌课堂MCP服务器
A. 模型上下文协议 (MCP)服务器,为AI代理提供对Google Classroom的完全编程访问。专为教育工作者实现复杂、多步骤的自动化工作流程而构建:从批量作业创建和排班管理到提交收集、评分和Drive文件交付。
为什么存在
人工智能代理需要结构化、可靠地访问教育平台,才能在教学工作流程中真正发挥作用。该服务器诞生于将人工智能助手集成到实际课堂管理中的需要——自动化重复性任务,编排多步骤流程(创建主题→ 分配工作→ 收集意见→ 成绩),让基于LLM的工具作为教师的得力助手。
特性
- 46个完全实施的工具 --课程、主题、作业、材料、公告、提交、评分、名册、监护人、量规和驱动器文件管理
- Google Drive集成 --将文件上传到Drive并将其附加到作业中;下载学生提交的PDF文件
- 默认情况下压缩响应 --列表操作只返回基本字段,以保持在MCP令牌限制范围内;通过
fullData: true对于完整对象 - OAuth2身份验证 具有持久令牌存储和自动刷新功能
- 环境变量覆盖 为了
credentials.json和token.json路径
安装
先决条件
- Node.js 18+
- 具有Google课堂访问权限的Google帐户(教师角色)
- 启用课堂API的谷歌云项目
步骤1--克隆和构建
git clone https://github.com/adriasantacreu/google-classroom-mcp.git
cd google-classroom-mcp
npm install
npm run build
步骤2——创建Google OAuth凭据
- 首选 console.cloud.google.com
- 启用课堂API: API和服务>库>Google Classroom API>启用
- 首选 API和服务>凭据>创建凭据>OAuth客户端ID
- 应用程序类型: 桌面应用程序
- 下载JSON并将其另存为
credentials.json在项目根中
步骤3——身份验证
node auth.js
在浏览器中打开打印的URL,授权应用程序,粘贴代码。A. token.json 文件在本地创建和存储。
配置您的MCP客户端
选择您的客户端并添加服务器配置。替换 /absolute/path/to/google-classroom-mcp 使用系统上的实际路径。
克劳德桌面版
编辑 ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)或 %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"google-classroom": {
"command": "node",
"args": ["/absolute/path/to/google-classroom-mcp/dist/index.js"]
}
}
}
光标
编辑 ~/.cursor/mcp.json (全球)或 .cursor/mcp.json (每个项目):
{
"mcpServers": {
"google-classroom": {
"command": "node",
"args": ["/absolute/path/to/google-classroom-mcp/dist/index.js"]
}
}
}
VS代码(使用GitHub Copilot)
编辑您的用户 settings.json 或 .vscode/mcp.json:
{
"mcp": {
"servers": {
"google-classroom": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/google-classroom-mcp/dist/index.js"]
}
}
}
}
帆板运动
编辑 ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"google-classroom": {
"command": "node",
"args": ["/absolute/path/to/google-classroom-mcp/dist/index.js"]
}
}
}
自定义路径(可选)
如果你 credentials.json 或 token.json 不在项目根目录中,请使用环境变量:
{
"mcpServers": {
"google-classroom": {
"command": "node",
"args": ["/absolute/path/to/google-classroom-mcp/dist/index.js"],
"env": {
"GOOGLE_CREDENTIALS_PATH": "/path/to/credentials.json",
"GOOGLE_TOKEN_PATH": "/path/to/token.json"
}
}
}
}
编辑配置后重新启动MCP客户端。
OAuth范围
服务器在以下期间请求以下作用域 node auth.js:
| 范围 | 目的 |
|---|---|
classroom.courses |
读/写课程 |
classroom.coursework.students |
管理作业和提交 |
classroom.coursework.me |
访问自己的课程 |
classroom.courseworkmaterials |
管理课程材料 |
classroom.announcements |
发布和管理公告 |
classroom.rosters |
管理学生和教师 |
classroom.topics |
管理课程主题 |
classroom.guardianlinks.students |
管理学生监护人 |
classroom.profile.emails |
读取用户电子邮件地址 |
classroom.profile.photos |
阅读用户资料照片 |
drive.file |
将文件上传到驱动器 |
drive.readonly |
下载学生上传的提交文件 |
工具参考
课程
| 工具 | 必需参数 | 可选参数 | 说明 |
|---|---|---|---|
classroom_list_courses |
— | courseStates, pageSize, pageToken, fullData |
列出所有课程。 courseStates:活动、已存档、已配置 |
classroom_search_courses |
query |
-- | 按名称或章节搜索课程(不区分大小写) |
classroom_get_course |
courseId |
-- | 获取单个课程的完整详细信息 |
classroom_create_course |
name |
section, description, room, ownerId |
创建新课程 |
classroom_update_course |
courseId |
name, section, description, room, state |
更新课程字段。 state:活动、已存档 |
classroom_delete_course |
courseId |
-- | 存档然后删除课程 |
话题
| 工具 | 必需参数 | 可选参数 | 说明 |
|---|---|---|---|
classroom_get_topic |
courseId, id |
-- | 获取特定主题的详细信息 |
classroom_list_topics |
courseId |
-- | 列出课程中的所有主题 |
classroom_create_topic |
courseId, name |
-- | 创建新主题/单元 |
classroom_patch_topic |
courseId, id, name |
-- | 重命名主题 |
classroom_delete_topic |
courseId, id |
-- | 删除主题 |
作业
| 工具 | 必需参数 | 可选参数 | 说明 |
|---|---|---|---|
classroom_get_assignment |
courseId, id |
-- | 获取单个作业的完整详细信息 |
classroom_list_assignments |
courseId |
courseWorkStates, pageSize, pageToken |
列出作业。 courseWorkStates:已发布,草稿 |
classroom_create_assignment |
courseId, title |
description, workType, state, maxPoints, dueDate (YYYY-MM-DD), dueTime (HH:MM), topicId, attachments |
创建作业或问题 |
classroom_patch_assignment |
courseId, id, updateMask |
title, description, maxPoints, topicId, dueDate, dueTime, state |
通过updateMask进行部分更新 |
classroom_update_assignment |
courseId, id |
title, description, maxPoints, dueDate, dueTime, topicId, state |
所有可变字段的完整更新 |
classroom_delete_assignment |
courseId, id |
-- | 永久删除作业 |
classroom_move_to_topic |
courseId, id, topicId |
-- | 将作业移动到主题。通过 "" 取消分配 |
附件格式 (为 classroom_create_assignment):
"attachments": [
{ "type": "driveFile", "idOrUrl": "<drive-file-id>" },
{ "type": "link", "idOrUrl": "https://example.com" },
{ "type": "youtubeVideo", "idOrUrl": "<video-id>" },
{ "type": "form", "idOrUrl": "https://forms.gle/..." }
]
材料
| 工具 | 必需参数 | 可选参数 | 说明 |
|---|---|---|---|
classroom_get_material |
courseId, id |
-- | 获取特定材料的完整详细信息 |
classroom_list_materials |
courseId |
pageSize |
列出所有未分级的材料 |
classroom_create_material |
courseId, title |
description, topicId, attachments |
创建材料帖子 |
classroom_patch_material |
courseId, id, updateMask |
title, description, topicId, state |
更新物料字段 |
classroom_delete_material |
courseId, id |
-- | 删除材料 |
公告
| 工具 | 必需参数 | 可选参数 | 说明 |
|---|---|---|---|
classroom_list_announcements |
courseId |
pageSize |
列表公告 |
classroom_post_announcement |
courseId, text |
-- | 发布到课程流 |
classroom_patch_announcement |
courseId, id, text |
-- | 编辑公告文本 |
classroom_delete_announcement |
courseId, id |
-- | 删除公告 |
提交
| 工具 | 必需参数 | 可选参数 | 说明 |
|---|---|---|---|
classroom_list_submissions |
courseId, courseWorkId |
states, pageSize |
列出提交内容。使用 "-" 作为 courseWorkId 获取课程中的所有提交内容。 states:NEW、CREATED、TURNED_IN、return |
classroom_grade_submission |
courseId, courseWorkId, id, grade |
draft |
设定一个等级。 draft: true 仅设置draftGrade |
classroom_return_submission |
courseId, courseWorkId, id |
-- | 将已评分的提交内容返回给学生 |
学生名册
| 工具 | 必需参数 | 可选参数 | 说明 |
|---|---|---|---|
classroom_list_students |
courseId |
pageSize |
列出注册学生 |
classroom_add_student |
courseId, email |
-- | 通过电子邮件邀请学生(发送邀请) |
classroom_delete_student |
courseId, userId |
-- | 删除一名学生。 userId:电子邮件或用户ID |
名册----教师
| 工具 | 必需参数 | 可选参数 | 说明 |
|---|---|---|---|
classroom_list_teachers |
courseId |
-- | 列出联合讲师 |
classroom_invite_teacher |
courseId, email |
-- | 通过电子邮件邀请一位联合教师 |
classroom_delete_teacher |
courseId, userId |
-- | 删除教师 |
守护者
| 工具 | 必需参数 | 可选参数 | 说明 |
|---|---|---|---|
classroom_list_guardians |
studentId |
-- | 列出学生的监护人 |
classroom_invite_guardian |
studentId, guardianEmail |
-- | 发送监护人邀请 |
classroom_delete_guardian |
studentId, guardianId |
-- | 删除监护人 |
评分标准
| 工具 | 必需参数 | 可选参数 | 说明 |
|---|---|---|---|
classroom_list_rubrics |
courseId, courseWorkId |
-- | 列出作业的评分标准 |
classroom_create_rubric |
courseId, courseWorkId, criteria |
-- | 使用条件数组创建量规 |
classroom_patch_rubric |
courseId, courseWorkId, id, criteria |
-- | 更新评分标准 |
classroom_delete_rubric |
courseId, courseWorkId, id |
-- | 删除一个评价标准 |
用户档案
| 工具 | 必需参数 | 可选参数 | 说明 |
|---|---|---|---|
classroom_get_user_profile |
userId |
-- | 通过电子邮件或用户ID获取个人资料 |
驱动器和文件附件
| 工具 | 必需参数 | 可选参数 | 说明 |
|---|---|---|---|
drive_upload_file |
name, base64Content |
mimeType |
将base64编码的文件上传到驱动器。返回文件ID和URL |
classroom_upload_to_classroom |
courseId, title, fileName, base64Content |
description, topicId, mimeType |
一步将文件上传到Drive并将其作为材料附加 |
已知的API限制
- 课程删除 要求课程
ARCHIVED首先,该工具会自动处理此问题 - 材料不可编辑 创建后-课堂API不提供材料的PATCH端点;
classroom_patch_material已声明,但对于大多数字段将被API拒绝 - 作业
workType(任务、简短回答问题、多选问题)创建后无法更改 - 作业
state只能移动到PUBLISHED-API不支持还原为DRAFT - 作业附件 创建后无法修改-这是API限制
drive.file范围 仅授予对此应用程序创建的文件的访问权限。这drive.readonly下载学生上传的提交文件需要范围(默认包含)- 监护人管理 要求Google Workspace管理员已为域启用监护人功能
classroom_add_student发送注册 邀请 --学生必须接受它;它不直接注册- 修改web创建的内容 —
ProjectPermissionDenied当尝试修补或移动通过课堂网络界面或其他应用程序创建的课程作业时,会返回。API仅允许修改由同一OAuth项目创建的项(associatedWithDeveloper: true).这是Google API的限制,而不是范围问题 - API评价准则 需要 谷歌教育工作区Plus 或 教学和学习升级 许可证。教育基础科目(免费级别)将获得
UserIneligibleToModifyRubrics。参见 谷歌的评分标准限制
故障排除
Authentication token not found. Run auth flow first.
跑 node auth.js 并完成OAuth流程。A. token.json 启动服务器之前,文件必须存在。
Token expired or invalid
删除 token.json 然后跑 node auth.js 再次进行重新认证。
Some requested scopes were invalid
您的令牌是使用过时的作用域列表生成的。删除 token.json 并重新运行 node auth.js.
ProjectPermissionDenied 评分时
经过身份验证的帐户无权在该课程中评分。确认您是课程所有者或合作教师。
UserInIllegalDomain 添加学生时
受邀电子邮件属于您的Google Workspace策略不允许的域。这是一个域级限制,而不是API错误。
列出截断或缺失的字段的响应
默认情况下,列表工具返回紧凑字段以保持在MCP令牌限制范围内。通过 fullData: true 以获得完整的API响应。
客户端中未加载MCP服务器
- 验证配置中的路径指向
dist/index.js,不src/index.ts - 确保你跑了
npm run build任何源更改后 - 配置更改后重新启动MCP客户端
运行测试
测试针对真实的谷歌课堂课程运行,并将创建和删除实时数据。
# Set your test course ID
export TEST_COURSE_ID=your_course_id_here
# Functional tests — one tool at a time, with cleanup
node tests/test-basic.js
# Integration tests — cross-tool workflows and data consistency
node tests/test-integration.js
项目结构
google-classroom-mcp/
├── src/
│ └── index.ts # MCP server — all 46 tools (TypeScript source)
├── dist/
│ └── index.js # Compiled output — point your MCP client here
├── tests/
│ ├── test-basic.js # Functional tests for each tool individually
│ └── test-integration.js # Cross-tool workflow and consistency tests
├── auth.js # OAuth2 token generator
├── smithery.yaml # Smithery marketplace config
├── credentials.json # Your OAuth credentials (git-ignored)
├── token.json # Generated auth token (git-ignored)
└── package.json
贡献
欢迎问题和拉取请求。添加新工具时:
- 在中声明工具
getTools()与完整inputSchema - 添加匹配项
case在handleToolCall() - 在中添加测试
tests/test-basic.js
遵循现有的模式进行紧凑/完整数据响应和错误处理。
许可证
麻省理工学院
