{"_id":"@bruchris/canvas-lms-mcp","_rev":"4-41b0a6198938e1eac824663c862f6331","name":"@bruchris/canvas-lms-mcp","dist-tags":{"latest":"0.5.1"},"versions":{"0.4.0":{"name":"@bruchris/canvas-lms-mcp","version":"0.4.0","keywords":["canvas","lms","mcp","model-context-protocol","education","grading"],"author":{"name":"Christian Bru"},"license":"MIT","_id":"@bruchris/canvas-lms-mcp@0.4.0","maintainers":[{"name":"bruchris","email":"christian@bruchris.me"}],"homepage":"https://github.com/bruchris/canvas-lms-mcp#readme","bugs":{"url":"https://github.com/bruchris/canvas-lms-mcp/issues"},"bin":{"canvas-lms-mcp":"dist/stdio.js"},"dist":{"shasum":"28957983042c90c271c39e58183835993ed5d694","tarball":"https://registry.npmjs.org/@bruchris/canvas-lms-mcp/-/canvas-lms-mcp-0.4.0.tgz","fileCount":35,"integrity":"sha512-0DMTlvKd6bgDWty8GiGb5eHnXmNJu59SeNU6MCeYMiRAv5hfU+g4fCz5dhzeiiexAX/jBUcYwHzGy9d9YmZiMw==","signatures":[{"sig":"MEUCICDsUfCgBPE4+E35jO20/cXxSdPFBUkzltgm06umGK3kAiEAo1BN4gtUabIK7VEgNVxel9d0Rm8iP0CUTSzUWQVD1+w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":337750},"type":"module","_from":"file:bruchris-canvas-lms-mcp-0.4.0.tgz","engines":{"node":">=22"},"exports":{".":{"import":"./dist/server.js","require":"./dist/server.cjs"},"./http":{"import":"./dist/http.js","require":"./dist/http.cjs"},"./stdio":{"import":"./dist/stdio.js","require":"./dist/stdio.cjs"},"./canvas":{"import":"./dist/canvas/index.js","require":"./dist/canvas/index.cjs"}},"scripts":{"dev":"tsup --watch","lint":"eslint src/ tests/ && prettier --check src/ tests/","test":"vitest run","build":"tsup","lint:fix":"eslint src/ tests/ --fix && prettier --write src/ tests/","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"bruchris","email":"christian@bruchris.me"},"_resolved":"/tmp/793f4dd45cc08f3eae37aa0cdb6e3faa/bruchris-canvas-lms-mcp-0.4.0.tgz","_integrity":"sha512-0DMTlvKd6bgDWty8GiGb5eHnXmNJu59SeNU6MCeYMiRAv5hfU+g4fCz5dhzeiiexAX/jBUcYwHzGy9d9YmZiMw==","repository":{"url":"git+https://github.com/bruchris/canvas-lms-mcp.git","type":"git"},"_npmVersion":"10.9.7","description":"Canvas LMS MCP server — read courses, assignments, submissions, rubrics, quizzes; grade and comment from any AI agent","directories":{},"_nodeVersion":"22.22.2","dependencies":{"zod":"^4.3.6","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.2.0","vitest":"^4.1.4","prettier":"^3.8.2","@eslint/js":"^10.0.1","typescript":"^6.0.2","@types/node":"^25.6.0","typescript-eslint":"^8.58.1","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.58.1","@typescript-eslint/eslint-plugin":"^8.58.1"},"_npmOperationalInternal":{"tmp":"tmp/canvas-lms-mcp_0.4.0_1776373555490_0.02439106330254881","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.5.0":{"name":"@bruchris/canvas-lms-mcp","version":"0.5.0","keywords":["canvas","canvas-lms","lms","mcp","model-context-protocol","education","grading","ai-agent","ai-tools","claude-desktop","cursor","vscode","instructure","education-technology","edtech","teacher","student","grading-automation","typescript"],"author":{"name":"Christian Bru"},"license":"MIT","_id":"@bruchris/canvas-lms-mcp@0.5.0","maintainers":[{"name":"bruchris","email":"christian@bruchris.me"}],"homepage":"https://github.com/bruchris/canvas-lms-mcp#readme","bugs":{"url":"https://github.com/bruchris/canvas-lms-mcp/issues"},"bin":{"canvas-lms-mcp":"dist/stdio.js"},"dist":{"shasum":"f72091d4824c69621d1be3b60b9f00b9c64ae4fe","tarball":"https://registry.npmjs.org/@bruchris/canvas-lms-mcp/-/canvas-lms-mcp-0.5.0.tgz","fileCount":35,"integrity":"sha512-k0wkC4BbN0FIAZFA6QpEiV0mktpjmBSJXOq4vV7cIj1doNd8ey+JFeLYeKjMHle1+HsfiYcQqymWTim/hMk2zg==","signatures":[{"sig":"MEYCIQDKbBEqt2sH4jV7LSxNk4/Ak79dgQ6jcuZd7ioc27L3NwIhAKV9VF+rlxxsq0oc81iZ1km3Et0CMl0oJpGLshlIRUqX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bruchris%2fcanvas-lms-mcp@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":559673},"type":"module","_from":"file:bruchris-canvas-lms-mcp-0.5.0.tgz","engines":{"node":">=22"},"exports":{".":{"import":"./dist/server.js","require":"./dist/server.cjs"},"./http":{"import":"./dist/http.js","require":"./dist/http.cjs"},"./stdio":{"import":"./dist/stdio.js","require":"./dist/stdio.cjs"},"./canvas":{"import":"./dist/canvas/index.js","require":"./dist/canvas/index.cjs"}},"scripts":{"dev":"tsup --watch","lint":"eslint src/ tests/ && prettier --check src/ tests/","test":"vitest run","build":"tsup","lint:fix":"eslint src/ tests/ --fix && prettier --write src/ tests/","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"bruchris","email":"christian@bruchris.me"},"_resolved":"/tmp/45c1f407cd0dbcfb6703e52bc4bdc28f/bruchris-canvas-lms-mcp-0.5.0.tgz","_integrity":"sha512-k0wkC4BbN0FIAZFA6QpEiV0mktpjmBSJXOq4vV7cIj1doNd8ey+JFeLYeKjMHle1+HsfiYcQqymWTim/hMk2zg==","repository":{"url":"git+https://github.com/bruchris/canvas-lms-mcp.git","type":"git"},"_npmVersion":"10.9.7","description":"TypeScript MCP 1.x server for Canvas LMS — 88 tools across Canvas courses, assignments, grades, quizzes, discussions, admin workflows, and more.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"zod":"^4.3.6","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.2.0","vitest":"^4.1.4","prettier":"^3.8.2","@eslint/js":"^10.0.1","typescript":"^6.0.2","@types/node":"^25.6.0","typescript-eslint":"^8.58.1","@vitest/coverage-v8":"^4.1.4","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.58.1","@typescript-eslint/eslint-plugin":"^8.58.1"},"_npmOperationalInternal":{"tmp":"tmp/canvas-lms-mcp_0.5.0_1776439310354_0.8803042253727889","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.5.1":{"name":"@bruchris/canvas-lms-mcp","version":"0.5.1","keywords":["canvas","canvas-lms","lms","mcp","model-context-protocol","education","grading","ai-agent","ai-tools","claude-desktop","cursor","vscode","instructure","education-technology","edtech","teacher","student","grading-automation","typescript"],"author":{"name":"Christian Bru"},"license":"MIT","_id":"@bruchris/canvas-lms-mcp@0.5.1","maintainers":[{"name":"bruchris","email":"christian@bruchris.me"}],"homepage":"https://github.com/bruchris/canvas-lms-mcp#readme","bugs":{"url":"https://github.com/bruchris/canvas-lms-mcp/issues"},"bin":{"canvas-lms-mcp":"dist/stdio.js"},"dist":{"shasum":"f2d9da2e9665618a1f16f421559c9c5dda702e27","tarball":"https://registry.npmjs.org/@bruchris/canvas-lms-mcp/-/canvas-lms-mcp-0.5.1.tgz","fileCount":35,"integrity":"sha512-3NMWIXRZPYvolJwqGneEirvc9+baVsZq+F7SsZZLP5t6rMXQ7n3EHH6DTLXpDTsJ68vo5FF2nTYgx18+GdG7bw==","signatures":[{"sig":"MEYCIQDkbxMutlK76kPh+v8NmSMW3aG4MP1p0FZPN46+2yUg9gIhAOXoDC6pOCLEDhjJ5HoOj5NUlDq+ZCoYc2kthv8o6jKp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bruchris%2fcanvas-lms-mcp@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":559673},"type":"module","_from":"file:bruchris-canvas-lms-mcp-0.5.1.tgz","engines":{"node":">=22"},"exports":{".":{"import":"./dist/server.js","require":"./dist/server.cjs"},"./http":{"import":"./dist/http.js","require":"./dist/http.cjs"},"./stdio":{"import":"./dist/stdio.js","require":"./dist/stdio.cjs"},"./canvas":{"import":"./dist/canvas/index.js","require":"./dist/canvas/index.cjs"}},"scripts":{"dev":"tsup --watch","lint":"eslint src/ tests/ && prettier --check src/ tests/","test":"vitest run","build":"tsup","lint:fix":"eslint src/ tests/ --fix && prettier --write src/ tests/","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"bruchris","email":"christian@bruchris.me"},"_resolved":"/tmp/36e559f9f0577a0cab6651cc94899abd/bruchris-canvas-lms-mcp-0.5.1.tgz","_integrity":"sha512-3NMWIXRZPYvolJwqGneEirvc9+baVsZq+F7SsZZLP5t6rMXQ7n3EHH6DTLXpDTsJ68vo5FF2nTYgx18+GdG7bw==","repository":{"url":"git+https://github.com/bruchris/canvas-lms-mcp.git","type":"git"},"_npmVersion":"11.11.0","description":"TypeScript MCP 1.x server for Canvas LMS — 88 tools across Canvas courses, assignments, grades, quizzes, discussions, admin workflows, and more.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"zod":"^4.3.6","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.2.0","vitest":"^4.1.4","prettier":"^3.8.2","@eslint/js":"^10.0.1","typescript":"^6.0.2","@types/node":"^25.6.0","typescript-eslint":"^8.58.1","@vitest/coverage-v8":"^4.1.4","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.58.1","@typescript-eslint/eslint-plugin":"^8.58.1"},"_npmOperationalInternal":{"tmp":"tmp/canvas-lms-mcp_0.5.1_1776445524545_0.4904194186458737","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."}},"time":{"created":"2026-04-16T21:05:55.369Z","modified":"2026-04-21T10:46:17.314Z","0.4.0":"2026-04-16T21:05:55.626Z","0.5.0":"2026-04-17T15:21:50.521Z","0.5.1":"2026-04-17T17:05:24.700Z"},"bugs":{"url":"https://github.com/bruchris/canvas-lms-mcp/issues"},"author":{"name":"Christian Bru"},"license":"MIT","homepage":"https://github.com/bruchris/canvas-lms-mcp#readme","keywords":["canvas","canvas-lms","lms","mcp","model-context-protocol","education","grading","ai-agent","ai-tools","claude-desktop","cursor","vscode","instructure","education-technology","edtech","teacher","student","grading-automation","typescript"],"repository":{"url":"git+https://github.com/bruchris/canvas-lms-mcp.git","type":"git"},"description":"TypeScript MCP 1.x server for Canvas LMS — 88 tools across Canvas courses, assignments, grades, quizzes, discussions, admin workflows, and more.","maintainers":[{"name":"bruchris","email":"christian@bruchris.me"}],"readme":"# Canvas LMS MCP Server\n\n> The TypeScript MCP server for Canvas LMS.\n\n[![CI](https://github.com/bruchris/canvas-lms-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/bruchris/canvas-lms-mcp/actions/workflows/ci.yml)\n[![npm](https://img.shields.io/npm/v/%40bruchris%2Fcanvas-lms-mcp)](https://www.npmjs.com/package/@bruchris/canvas-lms-mcp)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Node](https://img.shields.io/badge/node-%3E%3D22-brightgreen)](https://nodejs.org)\n[![npm downloads](https://img.shields.io/npm/dw/@bruchris/canvas-lms-mcp)](https://www.npmjs.com/package/@bruchris/canvas-lms-mcp)\n\nMCP server for [Canvas LMS](https://www.instructure.com/canvas). Read courses, assignments, submissions, rubrics, quizzes; grade, comment, manage course content, and handle Canvas admin workflows from any AI agent.\n\n88 tools across Canvas courses, assignments, submissions, rubrics, quizzes, files, users, groups, enrollments, discussions, modules, pages, calendar, conversations, peer reviews, accounts, analytics, student workflows, dashboard, and health checks. Three deployment modes: stdio, HTTP, and library import.\n\n## Comparison\n\n| | @bruchris/canvas-lms-mcp | [vishalsachdev/canvas-mcp](https://github.com/vishalsachdev/canvas-mcp) | [DMontgomery40/mcp-canvas-lms](https://github.com/DMontgomery40/mcp-canvas-lms) |\n|---|---|---|---|\n| Language | TypeScript | Python | TypeScript |\n| Tools | 88 | 80+ | 54 |\n| License | [![License: MIT](https://img.shields.io/github/license/bruchris/canvas-lms-mcp)](https://github.com/bruchris/canvas-lms-mcp/blob/main/LICENSE) | [![License](https://img.shields.io/github/license/vishalsachdev/canvas-mcp)](https://github.com/vishalsachdev/canvas-mcp/blob/main/LICENSE) | [![License](https://img.shields.io/github/license/DMontgomery40/mcp-canvas-lms)](https://github.com/DMontgomery40/mcp-canvas-lms/blob/main/LICENSE) |\n| Last commit | [![Last commit](https://img.shields.io/github/last-commit/bruchris/canvas-lms-mcp)](https://github.com/bruchris/canvas-lms-mcp) | [![Last commit](https://img.shields.io/github/last-commit/vishalsachdev/canvas-mcp)](https://github.com/vishalsachdev/canvas-mcp) | [![Last commit](https://img.shields.io/github/last-commit/DMontgomery40/mcp-canvas-lms)](https://github.com/DMontgomery40/mcp-canvas-lms) |\n\n## Quick Start\n\n### 1. Get a Canvas API Token\n\n1. Log in to your Canvas instance\n2. Go to **Account > Settings**\n3. Scroll to **Approved Integrations** and click **+ New Access Token**\n4. Give it a name (e.g., \"MCP Server\") and click **Generate Token**\n5. Copy the token immediately -- you won't see it again\n\n### 2. One Command Setup\n\n```bash\nnpx add-mcp @bruchris/canvas-lms-mcp\n```\n\nThis auto-detects your installed AI clients (Claude Code, Cursor, VS Code, etc.) and configures them. You will be prompted for your Canvas API token and base URL.\n\n### Client-Specific Commands\n\n**Claude Code**\n\n```bash\nclaude mcp add canvas-lms --env CANVAS_API_TOKEN=your-token --env CANVAS_BASE_URL=https://school.instructure.com -- npx -y @bruchris/canvas-lms-mcp\n```\n\n**VS Code**\n\n```bash\ncode --add-mcp '{\"name\":\"canvas-lms\",\"command\":\"npx\",\"args\":[\"-y\",\"@bruchris/canvas-lms-mcp\"],\"env\":{\"CANVAS_API_TOKEN\":\"your-token\",\"CANVAS_BASE_URL\":\"https://school.instructure.com\"}}'\n```\n\n**Gemini CLI**\n\n```bash\ngemini mcp add canvas-lms npx @bruchris/canvas-lms-mcp\n```\n\n**Codex CLI**\n\n```bash\ncodex mcp add canvas-lms -- npx @bruchris/canvas-lms-mcp\n```\n\n<details>\n<summary>Manual Configuration</summary>\n\n#### Claude Desktop\n\nAdd to your `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"canvas-lms\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@bruchris/canvas-lms-mcp\"],\n      \"env\": {\n        \"CANVAS_API_TOKEN\": \"your-token-here\",\n        \"CANVAS_BASE_URL\": \"https://your-institution.instructure.com\"\n      }\n    }\n  }\n}\n```\n\n#### Cursor\n\nAdd to `.cursor/mcp.json` in your project:\n\n```json\n{\n  \"mcpServers\": {\n    \"canvas-lms\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@bruchris/canvas-lms-mcp\"],\n      \"env\": {\n        \"CANVAS_API_TOKEN\": \"your-token-here\",\n        \"CANVAS_BASE_URL\": \"https://your-institution.instructure.com\"\n      }\n    }\n  }\n}\n```\n\n#### VS Code\n\nAdd to your VS Code settings (`settings.json`):\n\n```json\n{\n  \"mcp.servers\": {\n    \"canvas-lms\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@bruchris/canvas-lms-mcp\"],\n      \"env\": {\n        \"CANVAS_API_TOKEN\": \"your-token-here\",\n        \"CANVAS_BASE_URL\": \"https://your-institution.instructure.com\"\n      }\n    }\n  }\n}\n```\n\n#### Windsurf\n\nAdd to `~/.codeium/windsurf/mcp_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"canvas-lms\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@bruchris/canvas-lms-mcp\"],\n      \"env\": {\n        \"CANVAS_API_TOKEN\": \"your-token-here\",\n        \"CANVAS_BASE_URL\": \"https://your-institution.instructure.com\"\n      }\n    }\n  }\n}\n```\n\n#### ChatGPT / HTTP Clients\n\nRun the server in HTTP mode, then point your client at the endpoint:\n\n```bash\nnpx @bruchris/canvas-lms-mcp serve --port 3001 \\\n  --token your-token-here \\\n  --base-url https://your-institution.instructure.com\n```\n\nThe MCP endpoint is `http://localhost:3001/mcp`. Per-request credentials can be passed via `X-Canvas-Token` and `X-Canvas-Base-URL` headers.\n\n</details>\n\n## Example Prompts\n\nOnce configured, try these prompts with your AI client:\n\n- \"List all my active courses\"\n- \"Show me the assignments for course 12345\"\n- \"What's the average grade on the midterm exam?\"\n- \"Grade Alice's essay submission with a B+ and add feedback\"\n- \"Show me the rubric for the final project\"\n- \"What discussions are happening in my Biology course?\"\n- \"List all upcoming calendar events for course 12345\"\n- \"Send a message to student 67890 about their missing assignment\"\n\n## Tool Inventory\n\n### All Registered Tools (88)\n\n| Category | Tools |\n|----------|-------|\n| Health | `health_check` |\n| Courses | `list_courses`, `get_course`, `get_syllabus`, `create_course`, `update_course` |\n| Assignments | `list_assignments`, `get_assignment`, `list_assignment_groups`, `create_assignment`, `update_assignment`, `delete_assignment` |\n| Submissions | `list_submissions`, `get_submission`, `grade_submission`, `comment_on_submission` |\n| Rubrics | `list_rubrics`, `get_rubric`, `get_rubric_assessment`, `submit_rubric_assessment` |\n| Quizzes | `list_quizzes`, `get_quiz`, `list_quiz_submissions`, `list_quiz_questions`, `get_quiz_submission_answers`, `score_quiz_question` |\n| Files | `list_files`, `list_folders`, `get_file`, `upload_file`, `delete_file` |\n| Users | `list_students`, `get_user`, `get_profile`, `search_users`, `list_course_users` |\n| Groups | `list_groups`, `list_group_members` |\n| Enrollments | `list_enrollments`, `enroll_user`, `remove_enrollment` |\n| Discussions | `list_discussions`, `get_discussion`, `list_announcements`, `post_discussion_entry`, `create_discussion`, `update_discussion`, `delete_discussion` |\n| Modules | `list_modules`, `get_module`, `list_module_items`, `create_module`, `update_module`, `create_module_item` |\n| Pages | `list_pages`, `get_page`, `create_page`, `update_page`, `delete_page` |\n| Calendar | `list_calendar_events`, `create_calendar_event`, `update_calendar_event` |\n| Conversations | `list_conversations`, `get_conversation`, `get_conversation_unread_count`, `send_conversation` |\n| Peer Reviews | `list_peer_reviews`, `get_submission_peer_reviews`, `create_peer_review`, `delete_peer_review` |\n| Accounts | `get_account`, `list_accounts`, `list_sub_accounts`, `list_account_courses`, `list_account_users`, `get_account_reports` |\n| Analytics | `search_course_content`, `get_course_analytics`, `get_student_analytics`, `get_course_activity_stream` |\n| Student | `get_my_courses`, `get_my_grades`, `get_my_submissions`, `get_my_upcoming_assignments` |\n| Dashboard | `get_dashboard_cards`, `get_todo_items`, `get_upcoming_events`, `get_missing_submissions` |\n\n60 tools are read-only and 28 tools perform Canvas write operations.\n\nAll write tools require appropriate Canvas permissions. Canvas enforces its own permission model -- the MCP server does not bypass it.\n\n### MCP Resources (2)\n\n| Resource | URI Template | Type |\n|----------|-------------|------|\n| Course Syllabus | `canvas://course/{courseId}/syllabus` | text/html |\n| Assignment Description | `canvas://course/{courseId}/assignment/{assignmentId}/description` | text/html |\n\n## Deployment Modes\n\n### stdio (Default)\n\nFor local AI clients like Claude Desktop, Cursor, and VS Code. The server communicates over stdin/stdout.\n\n```bash\nnpx @bruchris/canvas-lms-mcp --token $CANVAS_API_TOKEN --base-url $CANVAS_BASE_URL\n```\n\n### HTTP\n\nFor web-based clients or hosted services. Starts an HTTP server with Streamable HTTP transport.\n\n```bash\nnpx @bruchris/canvas-lms-mcp serve \\\n  --token $CANVAS_API_TOKEN \\\n  --base-url $CANVAS_BASE_URL \\\n  --port 3001 \\\n  --allowed-origin https://your-app.example.com\n```\n\nEndpoints:\n- `POST /mcp` -- MCP protocol endpoint\n- `GET /health` -- Health check (returns `{\"status\":\"ok\"}`)\n\n### Docker\n\n```bash\ndocker compose up -d\n```\n\nRequires `CANVAS_API_TOKEN` and `CANVAS_BASE_URL` environment variables. See `docker-compose.yml`.\n\n```yaml\nservices:\n  canvas-lms-mcp:\n    build: .\n    ports:\n      - \"3001:3001\"\n    environment:\n      - CANVAS_API_TOKEN=${CANVAS_API_TOKEN}\n      - CANVAS_BASE_URL=${CANVAS_BASE_URL}\n```\n\n### Library Import\n\nUse the server factory directly in your own Node.js application:\n\n```typescript\nimport { createCanvasMCPServer } from '@bruchris/canvas-lms-mcp'\n\nconst { server, canvas } = createCanvasMCPServer({\n  token: userToken,\n  baseUrl: canvasBaseUrl,\n})\n```\n\nOr use the Canvas client standalone (no MCP dependency):\n\n```typescript\nimport { CanvasClient } from '@bruchris/canvas-lms-mcp/canvas'\n\nconst canvas = new CanvasClient({\n  token: userToken,\n  baseUrl: canvasBaseUrl,\n})\n\nconst courses = await canvas.courses.list()\n```\n\n## CLI Reference\n\n| Flag | Env Variable | Default | Description |\n|------|-------------|---------|-------------|\n| `--token` | `CANVAS_API_TOKEN` | (required) | Canvas personal access token |\n| `--base-url` | `CANVAS_BASE_URL` | (required) | Canvas instance URL |\n| `serve` | -- | stdio mode | Switch to HTTP mode |\n| `--port` | -- | `3001` | HTTP server port |\n| `--allowed-origin` | `CANVAS_ALLOWED_ORIGIN` | `http://localhost:3000` | CORS allowed origin |\n\n## Environment Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `CANVAS_API_TOKEN` | Yes | Canvas personal access token |\n| `CANVAS_BASE_URL` | Yes | Canvas instance URL (e.g., `https://school.instructure.com`) |\n| `CANVAS_ALLOWED_ORIGIN` | No | CORS origin for HTTP mode (default: `http://localhost:3000`) |\n\n\n## Development\n\n```bash\npnpm install       # Install dependencies\npnpm dev           # Watch mode build\npnpm build         # Production build\npnpm test          # Run tests (294 tests)\npnpm lint          # ESLint + Prettier check\npnpm lint:fix      # Auto-fix lint issues\npnpm typecheck     # TypeScript strict type check\n```\n\n### Dependency audit\n\nThe `pnpm.overrides.hono` entry pins `hono` to `4.12.14` because\n`@modelcontextprotocol/sdk@1.29.0` allows vulnerable `hono <4.12.14`\nversions. Remove the override when the MCP SDK publishes a release that\ndepends on a patched `hono` range.\n\n### Architecture\n\n```\nsrc/canvas/       Standalone Canvas REST API client (pure fetch, no MCP dependency)\nsrc/tools/        MCP tool definitions with Zod input schemas\nsrc/resources/    MCP resource templates (syllabus, assignment description)\nsrc/server.ts     Factory: createCanvasMCPServer(config)\nsrc/stdio.ts      stdio transport entry point\nsrc/http.ts       HTTP transport entry point\nsrc/cli.ts        CLI argument parser\n```\n\n### Contributing\n\n1. Fork the repo\n2. Create a feature branch (`git checkout -b feat/my-feature`)\n3. Use conventional commits (`feat:`, `fix:`, `chore:`, `test:`, `docs:`)\n4. Ensure `pnpm lint && pnpm typecheck && pnpm test` pass\n5. Open a pull request\n\n## Guides\n\n- [Getting Started](docs/getting-started.md) -- Step-by-step setup for non-developers: token, config, first query, troubleshooting\n- [Student Guide](docs/student-guide.md) -- Token setup, AI client configuration, 10 example prompts\n- [Educator Guide](docs/educator-guide.md) -- Grading workflows, write operations, privacy considerations\n- [Integration Guide](docs/integration-guide.md) -- Three integration patterns with code examples\n\n## License\n\nMIT\n","readmeFilename":"README.md"}