Google Classroom自动化服务器

一个为AI代理提供Google Classroom程序化访问的MCP服务器,支持教育工作者进行批量作业创建、名册管理、提交收集、评分和Drive文件交付等多步骤自动化工作流。

  • by adriasantacreu
  • JavaScript
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 adriasantacreu/google-classroom-mcp

使用说明

谷歌课堂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凭据

  1. 首选 console.cloud.google.com
  2. 启用课堂API: API和服务>库>Google Classroom API>启用
  3. 首选 API和服务>凭据>创建凭据>OAuth客户端ID
  4. 应用程序类型: 桌面应用程序
  5. 下载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

贡献

欢迎问题和拉取请求。添加新工具时:

  1. 在中声明工具 getTools() 与完整 inputSchema
  2. 添加匹配项 case 在 handleToolCall()
  3. 在中添加测试 tests/test-basic.js

遵循现有的模式进行紧凑/完整数据响应和错误处理。

许可证

麻省理工学院