Canvas LMS MCP服务器(远程)
遥控器 模型上下文协议 (MCP)服务器 Canvas LMS,部署在Cloudflare Workers上。将其连接到Claude(或任何MCP客户端),并通过自然语言与您的Canvas课程、作业、成绩等进行交互。
基于 mcp画布lms,移植为具有多用户支持的远程MCP服务器。工具是 自动同步 从上游-运行 npm run sync 再生。
特性
- 远程MCP --在Cloudflare Workers上运行,无需本地安装
- 多用户 --每个用户在OAuth流程中提供自己的Canvas凭据
- 安全的凭证存储 -Canvas API代币在静止时使用AES-256-GCM加密
- 无需外部身份验证 --用户直接输入Canvas凭据,无需第三方登录
- 时区感知结果 --用户在设置过程中选择时区,时间戳结果包括本地
_local伴生田 - 只读Canvas访问 --仅显示读取Canvas数据的工具
- 39画布工具 --课程、作业、提交、模块、页面、讨论、测验、文件、日历、对话、量规、帐户等
- 从上游自动同步 -工具、类型和API方法是从生成的 mcp画布lms 无需手动移植
先决条件
- A. 云耀 账户
- Canvas LMS API令牌(每个用户提供自己的令牌)
- Node.js和npm
设置
1.克隆并安装
git clone
cd remote-canvas-mcp
npm install2.创建KV命名空间
npx wrangler kv namespace create OAUTH_KV更新 id 在 wrangler.jsonc 在...之下 kv_namespaces 使用返回的命名空间ID。
3.更新 wrangler.jsonc
设置您的 account_id 在配置文件中(在Cloudflare仪表板中找到它)。
4.设定秘密
npx wrangler secret put COOKIE_ENCRYPTION_KEYCOOKIE_ENCRYPTION_KEY 可以是任何随机字符串(例如。 openssl rand -hex 16).它用于cookie签名和凭证加密。
5.部署
npm run deploy您的服务器将在 https://.workers.dev/mcp.
来自Claude的连接
- 打开克劳德桌面或Claude.ai
- 首选 设置>集成>添加MCP服务器
- 请输入您的服务器URL:
https://.workers.dev/mcp - 将打开一个审批页面——输入您的 画布域 (例如。
school.instructure.com)以及 Canvas API令牌 - 选择用于本地时间戳字段的时区
- 点击 批准
- 完成--画布工具现在可以在您的对话中使用
生成Canvas API令牌
- 登录您的Canvas实例
- 首选 帐户>设置
- 滚动到 已批准的集成 然后单击 +新访问令牌
- 给它一个描述,然后单击 生成令牌
- 复制令牌(它将不再显示)
更新凭据
断开并重新连接Claude中的MCP服务器。审批页面将再次出现,允许您更新Canvas凭据和时区。
从Codex连接
这个存储库也是一个Codex插件。插件元数据位于 .codex-plugin/plugin.json,以及 .mcp.json 将Codex指向部署的远程MCP端点:
https://remote-canvas-mcp.karilaa-account.workers.dev/mcp将此存储库作为本地Codex插件安装或加载。首次使用时,Codex将启动与Claude相同的OAuth审批流程:
- 在浏览器中批准MCP连接。
- 输入您的Canvas域,例如
school.instructure.com. - 输入Canvas API令牌。
- 选择用于本地时间戳字段的时区。
- 返回Codex并使用Canvas工具。
如果部署自己的Worker,请更新 url 在 .mcp.json 到您部署的 /mcp 安装插件之前的端点。
从自定义GPT连接
同一Worker还为ChatGPT自定义GPT编辑器公开了GPT操作REST外观。MCP端点在以下位置仍然可用 /mcp;自定义GPT操作应使用以下描述的REST API:
https://.workers.dev/actions/openapi.json一次性OAuth客户端注册
使用现有的动态客户端注册端点为自定义GPT创建一个OAuth客户端。替换 g-YOUR-GPT-ID 在ChatGPT中保存GPT一次后:
curl -sS https://.workers.dev/register \
-H 'Content-Type: application/json' \
-d '{
"client_name": "Canvas LMS Custom GPT",
"redirect_uris": [
"https://chat.openai.com/aip/g-YOUR-GPT-ID/oauth/callback",
"https://chatgpt.com/aip/g-YOUR-GPT-ID/oauth/callback"
],
"grant_types": ["authorization_code", "refresh_token"],
"response_types": ["code"],
"scope": "canvas.read",
"token_endpoint_auth_method": "client_secret_post"
}'保存返回的 client_id 和 client_secret.
GPT操作配置
在自定义GPT编辑器中:
- 添加操作并从导入架构
/actions/openapi.json. - 将身份验证设置为 OAuth.
- 使用已注册的
client_id和client_secret. - 将授权URL设置为
https://.workers.dev/authorize. - 将令牌URL设置为
https://.workers.dev/token. - 将范围设置为
canvas.read.
当GPT首次使用操作时,ChatGPT将启动OAuth流。审批页面要求用户提供Canvas域、Canvas API令牌和时区,然后存储以KV加密的Canvas令牌。
Actions API是只读的,可在 /actions/api/*。它公开了健康、个人资料、课程、作业、即将到来的作业、仪表板卡片、课程成绩、模块、页面和文件的重点端点。
更新更改的ChatGPT回调URL
如果ChatGPT在您输入客户端ID和密码后更改了OAuth回调URL,请更新现有的OAuth客户端,而不是注册新的客户端。首先设置一个管理员令牌:
npx wrangler secret put ACTIONS_ADMIN_TOKEN然后打开浏览器管理UI:
https://.workers.dev/admin使用登录 ACTIONS_ADMIN_TOKEN 要创建自定义GPT OAuth客户端,请检查按名称分组的客户端,更新重定向URI,并删除一个或多个选定的客户端。UI仅将管理员令牌存储在浏览器本地存储中。
您还可以使用HTTP API更新客户端:
curl -sS https://.workers.dev/admin/oauth-clients//redirect-uris \
-H 'Authorization: Bearer ' \
-H 'Content-Type: application/json' \
-d '{
"redirect_uri": "https://chat.openai.com/aip/g-YOUR-GPT-ID/oauth/callback"
}'对于ChatGPT回调,管理端点同时存储 chat.openai.com 和 chatgpt.com 同一路径的回调主机变体。您可以通过以下方式检查当前的客户注册:
curl -sS https://.workers.dev/admin/oauth-clients/ \
-H 'Authorization: Bearer '可用工具
仅注册只读Canvas工具。创建、更新、提交、发布、注册、开始尝试、标记项目完成或生成报告的工具不会公开。
时区感知结果保留了原始的Canvas时间戳字段,并添加了本地化的伴随字段 _local 后缀。例如, due_at 保留原始Canvas ISO时间戳 due_at_local 使用设置期间选择的时区添加。
| 类别 | 工具 |
|---|---|
| 健康 | canvas_health_check |
| 课程 | canvas_list_courses, canvas_get_course |
| 作业 | canvas_list_assignments, canvas_get_assignment, canvas_list_assignment_groups |
| 提交 | canvas_get_submission |
| 模块 | canvas_list_modules, canvas_get_module, canvas_list_module_items, canvas_get_module_item |
| 页面 | canvas_list_pages, canvas_get_page |
| 讨论 | canvas_list_discussion_topics, canvas_get_discussion_topic, canvas_list_announcements |
| 测验 | canvas_list_quizzes, canvas_get_quiz |
| 用户 | canvas_get_user_profile, canvas_get_course_grades, canvas_get_user_grades |
| 文件 | canvas_list_files, canvas_get_file, canvas_list_folders |
| 日历 | canvas_list_calendar_events, canvas_get_upcoming_assignments, canvas_get_dashboard, canvas_get_dashboard_cards, canvas_get_syllabus |
| 对话 | canvas_list_conversations, canvas_get_conversation, canvas_list_notifications |
| 账户 | canvas_get_account, canvas_list_account_courses, canvas_list_account_users, canvas_list_sub_accounts, canvas_get_account_reports |
| 评分标准 | canvas_list_rubrics, canvas_get_rubric |
从上游同步
工具、类型和API方法是从上游自动生成的 mcp画布lms 项目。要获取最新更改,请执行以下操作:
npm run sync # regenerate src/generated/ from upstream
npm run deploy # deploy the updated server同步脚本(scripts/sync-upstream.ts)获取上游源代码,解析工具定义和客户端方法,并在下生成三个文件 src/generated/:
types.ts--画布实体接口canvas-api.ts-基于fetch的API方法(从上游的Axios转换而来)register-tools.ts--所有使用Zod模式的MCP工具注册
运作原理
User connects MCP server in Claude
→ GET /authorize → Approval page with Canvas credential fields
→ User enters Canvas token + domain, selects timezone, clicks Approve
→ POST /authorize → Token is encrypted and timezone preference is stored per-user in KV
→ MCP connects → Server loads credentials from KV → Read-only Canvas tools are registered本地开发
printf 'COOKIE_ENCRYPTION_KEY=%s\n' "your-random-secret" > .dev.vars
npm run devCOOKIE_ENCRYPTION_KEY 可以是任何足够随机的字符串。它也用于本地开发期间的cookie签名和Canvas凭据加密。
项目结构
src/
index.ts ← MCP server entry point
canvas-client.ts ← HTTP infrastructure (request, pagination, retry)
types.ts ← Re-exports generated types + CanvasAPIError
generated/ ← AUTO-GENERATED by npm run sync
types.ts ← Canvas entity interfaces
canvas-api.ts ← Client API methods (fetch-based)
register-tools.ts ← Read-only tool registrations
scripts/
sync-upstream.ts ← Code generation script技术栈
- Cloudflare 边缘计算平台 + 耐用物品 --运行时间
agents--Cloudflare的MCP服务器框架(McpAgent)@cloudflare/workers-oauth-provider--OAuth 2.1与动态客户端注册- 荣誉 --OAuth路由的轻量级web框架
- 萨德 --MCP工具模式的输入验证
