Canvas LMS MCP Server (Cloudflare Workers)
Remote MCP server that connects to Canvas LMS and exposes course/assignment/quiz tools over Cloudflare Workers.
What this server provides
The MCP agent is served at:
GET /mcp(MCP endpoint)
It currently implements these tools:
get_active_courses: Returns active courses filtered to course names containingSPorFL.get_assignments: Returns assignments due in the nextndays (1-90, default7).get_quizzes: Returns quizzes due in the nextndays (1-90, default7).
Prerequisites
- Node.js 18+ (or newer)
- npm
- A Cloudflare account
- A Canvas LMS access token and base URL (for example
https://sjsu.instructure.com)
Install
npm install
Configure environment variables
Use local vars for development by creating/updating .dev.vars:
CANVAS_BASE_URL=https://your-school.instructure.com
CANVAS_TOKEN=your_canvas_token
For deployment, use Wrangler secrets instead of committing credentials:
wrangler secret put CANVAS_TOKEN
wrangler secret put CANVAS_BASE_URL
Run locally
npm run dev
Default local URL:
http://localhost:8787/mcp
Health check route:
http://localhost:8787/
Deploy
npm run deploy
After deploy, your MCP endpoint is:
https://<your-worker>.<your-subdomain>.workers.dev/mcp
Use with an MCP client (example: Claude Desktop via mcp-remote)
Add/update your MCP client config:
{
"mcpServers": {
"canvas": {
"command": "npx",
"args": [
"mcp-remote",
"https://<your-worker>.<your-subdomain>.workers.dev/mcp"
]
}
}
}
For local testing:
{
"mcpServers": {
"canvas": {
"command": "npx",
"args": ["mcp-remote", "http://localhost:8787/mcp"]
}
}
}
Useful scripts
npm run dev: Start local Worker development server.npm run deploy: Deploy to Cloudflare Workers.npm run type-check: Run TypeScript type checking.npm run lint:fix: Auto-fix lint issues via oxlint.npm run format: Format repo with oxfmt.npm run cf-typegen: Regenerate Wrangler type bindings.
Project structure
src/index.ts: MCP server definition and tool implementations.src/lib/helper.ts: Canvas pagination (Linkheader parsing).public/: Static assets for Worker static asset binding.wrangler.jsonc: Cloudflare Worker configuration.






