{"id":"4d3c4bfa-6c24-4c4f-8f21-8c831f653e95","entityType":"agent","slug":"clawhub-chrischall-canvas-parent","name":"canvas-parent","canonicalUrl":"https://www.xpersona.co/agent/clawhub-chrischall-canvas-parent","canonicalPath":"/agent/clawhub-chrischall-canvas-parent","generatedAt":"2026-10-10T10:43:56.911Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T05:40:19.107Z","emptyReason":null},"description":"This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announcements, planner items, or files in Canvas. Skill: canvas-parent Owner: chrischall Summary: This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announce","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.6K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:canvas-parent","sourceUrl":"https://clawhub.ai/chrischall/canvas-parent","homepage":"https://clawhub.ai/chrischall/skills/canvas-parent","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/chrischall/canvas-parent","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/chrischall/skills/canvas-parent","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":64,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\","},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:40:19.107Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:40:19.107Z","emptyReason":null},"stars":null,"forks":null,"downloads":1646,"packageName":null,"latestVersion":"2.1.9","tractionLabel":"1.6K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:40:19.107Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T05:40:19.107Z","lastCrawledAt":"2026-10-10T05:40:19.107Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T05:40:19.107Z","lastVerifiedAt":null,"highlights":[{"version":"2.1.9","createdAt":"2026-10-09T23:23:48.426Z","changelog":"- Updated documentation in SKILL.md to clarify how the ContextMint Bridge extension maintains and refreshes Canvas sessions. - Revised authentication section to explain session renewal requires the extension to remain installed and the browser to stay running. - Removed unnecessary skill-card.md file.","fileCount":3,"zipByteSize":4996},{"version":"2.1.8","createdAt":"2026-10-07T13:39:31.864Z","changelog":"- Removed the sample file: skill-card.md. - No functional or user-facing changes. - Maintenance update to clean up unused documentation files.","fileCount":3,"zipByteSize":4972},{"version":"2.1.7","createdAt":"2026-10-05T02:52:02.754Z","changelog":"- Removed the file skill-card.md. - No changes to functionality or documentation other than the file removal.","fileCount":3,"zipByteSize":4950},{"version":"2.1.6","createdAt":"2026-10-03T01:41:00.613Z","changelog":"- Removed the file skill-card.md. - No user-facing features or behavioral changes. - Version bump for documentation/file cleanup only.","fileCount":3,"zipByteSize":5015},{"version":"2.1.5","createdAt":"2026-09-28T13:58:52.447Z","changelog":"- Updated setup and authentication instructions to reference the newly renamed ContextMint Bridge browser extension, replacing all references to fetchproxy. - Clarified the fetchproxy fallback flow, linking to the new extension’s repository and providing verification/build instructions. - Removed skill-card.md file. - No changes to functionality or tools; documentation and guidance only.","fileCount":3,"zipByteSize":4957},{"version":"2.1.4","createdAt":"2026-09-25T15:51:22.033Z","changelog":"- Removed the file: skill-card.md. - No changes to core functionality or documentation in SKILL.md.","fileCount":3,"zipByteSize":4796},{"version":"2.1.3","createdAt":"2026-09-23T21:42:13.380Z","changelog":"- Updated documentation to clarify usage of the canvas_download_file tool, specifying requirements for url and destinationPath. - Removed the file skill-card.md.","fileCount":3,"zipByteSize":5020},{"version":"2.1.2","createdAt":"2026-09-23T15:44:24.180Z","changelog":"- Removed the sample file skill-card.md. - No changes to core skill functionality or documentation.","fileCount":3,"zipByteSize":4917}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:canvas-parent","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-canvas-parent/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-canvas-parent/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-canvas-parent/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-canvas-parent/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-canvas-parent/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-canvas-parent/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T10:43:56.907Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-canvas-parent/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-canvas-parent/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-canvas-parent/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-canvas-parent/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T05:40:19.107Z","emptyReason":null},"readme":"Skill: canvas-parent\n\nOwner: chrischall\n\nSummary: This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announcements, planner items, or files in Canvas.\n\nTags: latest:2.1.9\n\nVersion history:\n\nv2.1.9 | 2026-10-09T23:23:48.426Z | auto\n\n- Updated documentation in SKILL.md to clarify how the ContextMint Bridge extension maintains and refreshes Canvas sessions.\n- Revised authentication section to explain session renewal requires the extension to remain installed and the browser to stay running.\n- Removed unnecessary skill-card.md file.\n\nv2.1.8 | 2026-10-07T13:39:31.864Z | auto\n\n- Removed the sample file: skill-card.md.\n- No functional or user-facing changes.\n- Maintenance update to clean up unused documentation files.\n\nv2.1.7 | 2026-10-05T02:52:02.754Z | auto\n\n- Removed the file skill-card.md.\n- No changes to functionality or documentation other than the file removal.\n\nv2.1.6 | 2026-10-03T01:41:00.613Z | auto\n\n- Removed the file skill-card.md.\n- No user-facing features or behavioral changes.\n- Version bump for documentation/file cleanup only.\n\nv2.1.5 | 2026-09-28T13:58:52.447Z | auto\n\n- Updated setup and authentication instructions to reference the newly renamed ContextMint Bridge browser extension, replacing all references to fetchproxy.\n- Clarified the fetchproxy fallback flow, linking to the new extension’s repository and providing verification/build instructions.\n- Removed skill-card.md file.\n- No changes to functionality or tools; documentation and guidance only.\n\nv2.1.4 | 2026-09-25T15:51:22.033Z | auto\n\n- Removed the file: skill-card.md.\n- No changes to core functionality or documentation in SKILL.md.\n\nv2.1.3 | 2026-09-23T21:42:13.380Z | auto\n\n- Updated documentation to clarify usage of the canvas_download_file tool, specifying requirements for url and destinationPath.\n- Removed the file skill-card.md.\n\nv2.1.2 | 2026-09-23T15:44:24.180Z | auto\n\n- Removed the sample file skill-card.md.\n- No changes to core skill functionality or documentation.\n\nv2.1.1 | 2026-09-21T04:16:50.489Z | auto\n\n- Removed the sample file skill-card.md.\n- No other functional or documentation changes.\n\nv2.1.0 | 2026-09-20T02:52:27.833Z | auto\n\n- Removed the sample file skill-card.md.\n- No changes to tool functionality or documentation.\n- This update cleans up unused files from the project.\n\nv2.0.0 | 2026-09-17T23:35:52.830Z | auto\n\n- Breaking change: Removed the file skill-card.md.\n- No changes to functionality or configuration.\n- Documentation and usage details remain unchanged.\n\nv1.5.6 | 2026-09-15T19:24:36.370Z | auto\n\n- Removed the file skill-card.md.  \n- No changes to features or functionality.  \n- Documentation and setup remain unchanged.\n\nv1.5.5 | 2026-09-14T14:09:41.020Z | auto\n\n- Removed the file skill-card.md.\n- No changes to skill functionality or usage.\n- Documentation and setup instructions remain unchanged.\n\nv1.5.4 | 2026-09-10T17:49:33.294Z | auto\n\n- Removed sample documentation file `skill-card.md`.\n- No changes to functionality or configuration.\n- Documentation and usage remain unchanged.\n\nv1.5.3 | 2026-09-05T00:50:57.630Z | auto\n\n- Added detailed documentation for the new view parameter (`\"compact\"` or `\"full\"`) on nine tools, describing avatar/media stripping and default behavior.\n- Updated SKILL.md to show which tools accept the view parameter and clarified their input/output.\n- Explained the fields and payload details affected by view, including which link fields remain unstripped.\n- Removed the obsolete skill-card.md file.\n\nv1.5.2 | 2026-09-04T22:19:49.403Z | auto\n\n- Removed the file: skill-card.md.\n- No other changes to the skill’s functionality or documentation.\n\nv1.5.1 | 2026-09-02T20:38:12.498Z | auto\n\n- Removed the documentation file skill-card.md.\n- No functional or feature changes to the skill itself.\n\nv1.5.0 | 2026-08-31T00:22:34.614Z | auto\n\n- Added `canvas_healthcheck` tool to report authentication status and resolution path.\n- `canvas_healthcheck` is available even when authentication is unconfigured, making diagnosis easier.\n- Removed legacy `skill-card.md` file.\n\nv1.4.0 | 2026-08-29T13:54:28.287Z | auto\n\n- Removed the skill-card.md file.\n- No user-facing changes to skill functionality or setup.\n- Documentation and tool list remain unchanged.\n\nv1.3.1 | 2026-08-28T21:07:06.939Z | auto\n\n- Removed the sample file skill-card.md from the project.\n- No changes to functionality or configuration—this is a cleanup release.\n\nv1.3.0 | 2026-08-28T11:34:17.113Z | auto\n\n- Renamed skill from canvas-parent-mcp to canvas-parent.\n- Removed the file skill-card.md.\n- Updated SKILL.md with the new skill name throughout.\n- No other functional or configuration changes noted.\n\nv1.2.5 | 2026-08-06T00:42:57.309Z | auto\n\n- Removed the skill-card.md file.\n- No changes to functionality or documented setup/integration.\n\nv1.2.4 | 2026-08-03T05:27:29.846Z | auto\n\n- Removed the file skill-card.md.\n- No changes to functionality or documentation within SKILL.md.\n\nv1.2.3 | 2026-08-03T04:33:49.522Z | auto\n\n- Removed the file skill-card.md from the project.\n- No user-facing feature or documentation changes.\n\nv1.2.2 | 2026-07-30T12:53:56.761Z | auto\n\n- Updated skill description for clarity and improved trigger phrase coverage.\n- Expanded and clarified instructions for authentication options, especially around fetchproxy browser extension usage.\n- Added detailed tool listing with clear explanations of each function.\n- Documented precedence order for authentication modes and noted configuration environment variables.\n- Improved observer/parent-specific usage notes, including support for linked student accounts.\n\nArchive index:\n\nArchive v2.1.9: 3 files, 4996 bytes\n\nFiles: skill-card.md (1923b), SKILL.md (8278b), _meta.json (132b)\n\nFile v2.1.9:SKILL.md\n\n---\nname: canvas-parent\ndescription: This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announcements, planner items, or files in Canvas.\n---\n\n# canvas-parent-mcp\n\nMCP server for Canvas LMS (Instructure) — read courses, grades, assignments, announcements, planner items, and conversations; download course files. Mirrors the parent/observer scope of the sibling `infinitecampus-mcp`.\n\n- **npm:** [npmjs.com/package/canvas-parent-mcp](https://www.npmjs.com/package/canvas-parent-mcp)\n- **Source:** [github.com/chrischall/canvas-parent-mcp](https://github.com/chrischall/canvas-parent-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"canvas\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"canvas-parent-mcp\"],\n      \"env\": {\n        \"CANVAS_BASE_URL\": \"https://cms.instructure.com\"\n      }\n    }\n  }\n}\n```\n\nWith the [ContextMint Bridge](https://github.com/nullnet-app/contextmint-bridge/releases) browser extension installed and a signed-in Canvas tab, that's enough — the MCP reads your session cookies from the browser on the first request and again whenever the session expires, so keep the extension installed and the browser running. Add `CANVAS_TOKEN`, `CANVAS_CLIENT_*`/`CANVAS_REFRESH_TOKEN`, or `CANVAS_USERNAME`/`CANVAS_PASSWORD` to the `env` block if you'd rather use one of those modes.\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/canvas-parent-mcp\ncd canvas-parent-mcp\nnpm install && npm run build\n```\n\n## Authentication\n\n**fetchproxy fallback (recommended, zero-config).** Set only `CANVAS_BASE_URL`. Install the [ContextMint Bridge](https://github.com/nullnet-app/contextmint-bridge/releases) browser extension, sign into your Canvas instance once. The MCP reads `canvas_session` + `pseudonym_credentials` cookies from your tab on the first request and re-reads them on every 401; API calls go directly from Node in between, but the extension must stay reachable to renew the session. Works with any auth flow (SSO/SAML/2FA included). It's the fetchproxy extension under its new name, same maintainer ([fetchproxy's README](https://github.com/chrischall/fetchproxy#extension) points to it); verify a release zip with `shasum -a 256 -c <zip>.sha256` or build it from [source](https://github.com/nullnet-app/contextmint-bridge).\n\n### Alternatives (env-var)\n\n- **Personal access token** — set `CANVAS_TOKEN`. Most institutions have disabled this for non-admins.\n- **OAuth** — set `CANVAS_CLIENT_ID`, `CANVAS_CLIENT_SECRET`, `CANVAS_REFRESH_TOKEN`. Bootstrap via `canvas-parent-mcp-qr-login`.\n- **Username/password (session-scrape)** — set `CANVAS_USERNAME` + `CANVAS_PASSWORD`. Direct Canvas accounts only (no SSO/2FA). Brittle.\n\nPrecedence when multiple are set: `CANVAS_TOKEN` > username/password > OAuth > fetchproxy. Set `CANVAS_DISABLE_FETCHPROXY=1` to opt out of the fallback.\n\n## Tools (prefix `canvas_`)\n\n### Profile & observees\n- `canvas_get_profile` — your Canvas profile\n- `canvas_healthcheck` — which auth path resolved and whether Canvas accepts it; registered even when auth is unconfigured, so it can say why\n- `canvas_list_observees` — students linked to your observer account\n\n### Courses\n- `canvas_list_courses` — your active courses with grades\n- `canvas_get_course(courseId, view?)` — course detail with syllabus + teachers\n\n### Assignments & submissions\n- `canvas_list_assignments(courseId)` — assignments in a course\n- `canvas_list_missing_submissions` — past-due unsubmitted work\n- `canvas_get_submission(courseId, assignmentId, view?)` — your submission with comments + rubric\n- `canvas_list_recent_submissions(courseId, view?)` — recently graded submissions (default 14d)\n\n### Grades\n- `canvas_list_enrollments` — per-course grades\n\n### Calendar & planner\n- `canvas_list_calendar_events` — calendar events / assignments\n- `canvas_list_upcoming_events` — server-curated next 7 days\n- `canvas_list_planner_items` — unified to-do feed\n\n### Communication\n- `canvas_list_announcements(contextCodes, view?)` — course announcements\n- `canvas_list_conversations` — inbox\n- `canvas_get_conversation(id, view?)` — full conversation thread\n- `canvas_list_discussion_topics(courseId, view?)` — course discussion topics\n\n### Files\n- `canvas_list_course_files(courseId)` — file metadata\n- `canvas_download_file(url, destinationPath)` — download a file to disk. `url` must be a `/files/` URL on the configured Canvas host; `destinationPath` must be inside `CANVAS_OUTPUT_DIR` (default `~/Downloads`), and a relative path is resolved against it\n\n## Response shape (`view`)\n\nNine tools take `view: \"compact\" | \"full\"`, and **`compact` is the default** —\nyou get the slim shape without asking for it:\n\n`canvas_get_profile`, `canvas_list_observees`, `canvas_get_course`,\n`canvas_get_submission`, `canvas_list_recent_submissions`,\n`canvas_list_announcements`, `canvas_list_conversations`,\n`canvas_get_conversation`, `canvas_list_discussion_topics`.\n\n**Compact here is media stripping, not a field projection — do not expect a\nfield list.** It removes the avatar URLs Canvas hangs on user objects\n(`avatar_url`, `avatar_image_url`) and nothing else. This server hands back\nCanvas's payload verbatim and holds no verified record of which of Canvas's\nfields a caller needs, so it does not claim to keep some and drop others: a\nrecord that came back with holes in it would read exactly like a verified\nanswer. Stripping is subtractive, so it cannot lose a field nobody knew about.\nA conversation participant keeps their name and id on compact; they lose their\npicture.\n\n- **The link fields survive both rungs, named explicitly.** `url`, `html_url`\n  and `preview_url` are kept by name — `html_url` opens the item in Canvas,\n  `preview_url` renders a submission, and `url` is the download handle\n  `canvas_list_course_files` emits and `canvas_download_file` consumes. On an\n  `online_url` submission that `url` IS the student's submitted work. Without\n  the name, a student who submitted a link ending in `.png` would have had\n  their submission silently removed on the default rung.\n- **Both avatar spellings really do appear.** One live\n  `canvas_list_conversations` response carried a default avatar\n  (`…/avatar-50.png`) on one participant and an uploaded, extension-less\n  thumbnail id on another. They are dropped by NAME, so both go — not one kept\n  and one lost depending on whether that person ever uploaded a photo.\n\nPass `view: \"full\"` when you want Canvas's payload untouched, avatars and all.\nThat is also why there is deliberately **no `raw` rung**: there is no\nnormalisation layer here for `full` to sit above, so `full` already IS the\nuntouched upstream payload and a third value would silently alias it.\n\nThe other ten tools take no `view`, for two different reasons:\n\n- **Nothing to strip.** `canvas_list_courses`, `canvas_list_assignments`,\n  `canvas_list_missing_submissions`, `canvas_list_enrollments`,\n  `canvas_list_calendar_events`, `canvas_list_upcoming_events` and\n  `canvas_list_planner_items` embed no user object — a live\n  `canvas_list_courses` over twelve courses carried no media field of any kind\n  — and a knob that does not turn is worse than no knob. `canvas_healthcheck`\n  returns a verdict, not a record.\n- **The URL is the product.** `canvas_list_course_files` and\n  `canvas_download_file` exist to hand you a file URL. Compact there would not\n  shrink the response, it would empty it.\n\nPassing `view` to one of those ten is not an error and not a warning: MCP tool\nschemas are non-strict, so the key is dropped and you get that tool's ordinary\noutput.\n\n## Notes\n\n- Set `CANVAS_NAME` if you want a friendly label other than the host portion of the base URL.\n- All read tools that target a user accept an optional `observeeId` parameter (defaults to `self`) — useful when an observer is checking on a linked student.\n\nFile v2.1.9:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"canvas-parent\",\n  \"version\": \"2.1.9\",\n  \"publishedAt\": 1791588228426\n}\n\nFile v2.1.9:skill-card.md\n\n## Description:\n\nHelps users check courses, grades, assignments, messages, and files in their own or an observed student's Canvas account.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nStudents and parents or other observers use this skill to review Canvas coursework, grades, deadlines, announcements, conversations, and course files for accounts they can access.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Canvas tokens, passwords, or browser session cookies may expose private account records.\n\nMitigation: Use the least-privilege authentication available, protect credentials like passwords, and disable the browser-cookie fallback if live session cookies should not be used.\n\nRisk: Downloaded course files and Canvas responses may contain confidential student information.\n\nMitigation: Limit access to authorized accounts and handle downloaded files and responses as confidential student data.\n\n## Reference(s):\n\n- [Canvas Parent on ClawHub](https://clawhub.ai/chrischall/skills/canvas-parent)\n- [Canvas Parent MCP package](https://www.npmjs.com/package/canvas-parent-mcp)\n- [ContextMint Bridge releases](https://github.com/nullnet-app/contextmint-bridge/releases)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Guidance]\n\n**Output Format:** [Markdown or plain text]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include confidential Canvas student records and links to course files.]\n\n## Skill Version(s):\n\n2.1.9 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v2.1.8: 3 files, 4972 bytes\n\nFiles: skill-card.md (2000b), SKILL.md (8058b), _meta.json (132b)\n\nFile v2.1.8:SKILL.md\n\n---\nname: canvas-parent\ndescription: This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announcements, planner items, or files in Canvas.\n---\n\n# canvas-parent-mcp\n\nMCP server for Canvas LMS (Instructure) — read courses, grades, assignments, announcements, planner items, and conversations; download course files. Mirrors the parent/observer scope of the sibling `infinitecampus-mcp`.\n\n- **npm:** [npmjs.com/package/canvas-parent-mcp](https://www.npmjs.com/package/canvas-parent-mcp)\n- **Source:** [github.com/chrischall/canvas-parent-mcp](https://github.com/chrischall/canvas-parent-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"canvas\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"canvas-parent-mcp\"],\n      \"env\": {\n        \"CANVAS_BASE_URL\": \"https://cms.instructure.com\"\n      }\n    }\n  }\n}\n```\n\nWith the [ContextMint Bridge](https://github.com/nullnet-app/contextmint-bridge/releases) browser extension installed and a signed-in Canvas tab, that's enough — the MCP reads your session cookies at startup. Add `CANVAS_TOKEN`, `CANVAS_CLIENT_*`/`CANVAS_REFRESH_TOKEN`, or `CANVAS_USERNAME`/`CANVAS_PASSWORD` to the `env` block if you'd rather use one of those modes.\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/canvas-parent-mcp\ncd canvas-parent-mcp\nnpm install && npm run build\n```\n\n## Authentication\n\n**fetchproxy fallback (recommended, zero-config).** Set only `CANVAS_BASE_URL`. Install the [ContextMint Bridge](https://github.com/nullnet-app/contextmint-bridge/releases) browser extension, sign into your Canvas instance once. The MCP reads `canvas_session` + `pseudonym_credentials` cookies from your tab at startup; all API calls go directly from Node after that. Works with any auth flow (SSO/SAML/2FA included). It's the fetchproxy extension under its new name, same maintainer ([fetchproxy's README](https://github.com/chrischall/fetchproxy#extension) points to it); verify a release zip with `shasum -a 256 -c <zip>.sha256` or build it from [source](https://github.com/nullnet-app/contextmint-bridge).\n\n### Alternatives (env-var)\n\n- **Personal access token** — set `CANVAS_TOKEN`. Most institutions have disabled this for non-admins.\n- **OAuth** — set `CANVAS_CLIENT_ID`, `CANVAS_CLIENT_SECRET`, `CANVAS_REFRESH_TOKEN`. Bootstrap via `canvas-parent-mcp-qr-login`.\n- **Username/password (session-scrape)** — set `CANVAS_USERNAME` + `CANVAS_PASSWORD`. Direct Canvas accounts only (no SSO/2FA). Brittle.\n\nPrecedence when multiple are set: `CANVAS_TOKEN` > username/password > OAuth > fetchproxy. Set `CANVAS_DISABLE_FETCHPROXY=1` to opt out of the fallback.\n\n## Tools (prefix `canvas_`)\n\n### Profile & observees\n- `canvas_get_profile` — your Canvas profile\n- `canvas_healthcheck` — which auth path resolved and whether Canvas accepts it; registered even when auth is unconfigured, so it can say why\n- `canvas_list_observees` — students linked to your observer account\n\n### Courses\n- `canvas_list_courses` — your active courses with grades\n- `canvas_get_course(courseId, view?)` — course detail with syllabus + teachers\n\n### Assignments & submissions\n- `canvas_list_assignments(courseId)` — assignments in a course\n- `canvas_list_missing_submissions` — past-due unsubmitted work\n- `canvas_get_submission(courseId, assignmentId, view?)` — your submission with comments + rubric\n- `canvas_list_recent_submissions(courseId, view?)` — recently graded submissions (default 14d)\n\n### Grades\n- `canvas_list_enrollments` — per-course grades\n\n### Calendar & planner\n- `canvas_list_calendar_events` — calendar events / assignments\n- `canvas_list_upcoming_events` — server-curated next 7 days\n- `canvas_list_planner_items` — unified to-do feed\n\n### Communication\n- `canvas_list_announcements(contextCodes, view?)` — course announcements\n- `canvas_list_conversations` — inbox\n- `canvas_get_conversation(id, view?)` — full conversation thread\n- `canvas_list_discussion_topics(courseId, view?)` — course discussion topics\n\n### Files\n- `canvas_list_course_files(courseId)` — file metadata\n- `canvas_download_file(url, destinationPath)` — download a file to disk. `url` must be a `/files/` URL on the configured Canvas host; `destinationPath` must be inside `CANVAS_OUTPUT_DIR` (default `~/Downloads`), and a relative path is resolved against it\n\n## Response shape (`view`)\n\nNine tools take `view: \"compact\" | \"full\"`, and **`compact` is the default** —\nyou get the slim shape without asking for it:\n\n`canvas_get_profile`, `canvas_list_observees`, `canvas_get_course`,\n`canvas_get_submission`, `canvas_list_recent_submissions`,\n`canvas_list_announcements`, `canvas_list_conversations`,\n`canvas_get_conversation`, `canvas_list_discussion_topics`.\n\n**Compact here is media stripping, not a field projection — do not expect a\nfield list.** It removes the avatar URLs Canvas hangs on user objects\n(`avatar_url`, `avatar_image_url`) and nothing else. This server hands back\nCanvas's payload verbatim and holds no verified record of which of Canvas's\nfields a caller needs, so it does not claim to keep some and drop others: a\nrecord that came back with holes in it would read exactly like a verified\nanswer. Stripping is subtractive, so it cannot lose a field nobody knew about.\nA conversation participant keeps their name and id on compact; they lose their\npicture.\n\n- **The link fields survive both rungs, named explicitly.** `url`, `html_url`\n  and `preview_url` are kept by name — `html_url` opens the item in Canvas,\n  `preview_url` renders a submission, and `url` is the download handle\n  `canvas_list_course_files` emits and `canvas_download_file` consumes. On an\n  `online_url` submission that `url` IS the student's submitted work. Without\n  the name, a student who submitted a link ending in `.png` would have had\n  their submission silently removed on the default rung.\n- **Both avatar spellings really do appear.** One live\n  `canvas_list_conversations` response carried a default avatar\n  (`…/avatar-50.png`) on one participant and an uploaded, extension-less\n  thumbnail id on another. They are dropped by NAME, so both go — not one kept\n  and one lost depending on whether that person ever uploaded a photo.\n\nPass `view: \"full\"` when you want Canvas's payload untouched, avatars and all.\nThat is also why there is deliberately **no `raw` rung**: there is no\nnormalisation layer here for `full` to sit above, so `full` already IS the\nuntouched upstream payload and a third value would silently alias it.\n\nThe other ten tools take no `view`, for two different reasons:\n\n- **Nothing to strip.** `canvas_list_courses`, `canvas_list_assignments`,\n  `canvas_list_missing_submissions`, `canvas_list_enrollments`,\n  `canvas_list_calendar_events`, `canvas_list_upcoming_events` and\n  `canvas_list_planner_items` embed no user object — a live\n  `canvas_list_courses` over twelve courses carried no media field of any kind\n  — and a knob that does not turn is worse than no knob. `canvas_healthcheck`\n  returns a verdict, not a record.\n- **The URL is the product.** `canvas_list_course_files` and\n  `canvas_download_file` exist to hand you a file URL. Compact there would not\n  shrink the response, it would empty it.\n\nPassing `view` to one of those ten is not an error and not a warning: MCP tool\nschemas are non-strict, so the key is dropped and you get that tool's ordinary\noutput.\n\n## Notes\n\n- Set `CANVAS_NAME` if you want a friendly label other than the host portion of the base URL.\n- All read tools that target a user accept an optional `observeeId` parameter (defaults to `self`) — useful when an observer is checking on a linked student.\n\nFile v2.1.8:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"canvas-parent\",\n  \"version\": \"2.1.8\",\n  \"publishedAt\": 1791380371864\n}\n\nFile v2.1.8:skill-card.md\n\n## Description:\n\nHelps users check their own or linked students' Canvas courses, grades, assignments, announcements, messages, and files.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nStudents and parents or observers use this skill to review Canvas coursework, grades, due dates, school communications, and course files for accounts they are authorized to access.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Canvas access can expose sensitive student grades, messages, and other educational records.\n\nMitigation: Access only authorized accounts, share only necessary details, and confirm ambiguous school-related requests before retrieving records.\n\nRisk: Authentication may expose session cookies or credentials to untrusted software.\n\nMitigation: Install only if you trust the npm package and browser extension maintainers; prefer the least-sensitive authentication method and avoid username/password mode when possible.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/chrischall/skills/canvas-parent)\n- [canvas-parent-mcp npm package](https://www.npmjs.com/package/canvas-parent-mcp)\n- [ContextMint Bridge extension releases](https://github.com/nullnet-app/contextmint-bridge/releases)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Files]\n\n**Output Format:** [Markdown responses about Canvas records; downloaded course files when requested]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Compact records by default; full records available on request.]\n\n## Skill Version(s):\n\n2.1.8 (source: ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v2.1.7: 3 files, 4950 bytes\n\nFiles: skill-card.md (2014b), SKILL.md (8058b), _meta.json (132b)\n\nFile v2.1.7:SKILL.md\n\n---\nname: canvas-parent\ndescription: This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announcements, planner items, or files in Canvas.\n---\n\n# canvas-parent-mcp\n\nMCP server for Canvas LMS (Instructure) — read courses, grades, assignments, announcements, planner items, and conversations; download course files. Mirrors the parent/observer scope of the sibling `infinitecampus-mcp`.\n\n- **npm:** [npmjs.com/package/canvas-parent-mcp](https://www.npmjs.com/package/canvas-parent-mcp)\n- **Source:** [github.com/chrischall/canvas-parent-mcp](https://github.com/chrischall/canvas-parent-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"canvas\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"canvas-parent-mcp\"],\n      \"env\": {\n        \"CANVAS_BASE_URL\": \"https://cms.instructure.com\"\n      }\n    }\n  }\n}\n```\n\nWith the [ContextMint Bridge](https://github.com/nullnet-app/contextmint-bridge/releases) browser extension installed and a signed-in Canvas tab, that's enough — the MCP reads your session cookies at startup. Add `CANVAS_TOKEN`, `CANVAS_CLIENT_*`/`CANVAS_REFRESH_TOKEN`, or `CANVAS_USERNAME`/`CANVAS_PASSWORD` to the `env` block if you'd rather use one of those modes.\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/canvas-parent-mcp\ncd canvas-parent-mcp\nnpm install && npm run build\n```\n\n## Authentication\n\n**fetchproxy fallback (recommended, zero-config).** Set only `CANVAS_BASE_URL`. Install the [ContextMint Bridge](https://github.com/nullnet-app/contextmint-bridge/releases) browser extension, sign into your Canvas instance once. The MCP reads `canvas_session` + `pseudonym_credentials` cookies from your tab at startup; all API calls go directly from Node after that. Works with any auth flow (SSO/SAML/2FA included). It's the fetchproxy extension under its new name, same maintainer ([fetchproxy's README](https://github.com/chrischall/fetchproxy#extension) points to it); verify a release zip with `shasum -a 256 -c <zip>.sha256` or build it from [source](https://github.com/nullnet-app/contextmint-bridge).\n\n### Alternatives (env-var)\n\n- **Personal access token** — set `CANVAS_TOKEN`. Most institutions have disabled this for non-admins.\n- **OAuth** — set `CANVAS_CLIENT_ID`, `CANVAS_CLIENT_SECRET`, `CANVAS_REFRESH_TOKEN`. Bootstrap via `canvas-parent-mcp-qr-login`.\n- **Username/password (session-scrape)** — set `CANVAS_USERNAME` + `CANVAS_PASSWORD`. Direct Canvas accounts only (no SSO/2FA). Brittle.\n\nPrecedence when multiple are set: `CANVAS_TOKEN` > username/password > OAuth > fetchproxy. Set `CANVAS_DISABLE_FETCHPROXY=1` to opt out of the fallback.\n\n## Tools (prefix `canvas_`)\n\n### Profile & observees\n- `canvas_get_profile` — your Canvas profile\n- `canvas_healthcheck` — which auth path resolved and whether Canvas accepts it; registered even when auth is unconfigured, so it can say why\n- `canvas_list_observees` — students linked to your observer account\n\n### Courses\n- `canvas_list_courses` — your active courses with grades\n- `canvas_get_course(courseId, view?)` — course detail with syllabus + teachers\n\n### Assignments & submissions\n- `canvas_list_assignments(courseId)` — assignments in a course\n- `canvas_list_missing_submissions` — past-due unsubmitted work\n- `canvas_get_submission(courseId, assignmentId, view?)` — your submission with comments + rubric\n- `canvas_list_recent_submissions(courseId, view?)` — recently graded submissions (default 14d)\n\n### Grades\n- `canvas_list_enrollments` — per-course grades\n\n### Calendar & planner\n- `canvas_list_calendar_events` — calendar events / assignments\n- `canvas_list_upcoming_events` — server-curated next 7 days\n- `canvas_list_planner_items` — unified to-do feed\n\n### Communication\n- `canvas_list_announcements(contextCodes, view?)` — course announcements\n- `canvas_list_conversations` — inbox\n- `canvas_get_conversation(id, view?)` — full conversation thread\n- `canvas_list_discussion_topics(courseId, view?)` — course discussion topics\n\n### Files\n- `canvas_list_course_files(courseId)` — file metadata\n- `canvas_download_file(url, destinationPath)` — download a file to disk. `url` must be a `/files/` URL on the configured Canvas host; `destinationPath` must be inside `CANVAS_OUTPUT_DIR` (default `~/Downloads`), and a relative path is resolved against it\n\n## Response shape (`view`)\n\nNine tools take `view: \"compact\" | \"full\"`, and **`compact` is the default** —\nyou get the slim shape without asking for it:\n\n`canvas_get_profile`, `canvas_list_observees`, `canvas_get_course`,\n`canvas_get_submission`, `canvas_list_recent_submissions`,\n`canvas_list_announcements`, `canvas_list_conversations`,\n`canvas_get_conversation`, `canvas_list_discussion_topics`.\n\n**Compact here is media stripping, not a field projection — do not expect a\nfield list.** It removes the avatar URLs Canvas hangs on user objects\n(`avatar_url`, `avatar_image_url`) and nothing else. This server hands back\nCanvas's payload verbatim and holds no verified record of which of Canvas's\nfields a caller needs, so it does not claim to keep some and drop others: a\nrecord that came back with holes in it would read exactly like a verified\nanswer. Stripping is subtractive, so it cannot lose a field nobody knew about.\nA conversation participant keeps their name and id on compact; they lose their\npicture.\n\n- **The link fields survive both rungs, named explicitly.** `url`, `html_url`\n  and `preview_url` are kept by name — `html_url` opens the item in Canvas,\n  `preview_url` renders a submission, and `url` is the download handle\n  `canvas_list_course_files` emits and `canvas_download_file` consumes. On an\n  `online_url` submission that `url` IS the student's submitted work. Without\n  the name, a student who submitted a link ending in `.png` would have had\n  their submission silently removed on the default rung.\n- **Both avatar spellings really do appear.** One live\n  `canvas_list_conversations` response carried a default avatar\n  (`…/avatar-50.png`) on one participant and an uploaded, extension-less\n  thumbnail id on another. They are dropped by NAME, so both go — not one kept\n  and one lost depending on whether that person ever uploaded a photo.\n\nPass `view: \"full\"` when you want Canvas's payload untouched, avatars and all.\nThat is also why there is deliberately **no `raw` rung**: there is no\nnormalisation layer here for `full` to sit above, so `full` already IS the\nuntouched upstream payload and a third value would silently alias it.\n\nThe other ten tools take no `view`, for two different reasons:\n\n- **Nothing to strip.** `canvas_list_courses`, `canvas_list_assignments`,\n  `canvas_list_missing_submissions`, `canvas_list_enrollments`,\n  `canvas_list_calendar_events`, `canvas_list_upcoming_events` and\n  `canvas_list_planner_items` embed no user object — a live\n  `canvas_list_courses` over twelve courses carried no media field of any kind\n  — and a knob that does not turn is worse than no knob. `canvas_healthcheck`\n  returns a verdict, not a record.\n- **The URL is the product.** `canvas_list_course_files` and\n  `canvas_download_file` exist to hand you a file URL. Compact there would not\n  shrink the response, it would empty it.\n\nPassing `view` to one of those ten is not an error and not a warning: MCP tool\nschemas are non-strict, so the key is dropped and you get that tool's ordinary\noutput.\n\n## Notes\n\n- Set `CANVAS_NAME` if you want a friendly label other than the host portion of the base URL.\n- All read tools that target a user accept an optional `observeeId` parameter (defaults to `self`) — useful when an observer is checking on a linked student.\n\nFile v2.1.7:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"canvas-parent\",\n  \"version\": \"2.1.7\",\n  \"publishedAt\": 1791168722754\n}\n\nFile v2.1.7:skill-card.md\n\n## Description:\n\nHelps students and parent observers access Canvas LMS courses, grades, assignments, messages, and files through an MCP server.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nStudents and parent observers use this skill to check Canvas courses, upcoming or missing work, grades, announcements, inbox messages, and course files for accounts they can access.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Access to sensitive school records, including observed students' grades, submissions, messages, and files.\n\nMitigation: Grant access only to accounts you are authorized to view; review the data returned before sharing it.\n\nRisk: Browser-session authentication grants access to a signed-in Canvas account.\n\nMitigation: Prefer OAuth or a scoped token if supported; review the extension and npm package source before using browser cookies.\n\n## Reference(s):\n\n- [Canvas Parent on ClawHub](https://clawhub.ai/chrischall/skills/canvas-parent)\n- [canvas-parent-mcp npm package](https://www.npmjs.com/package/canvas-parent-mcp)\n- [Canvas Parent MCP project linked in skill documentation](https://github.com/chrischall/canvas-parent-mcp)\n- [ContextMint Bridge releases](https://github.com/nullnet-app/contextmint-bridge/releases)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Files]\n\n**Output Format:** [Canvas records summarized in text or Markdown; optional course file downloads]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Selected records support compact or full views.]\n\n## Skill Version(s):\n\n2.1.7 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v2.1.6: 3 files, 5015 bytes\n\nFiles: skill-card.md (2154b), SKILL.md (8058b), _meta.json (132b)\n\nFile v2.1.6:SKILL.md\n\n---\nname: canvas-parent\ndescription: This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announcements, planner items, or files in Canvas.\n---\n\n# canvas-parent-mcp\n\nMCP server for Canvas LMS (Instructure) — read courses, grades, assignments, announcements, planner items, and conversations; download course files. Mirrors the parent/observer scope of the sibling `infinitecampus-mcp`.\n\n- **npm:** [npmjs.com/package/canvas-parent-mcp](https://www.npmjs.com/package/canvas-parent-mcp)\n- **Source:** [github.com/chrischall/canvas-parent-mcp](https://github.com/chrischall/canvas-parent-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"canvas\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"canvas-parent-mcp\"],\n      \"env\": {\n        \"CANVAS_BASE_URL\": \"https://cms.instructure.com\"\n      }\n    }\n  }\n}\n```\n\nWith the [ContextMint Bridge](https://github.com/nullnet-app/contextmint-bridge/releases) browser extension installed and a signed-in Canvas tab, that's enough — the MCP reads your session cookies at startup. Add `CANVAS_TOKEN`, `CANVAS_CLIENT_*`/`CANVAS_REFRESH_TOKEN`, or `CANVAS_USERNAME`/`CANVAS_PASSWORD` to the `env` block if you'd rather use one of those modes.\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/canvas-parent-mcp\ncd canvas-parent-mcp\nnpm install && npm run build\n```\n\n## Authentication\n\n**fetchproxy fallback (recommended, zero-config).** Set only `CANVAS_BASE_URL`. Install the [ContextMint Bridge](https://github.com/nullnet-app/contextmint-bridge/releases) browser extension, sign into your Canvas instance once. The MCP reads `canvas_session` + `pseudonym_credentials` cookies from your tab at startup; all API calls go directly from Node after that. Works with any auth flow (SSO/SAML/2FA included). It's the fetchproxy extension under its new name, same maintainer ([fetchproxy's README](https://github.com/chrischall/fetchproxy#extension) points to it); verify a release zip with `shasum -a 256 -c <zip>.sha256` or build it from [source](https://github.com/nullnet-app/contextmint-bridge).\n\n### Alternatives (env-var)\n\n- **Personal access token** — set `CANVAS_TOKEN`. Most institutions have disabled this for non-admins.\n- **OAuth** — set `CANVAS_CLIENT_ID`, `CANVAS_CLIENT_SECRET`, `CANVAS_REFRESH_TOKEN`. Bootstrap via `canvas-parent-mcp-qr-login`.\n- **Username/password (session-scrape)** — set `CANVAS_USERNAME` + `CANVAS_PASSWORD`. Direct Canvas accounts only (no SSO/2FA). Brittle.\n\nPrecedence when multiple are set: `CANVAS_TOKEN` > username/password > OAuth > fetchproxy. Set `CANVAS_DISABLE_FETCHPROXY=1` to opt out of the fallback.\n\n## Tools (prefix `canvas_`)\n\n### Profile & observees\n- `canvas_get_profile` — your Canvas profile\n- `canvas_healthcheck` — which auth path resolved and whether Canvas accepts it; registered even when auth is unconfigured, so it can say why\n- `canvas_list_observees` — students linked to your observer account\n\n### Courses\n- `canvas_list_courses` — your active courses with grades\n- `canvas_get_course(courseId, view?)` — course detail with syllabus + teachers\n\n### Assignments & submissions\n- `canvas_list_assignments(courseId)` — assignments in a course\n- `canvas_list_missing_submissions` — past-due unsubmitted work\n- `canvas_get_submission(courseId, assignmentId, view?)` — your submission with comments + rubric\n- `canvas_list_recent_submissions(courseId, view?)` — recently graded submissions (default 14d)\n\n### Grades\n- `canvas_list_enrollments` — per-course grades\n\n### Calendar & planner\n- `canvas_list_calendar_events` — calendar events / assignments\n- `canvas_list_upcoming_events` — server-curated next 7 days\n- `canvas_list_planner_items` — unified to-do feed\n\n### Communication\n- `canvas_list_announcements(contextCodes, view?)` — course announcements\n- `canvas_list_conversations` — inbox\n- `canvas_get_conversation(id, view?)` — full conversation thread\n- `canvas_list_discussion_topics(courseId, view?)` — course discussion topics\n\n### Files\n- `canvas_list_course_files(courseId)` — file metadata\n- `canvas_download_file(url, destinationPath)` — download a file to disk. `url` must be a `/files/` URL on the configured Canvas host; `destinationPath` must be inside `CANVAS_OUTPUT_DIR` (default `~/Downloads`), and a relative path is resolved against it\n\n## Response shape (`view`)\n\nNine tools take `view: \"compact\" | \"full\"`, and **`compact` is the default** —\nyou get the slim shape without asking for it:\n\n`canvas_get_profile`, `canvas_list_observees`, `canvas_get_course`,\n`canvas_get_submission`, `canvas_list_recent_submissions`,\n`canvas_list_announcements`, `canvas_list_conversations`,\n`canvas_get_conversation`, `canvas_list_discussion_topics`.\n\n**Compact here is media stripping, not a field projection — do not expect a\nfield list.** It removes the avatar URLs Canvas hangs on user objects\n(`avatar_url`, `avatar_image_url`) and nothing else. This server hands back\nCanvas's payload verbatim and holds no verified record of which of Canvas's\nfields a caller needs, so it does not claim to keep some and drop others: a\nrecord that came back with holes in it would read exactly like a verified\nanswer. Stripping is subtractive, so it cannot lose a field nobody knew about.\nA conversation participant keeps their name and id on compact; they lose their\npicture.\n\n- **The link fields survive both rungs, named explicitly.** `url`, `html_url`\n  and `preview_url` are kept by name — `html_url` opens the item in Canvas,\n  `preview_url` renders a submission, and `url` is the download handle\n  `canvas_list_course_files` emits and `canvas_download_file` consumes. On an\n  `online_url` submission that `url` IS the student's submitted work. Without\n  the name, a student who submitted a link ending in `.png` would have had\n  their submission silently removed on the default rung.\n- **Both avatar spellings really do appear.** One live\n  `canvas_list_conversations` response carried a default avatar\n  (`…/avatar-50.png`) on one participant and an uploaded, extension-less\n  thumbnail id on another. They are dropped by NAME, so both go — not one kept\n  and one lost depending on whether that person ever uploaded a photo.\n\nPass `view: \"full\"` when you want Canvas's payload untouched, avatars and all.\nThat is also why there is deliberately **no `raw` rung**: there is no\nnormalisation layer here for `full` to sit above, so `full` already IS the\nuntouched upstream payload and a third value would silently alias it.\n\nThe other ten tools take no `view`, for two different reasons:\n\n- **Nothing to strip.** `canvas_list_courses`, `canvas_list_assignments`,\n  `canvas_list_missing_submissions`, `canvas_list_enrollments`,\n  `canvas_list_calendar_events`, `canvas_list_upcoming_events` and\n  `canvas_list_planner_items` embed no user object — a live\n  `canvas_list_courses` over twelve courses carried no media field of any kind\n  — and a knob that does not turn is worse than no knob. `canvas_healthcheck`\n  returns a verdict, not a record.\n- **The URL is the product.** `canvas_list_course_files` and\n  `canvas_download_file` exist to hand you a file URL. Compact there would not\n  shrink the response, it would empty it.\n\nPassing `view` to one of those ten is not an error and not a warning: MCP tool\nschemas are non-strict, so the key is dropped and you get that tool's ordinary\noutput.\n\n## Notes\n\n- Set `CANVAS_NAME` if you want a friendly label other than the host portion of the base URL.\n- All read tools that target a user accept an optional `observeeId` parameter (defaults to `self`) — useful when an observer is checking on a linked student.\n\nFile v2.1.6:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"canvas-parent\",\n  \"version\": \"2.1.6\",\n  \"publishedAt\": 1790991660613\n}\n\nFile v2.1.6:skill-card.md\n\n## Description:\n\nHelps agents retrieve Canvas LMS courses, grades, assignments, messages, and files for a student or linked observer account.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nStudents and parents or guardians with observer access use this skill to ask an agent about Canvas coursework, grades, deadlines, announcements, inbox messages, and course files.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Access to private student records, grades, inbox messages, and course files may expose sensitive school information.\n\nMitigation: Use only with authorized accounts and limit who can access the agent's responses and downloads.\n\nRisk: The optional browser bridge can reuse Canvas session cookies for authentication.\n\nMitigation: Verify the browser extension source, prefer token or OAuth setup when feasible, and disable the cookie bridge if session reuse is not desired.\n\nRisk: Installing the package and downloading course files introduces local software and file-handling exposure.\n\nMitigation: Verify the npm package and save downloads to a dedicated output directory.\n\n## Reference(s):\n\n- [Canvas Parent skill release](https://clawhub.ai/chrischall/skills/canvas-parent)\n- [Canvas Parent MCP package](https://www.npmjs.com/package/canvas-parent-mcp)\n- [ContextMint Bridge releases](https://github.com/nullnet-app/contextmint-bridge/releases)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON, Files]\n\n**Output Format:** [Text summaries and structured Canvas responses; downloaded course files when requested]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [File downloads are confined to the configured output directory.]\n\n## Skill Version(s):\n\n2.1.6 (source: ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v2.1.5: 3 files, 4957 bytes\n\nFiles: skill-card.md (2006b), SKILL.md (8058b), _meta.json (132b)\n\nFile v2.1.5:SKILL.md\n\n---\nname: canvas-parent\ndescription: This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announcements, planner items, or files in Canvas.\n---\n\n# canvas-parent-mcp\n\nMCP server for Canvas LMS (Instructure) — read courses, grades, assignments, announcements, planner items, and conversations; download course files. Mirrors the parent/observer scope of the sibling `infinitecampus-mcp`.\n\n- **npm:** [npmjs.com/package/canvas-parent-mcp](https://www.npmjs.com/package/canvas-parent-mcp)\n- **Source:** [github.com/chrischall/canvas-parent-mcp](https://github.com/chrischall/canvas-parent-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"canvas\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"canvas-parent-mcp\"],\n      \"env\": {\n        \"CANVAS_BASE_URL\": \"https://cms.instructure.com\"\n      }\n    }\n  }\n}\n```\n\nWith the [ContextMint Bridge](https://github.com/nullnet-app/contextmint-bridge/releases) browser extension installed and a signed-in Canvas tab, that's enough — the MCP reads your session cookies at startup. Add `CANVAS_TOKEN`, `CANVAS_CLIENT_*`/`CANVAS_REFRESH_TOKEN`, or `CANVAS_USERNAME`/`CANVAS_PASSWORD` to the `env` block if you'd rather use one of those modes.\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/canvas-parent-mcp\ncd canvas-parent-mcp\nnpm install && npm run build\n```\n\n## Authentication\n\n**fetchproxy fallback (recommended, zero-config).** Set only `CANVAS_BASE_URL`. Install the [ContextMint Bridge](https://github.com/nullnet-app/contextmint-bridge/releases) browser extension, sign into your Canvas instance once. The MCP reads `canvas_session` + `pseudonym_credentials` cookies from your tab at startup; all API calls go directly from Node after that. Works with any auth flow (SSO/SAML/2FA included). It's the fetchproxy extension under its new name, same maintainer ([fetchproxy's README](https://github.com/chrischall/fetchproxy#extension) points to it); verify a release zip with `shasum -a 256 -c <zip>.sha256` or build it from [source](https://github.com/nullnet-app/contextmint-bridge).\n\n### Alternatives (env-var)\n\n- **Personal access token** — set `CANVAS_TOKEN`. Most institutions have disabled this for non-admins.\n- **OAuth** — set `CANVAS_CLIENT_ID`, `CANVAS_CLIENT_SECRET`, `CANVAS_REFRESH_TOKEN`. Bootstrap via `canvas-parent-mcp-qr-login`.\n- **Username/password (session-scrape)** — set `CANVAS_USERNAME` + `CANVAS_PASSWORD`. Direct Canvas accounts only (no SSO/2FA). Brittle.\n\nPrecedence when multiple are set: `CANVAS_TOKEN` > username/password > OAuth > fetchproxy. Set `CANVAS_DISABLE_FETCHPROXY=1` to opt out of the fallback.\n\n## Tools (prefix `canvas_`)\n\n### Profile & observees\n- `canvas_get_profile` — your Canvas profile\n- `canvas_healthcheck` — which auth path resolved and whether Canvas accepts it; registered even when auth is unconfigured, so it can say why\n- `canvas_list_observees` — students linked to your observer account\n\n### Courses\n- `canvas_list_courses` — your active courses with grades\n- `canvas_get_course(courseId, view?)` — course detail with syllabus + teachers\n\n### Assignments & submissions\n- `canvas_list_assignments(courseId)` — assignments in a course\n- `canvas_list_missing_submissions` — past-due unsubmitted work\n- `canvas_get_submission(courseId, assignmentId, view?)` — your submission with comments + rubric\n- `canvas_list_recent_submissions(courseId, view?)` — recently graded submissions (default 14d)\n\n### Grades\n- `canvas_list_enrollments` — per-course grades\n\n### Calendar & planner\n- `canvas_list_calendar_events` — calendar events / assignments\n- `canvas_list_upcoming_events` — server-curated next 7 days\n- `canvas_list_planner_items` — unified to-do feed\n\n### Communication\n- `canvas_list_announcements(contextCodes, view?)` — course announcements\n- `canvas_list_conversations` — inbox\n- `canvas_get_conversation(id, view?)` — full conversation thread\n- `canvas_list_discussion_topics(courseId, view?)` — course discussion topics\n\n### Files\n- `canvas_list_course_files(courseId)` — file metadata\n- `canvas_download_file(url, destinationPath)` — download a file to disk. `url` must be a `/files/` URL on the configured Canvas host; `destinationPath` must be inside `CANVAS_OUTPUT_DIR` (default `~/Downloads`), and a relative path is resolved against it\n\n## Response shape (`view`)\n\nNine tools take `view: \"compact\" | \"full\"`, and **`compact` is the default** —\nyou get the slim shape without asking for it:\n\n`canvas_get_profile`, `canvas_list_observees`, `canvas_get_course`,\n`canvas_get_submission`, `canvas_list_recent_submissions`,\n`canvas_list_announcements`, `canvas_list_conversations`,\n`canvas_get_conversation`, `canvas_list_discussion_topics`.\n\n**Compact here is media stripping, not a field projection — do not expect a\nfield list.** It removes the avatar URLs Canvas hangs on user objects\n(`avatar_url`, `avatar_image_url`) and nothing else. This server hands back\nCanvas's payload verbatim and holds no verified record of which of Canvas's\nfields a caller needs, so it does not claim to keep some and drop others: a\nrecord that came back with holes in it would read exactly like a verified\nanswer. Stripping is subtractive, so it cannot lose a field nobody knew about.\nA conversation participant keeps their name and id on compact; they lose their\npicture.\n\n- **The link fields survive both rungs, named explicitly.** `url`, `html_url`\n  and `preview_url` are kept by name — `html_url` opens the item in Canvas,\n  `preview_url` renders a submission, and `url` is the download handle\n  `canvas_list_course_files` emits and `canvas_download_file` consumes. On an\n  `online_url` submission that `url` IS the student's submitted work. Without\n  the name, a student who submitted a link ending in `.png` would have had\n  their submission silently removed on the default rung.\n- **Both avatar spellings really do appear.** One live\n  `canvas_list_conversations` response carried a default avatar\n  (`…/avatar-50.png`) on one participant and an uploaded, extension-less\n  thumbnail id on another. They are dropped by NAME, so both go — not one kept\n  and one lost depending on whether that person ever uploaded a photo.\n\nPass `view: \"full\"` when you want Canvas's payload untouched, avatars and all.\nThat is also why there is deliberately **no `raw` rung**: there is no\nnormalisation layer here for `full` to sit above, so `full` already IS the\nuntouched upstream payload and a third value would silently alias it.\n\nThe other ten tools take no `view`, for two different reasons:\n\n- **Nothing to strip.** `canvas_list_courses`, `canvas_list_assignments`,\n  `canvas_list_missing_submissions`, `canvas_list_enrollments`,\n  `canvas_list_calendar_events`, `canvas_list_upcoming_events` and\n  `canvas_list_planner_items` embed no user object — a live\n  `canvas_list_courses` over twelve courses carried no media field of any kind\n  — and a knob that does not turn is worse than no knob. `canvas_healthcheck`\n  returns a verdict, not a record.\n- **The URL is the product.** `canvas_list_course_files` and\n  `canvas_download_file` exist to hand you a file URL. Compact there would not\n  shrink the response, it would empty it.\n\nPassing `view` to one of those ten is not an error and not a warning: MCP tool\nschemas are non-strict, so the key is dropped and you get that tool's ordinary\noutput.\n\n## Notes\n\n- Set `CANVAS_NAME` if you want a friendly label other than the host portion of the base URL.\n- All read tools that target a user accept an optional `observeeId` parameter (defaults to `self`) — useful when an observer is checking on a linked student.\n\nFile v2.1.5:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"canvas-parent\",\n  \"version\": \"2.1.5\",\n  \"publishedAt\": 1790603932447\n}\n\nFile v2.1.5:skill-card.md\n\n## Description:\n\nHelps users review Canvas LMS courses, assignments, grades, announcements, messages, and files for their own account or linked students.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nStudents and parents or guardians with observer access use this skill to check coursework, grades, upcoming deadlines, announcements, and Canvas messages, and to download course files.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Browser session reuse can expose sensitive Canvas grades, messages, and linked student records.\n\nMitigation: Prefer scoped OAuth or a limited token where available; verify the package and browser extension before use and request confirmation before accessing sensitive records.\n\nRisk: Course file downloads can place student or class materials on the local device.\n\nMitigation: Confirm downloads explicitly and store files only in an appropriate, access-controlled directory.\n\n## Reference(s):\n\n- [Canvas Parent on ClawHub](https://clawhub.ai/chrischall/skills/canvas-parent)\n- [Canvas Parent MCP package](https://www.npmjs.com/package/canvas-parent-mcp)\n- [ContextMint Bridge releases](https://github.com/nullnet-app/contextmint-bridge/releases)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Files]\n\n**Output Format:** [Text or Markdown responses; downloaded course files when requested]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Responses can contain sensitive student information; file downloads are written to a configured local directory.]\n\n## Skill Version(s):\n\n2.1.5 (source: server-resolved release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v2.1.4: 3 files, 4796 bytes\n\nFiles: skill-card.md (1970b), SKILL.md (7706b), _meta.json (132b)\n\nFile v2.1.4:SKILL.md\n\n---\nname: canvas-parent\ndescription: This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announcements, planner items, or files in Canvas.\n---\n\n# canvas-parent-mcp\n\nMCP server for Canvas LMS (Instructure) — read courses, grades, assignments, announcements, planner items, and conversations; download course files. Mirrors the parent/observer scope of the sibling `infinitecampus-mcp`.\n\n- **npm:** [npmjs.com/package/canvas-parent-mcp](https://www.npmjs.com/package/canvas-parent-mcp)\n- **Source:** [github.com/chrischall/canvas-parent-mcp](https://github.com/chrischall/canvas-parent-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"canvas\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"canvas-parent-mcp\"],\n      \"env\": {\n        \"CANVAS_BASE_URL\": \"https://cms.instructure.com\"\n      }\n    }\n  }\n}\n```\n\nWith the [fetchproxy extension](https://github.com/chrischall/fetchproxy) installed and a signed-in Canvas tab, that's enough — the MCP reads your session cookies at startup. Add `CANVAS_TOKEN`, `CANVAS_CLIENT_*`/`CANVAS_REFRESH_TOKEN`, or `CANVAS_USERNAME`/`CANVAS_PASSWORD` to the `env` block if you'd rather use one of those modes.\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/canvas-parent-mcp\ncd canvas-parent-mcp\nnpm install && npm run build\n```\n\n## Authentication\n\n**fetchproxy fallback (recommended, zero-config).** Set only `CANVAS_BASE_URL`. Install the [fetchproxy](https://github.com/chrischall/fetchproxy) browser extension, sign into your Canvas instance once. The MCP reads `canvas_session` + `pseudonym_credentials` cookies from your tab at startup; all API calls go directly from Node after that. Works with any auth flow (SSO/SAML/2FA included).\n\n### Alternatives (env-var)\n\n- **Personal access token** — set `CANVAS_TOKEN`. Most institutions have disabled this for non-admins.\n- **OAuth** — set `CANVAS_CLIENT_ID`, `CANVAS_CLIENT_SECRET`, `CANVAS_REFRESH_TOKEN`. Bootstrap via `canvas-parent-mcp-qr-login`.\n- **Username/password (session-scrape)** — set `CANVAS_USERNAME` + `CANVAS_PASSWORD`. Direct Canvas accounts only (no SSO/2FA). Brittle.\n\nPrecedence when multiple are set: `CANVAS_TOKEN` > username/password > OAuth > fetchproxy. Set `CANVAS_DISABLE_FETCHPROXY=1` to opt out of the fallback.\n\n## Tools (prefix `canvas_`)\n\n### Profile & observees\n- `canvas_get_profile` — your Canvas profile\n- `canvas_healthcheck` — which auth path resolved and whether Canvas accepts it; registered even when auth is unconfigured, so it can say why\n- `canvas_list_observees` — students linked to your observer account\n\n### Courses\n- `canvas_list_courses` — your active courses with grades\n- `canvas_get_course(courseId, view?)` — course detail with syllabus + teachers\n\n### Assignments & submissions\n- `canvas_list_assignments(courseId)` — assignments in a course\n- `canvas_list_missing_submissions` — past-due unsubmitted work\n- `canvas_get_submission(courseId, assignmentId, view?)` — your submission with comments + rubric\n- `canvas_list_recent_submissions(courseId, view?)` — recently graded submissions (default 14d)\n\n### Grades\n- `canvas_list_enrollments` — per-course grades\n\n### Calendar & planner\n- `canvas_list_calendar_events` — calendar events / assignments\n- `canvas_list_upcoming_events` — server-curated next 7 days\n- `canvas_list_planner_items` — unified to-do feed\n\n### Communication\n- `canvas_list_announcements(contextCodes, view?)` — course announcements\n- `canvas_list_conversations` — inbox\n- `canvas_get_conversation(id, view?)` — full conversation thread\n- `canvas_list_discussion_topics(courseId, view?)` — course discussion topics\n\n### Files\n- `canvas_list_course_files(courseId)` — file metadata\n- `canvas_download_file(url, destinationPath)` — download a file to disk. `url` must be a `/files/` URL on the configured Canvas host; `destinationPath` must be inside `CANVAS_OUTPUT_DIR` (default `~/Downloads`), and a relative path is resolved against it\n\n## Response shape (`view`)\n\nNine tools take `view: \"compact\" | \"full\"`, and **`compact` is the default** —\nyou get the slim shape without asking for it:\n\n`canvas_get_profile`, `canvas_list_observees`, `canvas_get_course`,\n`canvas_get_submission`, `canvas_list_recent_submissions`,\n`canvas_list_announcements`, `canvas_list_conversations`,\n`canvas_get_conversation`, `canvas_list_discussion_topics`.\n\n**Compact here is media stripping, not a field projection — do not expect a\nfield list.** It removes the avatar URLs Canvas hangs on user objects\n(`avatar_url`, `avatar_image_url`) and nothing else. This server hands back\nCanvas's payload verbatim and holds no verified record of which of Canvas's\nfields a caller needs, so it does not claim to keep some and drop others: a\nrecord that came back with holes in it would read exactly like a verified\nanswer. Stripping is subtractive, so it cannot lose a field nobody knew about.\nA conversation participant keeps their name and id on compact; they lose their\npicture.\n\n- **The link fields survive both rungs, named explicitly.** `url`, `html_url`\n  and `preview_url` are kept by name — `html_url` opens the item in Canvas,\n  `preview_url` renders a submission, and `url` is the download handle\n  `canvas_list_course_files` emits and `canvas_download_file` consumes. On an\n  `online_url` submission that `url` IS the student's submitted work. Without\n  the name, a student who submitted a link ending in `.png` would have had\n  their submission silently removed on the default rung.\n- **Both avatar spellings really do appear.** One live\n  `canvas_list_conversations` response carried a default avatar\n  (`…/avatar-50.png`) on one participant and an uploaded, extension-less\n  thumbnail id on another. They are dropped by NAME, so both go — not one kept\n  and one lost depending on whether that person ever uploaded a photo.\n\nPass `view: \"full\"` when you want Canvas's payload untouched, avatars and all.\nThat is also why there is deliberately **no `raw` rung**: there is no\nnormalisation layer here for `full` to sit above, so `full` already IS the\nuntouched upstream payload and a third value would silently alias it.\n\nThe other ten tools take no `view`, for two different reasons:\n\n- **Nothing to strip.** `canvas_list_courses`, `canvas_list_assignments`,\n  `canvas_list_missing_submissions`, `canvas_list_enrollments`,\n  `canvas_list_calendar_events`, `canvas_list_upcoming_events` and\n  `canvas_list_planner_items` embed no user object — a live\n  `canvas_list_courses` over twelve courses carried no media field of any kind\n  — and a knob that does not turn is worse than no knob. `canvas_healthcheck`\n  returns a verdict, not a record.\n- **The URL is the product.** `canvas_list_course_files` and\n  `canvas_download_file` exist to hand you a file URL. Compact there would not\n  shrink the response, it would empty it.\n\nPassing `view` to one of those ten is not an error and not a warning: MCP tool\nschemas are non-strict, so the key is dropped and you get that tool's ordinary\noutput.\n\n## Notes\n\n- Set `CANVAS_NAME` if you want a friendly label other than the host portion of the base URL.\n- All read tools that target a user accept an optional `observeeId` parameter (defaults to `self`) — useful when an observer is checking on a linked student.\n\nFile v2.1.4:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"canvas-parent\",\n  \"version\": \"2.1.4\",\n  \"publishedAt\": 1790351482033\n}\n\nFile v2.1.4:skill-card.md\n\n## Description:\n\nHelps agents answer questions about Canvas courses, assignments, grades, messages, and files for a student or linked observee.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nStudents and parents or guardians use this skill to ask an agent about Canvas coursework, grades, due dates, announcements, inbox messages, and course files within their account's access.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Browser-session reuse and broad Canvas account access can expose grades, messages, files, and observed-student records to the agent.\n\nMitigation: Install only if you trust the npm package and fetchproxy extension; use the least-privileged authentication method your institution supports and review what student data the agent can access.\n\nRisk: Downloading course files may place sensitive records on disk.\n\nMitigation: Set CANVAS_OUTPUT_DIR deliberately and review downloaded files and their destination.\n\n## Reference(s):\n\n- [Canvas Parent on ClawHub](https://clawhub.ai/chrischall/skills/canvas-parent)\n- [canvas-parent-mcp npm package](https://www.npmjs.com/package/canvas-parent-mcp)\n- [fetchproxy extension](https://github.com/chrischall/fetchproxy)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Files]\n\n**Output Format:** [Natural-language answers based on Canvas records, with downloadable course files on request]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Responses may contain sensitive student records.]\n\n## Skill Version(s):\n\n2.1.4 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v2.1.3: 3 files, 5020 bytes\n\nFiles: skill-card.md (2617b), SKILL.md (7706b), _meta.json (132b)\n\nFile v2.1.3:SKILL.md\n\n---\nname: canvas-parent\ndescription: This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announcements, planner items, or files in Canvas.\n---\n\n# canvas-parent-mcp\n\nMCP server for Canvas LMS (Instructure) — read courses, grades, assignments, announcements, planner items, and conversations; download course files. Mirrors the parent/observer scope of the sibling `infinitecampus-mcp`.\n\n- **npm:** [npmjs.com/package/canvas-parent-mcp](https://www.npmjs.com/package/canvas-parent-mcp)\n- **Source:** [github.com/chrischall/canvas-parent-mcp](https://github.com/chrischall/canvas-parent-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"canvas\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"canvas-parent-mcp\"],\n      \"env\": {\n        \"CANVAS_BASE_URL\": \"https://cms.instructure.com\"\n      }\n    }\n  }\n}\n```\n\nWith the [fetchproxy extension](https://github.com/chrischall/fetchproxy) installed and a signed-in Canvas tab, that's enough — the MCP reads your session cookies at startup. Add `CANVAS_TOKEN`, `CANVAS_CLIENT_*`/`CANVAS_REFRESH_TOKEN`, or `CANVAS_USERNAME`/`CANVAS_PASSWORD` to the `env` block if you'd rather use one of those modes.\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/canvas-parent-mcp\ncd canvas-parent-mcp\nnpm install && npm run build\n```\n\n## Authentication\n\n**fetchproxy fallback (recommended, zero-config).** Set only `CANVAS_BASE_URL`. Install the [fetchproxy](https://github.com/chrischall/fetchproxy) browser extension, sign into your Canvas instance once. The MCP reads `canvas_session` + `pseudonym_credentials` cookies from your tab at startup; all API calls go directly from Node after that. Works with any auth flow (SSO/SAML/2FA included).\n\n### Alternatives (env-var)\n\n- **Personal access token** — set `CANVAS_TOKEN`. Most institutions have disabled this for non-admins.\n- **OAuth** — set `CANVAS_CLIENT_ID`, `CANVAS_CLIENT_SECRET`, `CANVAS_REFRESH_TOKEN`. Bootstrap via `canvas-parent-mcp-qr-login`.\n- **Username/password (session-scrape)** — set `CANVAS_USERNAME` + `CANVAS_PASSWORD`. Direct Canvas accounts only (no SSO/2FA). Brittle.\n\nPrecedence when multiple are set: `CANVAS_TOKEN` > username/password > OAuth > fetchproxy. Set `CANVAS_DISABLE_FETCHPROXY=1` to opt out of the fallback.\n\n## Tools (prefix `canvas_`)\n\n### Profile & observees\n- `canvas_get_profile` — your Canvas profile\n- `canvas_healthcheck` — which auth path resolved and whether Canvas accepts it; registered even when auth is unconfigured, so it can say why\n- `canvas_list_observees` — students linked to your observer account\n\n### Courses\n- `canvas_list_courses` — your active courses with grades\n- `canvas_get_course(courseId, view?)` — course detail with syllabus + teachers\n\n### Assignments & submissions\n- `canvas_list_assignments(courseId)` — assignments in a course\n- `canvas_list_missing_submissions` — past-due unsubmitted work\n- `canvas_get_submission(courseId, assignmentId, view?)` — your submission with comments + rubric\n- `canvas_list_recent_submissions(courseId, view?)` — recently graded submissions (default 14d)\n\n### Grades\n- `canvas_list_enrollments` — per-course grades\n\n### Calendar & planner\n- `canvas_list_calendar_events` — calendar events / assignments\n- `canvas_list_upcoming_events` — server-curated next 7 days\n- `canvas_list_planner_items` — unified to-do feed\n\n### Communication\n- `canvas_list_announcements(contextCodes, view?)` — course announcements\n- `canvas_list_conversations` — inbox\n- `canvas_get_conversation(id, view?)` — full conversation thread\n- `canvas_list_discussion_topics(courseId, view?)` — course discussion topics\n\n### Files\n- `canvas_list_course_files(courseId)` — file metadata\n- `canvas_download_file(url, destinationPath)` — download a file to disk. `url` must be a `/files/` URL on the configured Canvas host; `destinationPath` must be inside `CANVAS_OUTPUT_DIR` (default `~/Downloads`), and a relative path is resolved against it\n\n## Response shape (`view`)\n\nNine tools take `view: \"compact\" | \"full\"`, and **`compact` is the default** —\nyou get the slim shape without asking for it:\n\n`canvas_get_profile`, `canvas_list_observees`, `canvas_get_course`,\n`canvas_get_submission`, `canvas_list_recent_submissions`,\n`canvas_list_announcements`, `canvas_list_conversations`,\n`canvas_get_conversation`, `canvas_list_discussion_topics`.\n\n**Compact here is media stripping, not a field projection — do not expect a\nfield list.** It removes the avatar URLs Canvas hangs on user objects\n(`avatar_url`, `avatar_image_url`) and nothing else. This server hands back\nCanvas's payload verbatim and holds no verified record of which of Canvas's\nfields a caller needs, so it does not claim to keep some and drop others: a\nrecord that came back with holes in it would read exactly like a verified\nanswer. Stripping is subtractive, so it cannot lose a field nobody knew about.\nA conversation participant keeps their name and id on compact; they lose their\npicture.\n\n- **The link fields survive both rungs, named explicitly.** `url`, `html_url`\n  and `preview_url` are kept by name — `html_url` opens the item in Canvas,\n  `preview_url` renders a submission, and `url` is the download handle\n  `canvas_list_course_files` emits and `canvas_download_file` consumes. On an\n  `online_url` submission that `url` IS the student's submitted work. Without\n  the name, a student who submitted a link ending in `.png` would have had\n  their submission silently removed on the default rung.\n- **Both avatar spellings really do appear.** One live\n  `canvas_list_conversations` response carried a default avatar\n  (`…/avatar-50.png`) on one participant and an uploaded, extension-less\n  thumbnail id on another. They are dropped by NAME, so both go — not one kept\n  and one lost depending on whether that person ever uploaded a photo.\n\nPass `view: \"full\"` when you want Canvas's payload untouched, avatars and all.\nThat is also why there is deliberately **no `raw` rung**: there is no\nnormalisation layer here for `full` to sit above, so `full` already IS the\nuntouched upstream payload and a third value would silently alias it.\n\nThe other ten tools take no `view`, for two different reasons:\n\n- **Nothing to strip.** `canvas_list_courses`, `canvas_list_assignments`,\n  `canvas_list_missing_submissions`, `canvas_list_enrollments`,\n  `canvas_list_calendar_events`, `canvas_list_upcoming_events` and\n  `canvas_list_planner_items` embed no user object — a live\n  `canvas_list_courses` over twelve courses carried no media field of any kind\n  — and a knob that does not turn is worse than no knob. `canvas_healthcheck`\n  returns a verdict, not a record.\n- **The URL is the product.** `canvas_list_course_files` and\n  `canvas_download_file` exist to hand you a file URL. Compact there would not\n  shrink the response, it would empty it.\n\nPassing `view` to one of those ten is not an error and not a warning: MCP tool\nschemas are non-strict, so the key is dropped and you get that tool's ordinary\noutput.\n\n## Notes\n\n- Set `CANVAS_NAME` if you want a friendly label other than the host portion of the base URL.\n- All read tools that target a user accept an optional `observeeId` parameter (defaults to `self`) — useful when an observer is checking on a linked student.\n\nFile v2.1.3:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"canvas-parent\",\n  \"version\": \"2.1.3\",\n  \"publishedAt\": 1790199733380\n}\n\nFile v2.1.3:skill-card.md\n\n## Description:\n\nHelps an agent answer Canvas LMS questions about a user's own student account or observed students, including courses, assignments, grades, conversations, announcements, planner items, and files.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and external users use this skill to configure and operate a Canvas LMS MCP server so an agent can retrieve account, course, grade, assignment, communication, planner, and file information from authorized Canvas accounts.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The MCP server can access Canvas account data and high-value session material such as cookies, tokens, OAuth credentials, or username/password credentials.\n\nMitigation: Use the narrowest credential method available, avoid username/password authentication where possible, and treat Canvas cookies, refresh tokens, and access tokens as secrets.\n\nRisk: The file download tool can write Canvas files to disk.\n\nMitigation: Confirm the download URL and destination path before invoking downloads, and keep downloaded files inside the configured output directory.\n\nRisk: Canvas data may include sensitive student, course, grade, submission, and conversation information.\n\nMitigation: Use the skill only with authorized Canvas accounts or observees and limit shared outputs to information the requester is permitted to see.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/canvas-parent)\n- [canvas-parent-mcp npm package](https://www.npmjs.com/package/canvas-parent-mcp)\n- [canvas-parent-mcp source link from skill artifact](https://github.com/chrischall/canvas-parent-mcp)\n- [fetchproxy authentication helper](https://github.com/chrischall/fetchproxy)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown guidance with JSON configuration examples, shell commands, and structured Canvas MCP tool responses.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Canvas responses may use compact or full views; file downloads write to the configured Canvas output directory.]\n\n## Skill Version(s):\n\n2.1.3 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v2.1.2: 3 files, 4917 bytes\n\nFiles: skill-card.md (2561b), SKILL.md (7523b), _meta.json (132b)\n\nFile v2.1.2:SKILL.md\n\n---\nname: canvas-parent\ndescription: This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announcements, planner items, or files in Canvas.\n---\n\n# canvas-parent-mcp\n\nMCP server for Canvas LMS (Instructure) — read courses, grades, assignments, announcements, planner items, and conversations; download course files. Mirrors the parent/observer scope of the sibling `infinitecampus-mcp`.\n\n- **npm:** [npmjs.com/package/canvas-parent-mcp](https://www.npmjs.com/package/canvas-parent-mcp)\n- **Source:** [github.com/chrischall/canvas-parent-mcp](https://github.com/chrischall/canvas-parent-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"canvas\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"canvas-parent-mcp\"],\n      \"env\": {\n        \"CANVAS_BASE_URL\": \"https://cms.instructure.com\"\n      }\n    }\n  }\n}\n```\n\nWith the [fetchproxy extension](https://github.com/chrischall/fetchproxy) installed and a signed-in Canvas tab, that's enough — the MCP reads your session cookies at startup. Add `CANVAS_TOKEN`, `CANVAS_CLIENT_*`/`CANVAS_REFRESH_TOKEN`, or `CANVAS_USERNAME`/`CANVAS_PASSWORD` to the `env` block if you'd rather use one of those modes.\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/canvas-parent-mcp\ncd canvas-parent-mcp\nnpm install && npm run build\n```\n\n## Authentication\n\n**fetchproxy fallback (recommended, zero-config).** Set only `CANVAS_BASE_URL`. Install the [fetchproxy](https://github.com/chrischall/fetchproxy) browser extension, sign into your Canvas instance once. The MCP reads `canvas_session` + `pseudonym_credentials` cookies from your tab at startup; all API calls go directly from Node after that. Works with any auth flow (SSO/SAML/2FA included).\n\n### Alternatives (env-var)\n\n- **Personal access token** — set `CANVAS_TOKEN`. Most institutions have disabled this for non-admins.\n- **OAuth** — set `CANVAS_CLIENT_ID`, `CANVAS_CLIENT_SECRET`, `CANVAS_REFRESH_TOKEN`. Bootstrap via `canvas-parent-mcp-qr-login`.\n- **Username/password (session-scrape)** — set `CANVAS_USERNAME` + `CANVAS_PASSWORD`. Direct Canvas accounts only (no SSO/2FA). Brittle.\n\nPrecedence when multiple are set: `CANVAS_TOKEN` > username/password > OAuth > fetchproxy. Set `CANVAS_DISABLE_FETCHPROXY=1` to opt out of the fallback.\n\n## Tools (prefix `canvas_`)\n\n### Profile & observees\n- `canvas_get_profile` — your Canvas profile\n- `canvas_healthcheck` — which auth path resolved and whether Canvas accepts it; registered even when auth is unconfigured, so it can say why\n- `canvas_list_observees` — students linked to your observer account\n\n### Courses\n- `canvas_list_courses` — your active courses with grades\n- `canvas_get_course(courseId, view?)` — course detail with syllabus + teachers\n\n### Assignments & submissions\n- `canvas_list_assignments(courseId)` — assignments in a course\n- `canvas_list_missing_submissions` — past-due unsubmitted work\n- `canvas_get_submission(courseId, assignmentId, view?)` — your submission with comments + rubric\n- `canvas_list_recent_submissions(courseId, view?)` — recently graded submissions (default 14d)\n\n### Grades\n- `canvas_list_enrollments` — per-course grades\n\n### Calendar & planner\n- `canvas_list_calendar_events` — calendar events / assignments\n- `canvas_list_upcoming_events` — server-curated next 7 days\n- `canvas_list_planner_items` — unified to-do feed\n\n### Communication\n- `canvas_list_announcements(contextCodes, view?)` — course announcements\n- `canvas_list_conversations` — inbox\n- `canvas_get_conversation(id, view?)` — full conversation thread\n- `canvas_list_discussion_topics(courseId, view?)` — course discussion topics\n\n### Files\n- `canvas_list_course_files(courseId)` — file metadata\n- `canvas_download_file(url, destinationPath)` — download a file to disk\n\n## Response shape (`view`)\n\nNine tools take `view: \"compact\" | \"full\"`, and **`compact` is the default** —\nyou get the slim shape without asking for it:\n\n`canvas_get_profile`, `canvas_list_observees`, `canvas_get_course`,\n`canvas_get_submission`, `canvas_list_recent_submissions`,\n`canvas_list_announcements`, `canvas_list_conversations`,\n`canvas_get_conversation`, `canvas_list_discussion_topics`.\n\n**Compact here is media stripping, not a field projection — do not expect a\nfield list.** It removes the avatar URLs Canvas hangs on user objects\n(`avatar_url`, `avatar_image_url`) and nothing else. This server hands back\nCanvas's payload verbatim and holds no verified record of which of Canvas's\nfields a caller needs, so it does not claim to keep some and drop others: a\nrecord that came back with holes in it would read exactly like a verified\nanswer. Stripping is subtractive, so it cannot lose a field nobody knew about.\nA conversation participant keeps their name and id on compact; they lose their\npicture.\n\n- **The link fields survive both rungs, named explicitly.** `url`, `html_url`\n  and `preview_url` are kept by name — `html_url` opens the item in Canvas,\n  `preview_url` renders a submission, and `url` is the download handle\n  `canvas_list_course_files` emits and `canvas_download_file` consumes. On an\n  `online_url` submission that `url` IS the student's submitted work. Without\n  the name, a student who submitted a link ending in `.png` would have had\n  their submission silently removed on the default rung.\n- **Both avatar spellings really do appear.** One live\n  `canvas_list_conversations` response carried a default avatar\n  (`…/avatar-50.png`) on one participant and an uploaded, extension-less\n  thumbnail id on another. They are dropped by NAME, so both go — not one kept\n  and one lost depending on whether that person ever uploaded a photo.\n\nPass `view: \"full\"` when you want Canvas's payload untouched, avatars and all.\nThat is also why there is deliberately **no `raw` rung**: there is no\nnormalisation layer here for `full` to sit above, so `full` already IS the\nuntouched upstream payload and a third value would silently alias it.\n\nThe other ten tools take no `view`, for two different reasons:\n\n- **Nothing to strip.** `canvas_list_courses`, `canvas_list_assignments`,\n  `canvas_list_missing_submissions`, `canvas_list_enrollments`,\n  `canvas_list_calendar_events`, `canvas_list_upcoming_events` and\n  `canvas_list_planner_items` embed no user object — a live\n  `canvas_list_courses` over twelve courses carried no media field of any kind\n  — and a knob that does not turn is worse than no knob. `canvas_healthcheck`\n  returns a verdict, not a record.\n- **The URL is the product.** `canvas_list_course_files` and\n  `canvas_download_file` exist to hand you a file URL. Compact there would not\n  shrink the response, it would empty it.\n\nPassing `view` to one of those ten is not an error and not a warning: MCP tool\nschemas are non-strict, so the key is dropped and you get that tool's ordinary\noutput.\n\n## Notes\n\n- Set `CANVAS_NAME` if you want a friendly label other than the host portion of the base URL.\n- All read tools that target a user accept an optional `observeeId` parameter (defaults to `self`) — useful when an observer is checking on a linked student.\n\nFile v2.1.2:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"canvas-parent\",\n  \"version\": \"2.1.2\",\n  \"publishedAt\": 1790178264180\n}\n\nFile v2.1.2:skill-card.md\n\n## Description:\n\nThis skill helps an agent answer questions about Canvas LMS courses, assignments, grades, announcements, conversations, planner items, and files for a user's own student account or an observed student.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and agents use this skill to connect to Canvas LMS through the canvas-parent MCP server and retrieve course, grade, assignment, communication, planner, and file information for a student or observer account.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can access Canvas data with privileges comparable to the user's Canvas session or supplied credentials, including broad student-data access for linked observer accounts.\n\nMitigation: Use the least-privileged available authentication method, prefer scoped token or OAuth where available, and only install it for Canvas accounts whose data access is appropriate for the intended agent workflow.\n\nRisk: The fetchproxy path reuses browser session cookies at startup.\n\nMitigation: Disable fetchproxy when browser-cookie reuse is not acceptable and configure another supported authentication mode instead.\n\nRisk: The file-download tool accepts a local destination path.\n\nMitigation: Review requested downloads and destination paths before execution, and restrict downloads to expected workspace locations.\n\n## Reference(s):\n\n- [canvas-parent-mcp npm package](https://www.npmjs.com/package/canvas-parent-mcp)\n- [canvas-parent-mcp source repository](https://github.com/chrischall/canvas-parent-mcp)\n- [fetchproxy browser extension](https://github.com/chrischall/fetchproxy)\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/canvas-parent)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, configuration, shell commands, guidance]\n\n**Output Format:** [Markdown with JSON configuration examples and shell command snippets]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Agent responses may include Canvas LMS data returned by MCP tools, including links or file-download guidance when requested.]\n\n## Skill Version(s):\n\n2.1.2 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v2.1.1: 3 files, 4754 bytes\n\nFiles: skill-card.md (2085b), SKILL.md (7523b), _meta.json (132b)\n\nFile v2.1.1:SKILL.md\n\n---\nname: canvas-parent\ndescription: This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announcements, planner items, or files in Canvas.\n---\n\n# canvas-parent-mcp\n\nMCP server for Canvas LMS (Instructure) — read courses, grades, assignments, announcements, planner items, and conversations; download course files. Mirrors the parent/observer scope of the sibling `infinitecampus-mcp`.\n\n- **npm:** [npmjs.com/package/canvas-parent-mcp](https://www.npmjs.com/package/canvas-parent-mcp)\n- **Source:** [github.com/chrischall/canvas-parent-mcp](https://github.com/chrischall/canvas-parent-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"canvas\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"canvas-parent-mcp\"],\n      \"env\": {\n        \"CANVAS_BASE_URL\": \"https://cms.instructure.com\"\n      }\n    }\n  }\n}\n```\n\nWith the [fetchproxy extension](https://github.com/chrischall/fetchproxy) installed and a signed-in Canvas tab, that's enough — the MCP reads your session cookies at startup. Add `CANVAS_TOKEN`, `CANVAS_CLIENT_*`/`CANVAS_REFRESH_TOKEN`, or `CANVAS_USERNAME`/`CANVAS_PASSWORD` to the `env` block if you'd rather use one of those modes.\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/canvas-parent-mcp\ncd canvas-parent-mcp\nnpm install && npm run build\n```\n\n## Authentication\n\n**fetchproxy fallback (recommended, zero-config).** Set only `CANVAS_BASE_URL`. Install the [fetchproxy](https://github.com/chrischall/fetchproxy) browser extension, sign into your Canvas instance once. The MCP reads `canvas_session` + `pseudonym_credentials` cookies from your tab at startup; all API calls go directly from Node after that. Works with any auth flow (SSO/SAML/2FA included).\n\n### Alternatives (env-var)\n\n- **Personal access token** — set `CANVAS_TOKEN`. Most institutions have disabled this for non-admins.\n- **OAuth** — set `CANVAS_CLIENT_ID`, `CANVAS_CLIENT_SECRET`, `CANVAS_REFRESH_TOKEN`. Bootstrap via `canvas-parent-mcp-qr-login`.\n- **Username/password (session-scrape)** — set `CANVAS_USERNAME` + `CANVAS_PASSWORD`. Direct Canvas accounts only (no SSO/2FA). Brittle.\n\nPrecedence when multiple are set: `CANVAS_TOKEN` > username/password > OAuth > fetchproxy. Set `CANVAS_DISABLE_FETCHPROXY=1` to opt out of the fallback.\n\n## Tools (prefix `canvas_`)\n\n### Profile & observees\n- `canvas_get_profile` — your Canvas profile\n- `canvas_healthcheck` — which auth path resolved and whether Canvas accepts it; registered even when auth is unconfigured, so it can say why\n- `canvas_list_observees` — students linked to your observer account\n\n### Courses\n- `canvas_list_courses` — your active courses with grades\n- `canvas_get_course(courseId, view?)` — course detail with syllabus + teachers\n\n### Assignments & submissions\n- `canvas_list_assignments(courseId)` — assignments in a course\n- `canvas_list_missing_submissions` — past-due unsubmitted work\n- `canvas_get_submission(courseId, assignmentId, view?)` — your submission with comments + rubric\n- `canvas_list_recent_submissions(courseId, view?)` — recently graded submissions (default 14d)\n\n### Grades\n- `canvas_list_enrollments` — per-course grades\n\n### Calendar & planner\n- `canvas_list_calendar_events` — calendar events / assignments\n- `canvas_list_upcoming_events` — server-curated next 7 days\n- `canvas_list_planner_items` — unified to-do feed\n\n### Communication\n- `canvas_list_announcements(contextCodes, view?)` — course announcements\n- `canvas_list_conversations` — inbox\n- `canvas_get_conversation(id, view?)` — full conversation thread\n- `canvas_list_discussion_topics(courseId, view?)` — course discussion topics\n\n### Files\n- `canvas_list_course_files(courseId)` — file metadata\n- `canvas_download_file(url, destinationPath)` — download a file to disk\n\n## Response shape (`view`)\n\nNine tools take `view: \"compact\" | \"full\"`, and **`compact` is the default** —\nyou get the slim shape without asking for it:\n\n`canvas_get_profile`, `canvas_list_observees`, `canvas_get_course`,\n`canvas_get_submission`, `canvas_list_recent_submissions`,\n`canvas_list_announcements`, `canvas_list_conversations`,\n`canvas_get_conversation`, `canvas_list_discussion_topics`.\n\n**Compact here is media stripping, not a field projection — do not expect a\nfield list.** It removes the avatar URLs Canvas hangs on user objects\n(`avatar_url`, `avatar_image_url`) and nothing else. This server hands back\nCanvas's payload verbatim and holds no verified record of which of Canvas's\nfields a caller needs, so it does not claim to keep some and drop others: a\nrecord that came back with holes in it would read exactly like a verified\nanswer. Stripping is subtractive, so it cannot lose a field nobody knew about.\nA conversation participant keeps their name and id on compact; they lose their\npicture.\n\n- **The link fields survive both rungs, named explicitly.** `url`, `html_url`\n  and `preview_url` are kept by name — `html_url` opens the item in Canvas,\n  `preview_url` renders a submission, and `url` is the download handle\n  `canvas_list_course_files` emits and `canvas_download_file` consumes. On an\n  `online_url` submission that `url` IS the student's submitted work. Without\n  the name, a student who submitted a link ending in `.png` would have had\n  their submission silently removed on the default rung.\n- **Both avatar spellings really do appear.** One live\n  `canvas_list_conversations` response carried a default avatar\n  (`…/avatar-50.png`) on one participant and an uploaded, extension-less\n  thumbnail id on another. They are dropped by NAME, so both go — not one kept\n  and one lost depending on whether that person ever uploaded a photo.\n\nPass `view: \"full\"` when you want Canvas's payload untouched, avatars and all.\nThat is also why there is deliberately **no `raw` rung**: there is no\nnormalisation layer here for `full` to sit above, so `full` already IS the\nuntouched upstream payload and a third value would silently alias it.\n\nThe other ten tools take no `view`, for two different reasons:\n\n- **Nothing to strip.** `canvas_list_courses`, `canvas_list_assignments`,\n  `canvas_list_missing_submissions`, `canvas_list_enrollments`,\n  `canvas_list_calendar_events`, `canvas_list_upcoming_events` and\n  `canvas_list_planner_items` embed no user object — a live\n  `canvas_list_courses` over twelve courses carried no media field of any kind\n  — and a knob that does not turn is worse than no knob. `canvas_healthcheck`\n  returns a verdict, not a record.\n- **The URL is the product.** `canvas_list_course_files` and\n  `canvas_download_file` exist to hand you a file URL. Compact there would not\n  shrink the response, it would empty it.\n\nPassing `view` to one of those ten is not an error and not a warning: MCP tool\nschemas are non-strict, so the key is dropped and you get that tool's ordinary\noutput.\n\n## Notes\n\n- Set `CANVAS_NAME` if you want a friendly label other than the host portion of the base URL.\n- All read tools that target a user accept an optional `observeeId` parameter (defaults to `self`) — useful when an observer is checking on a linked student.\n\nFile v2.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"canvas-parent\",\n  \"version\": \"2.1.1\",\n  \"publishedAt\": 1789964210489\n}\n\nFile v2.1.1:skill-card.md\n\n## Description:\n\nProvides Canvas LMS access for questions about courses, assignments, grades, inbox conversations, announcements, planner items, and course files for a user's own account or observed students.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and agents use this skill to connect to Canvas LMS and retrieve course, grade, assignment, calendar, inbox, announcement, and file information for a user's own account or linked observees.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The MCP server can access Canvas data equivalent to the signed-in Canvas session, including grades, messages, files, and linked student records.\n\nMitigation: Install only when this access is acceptable; prefer OAuth or a Canvas token when available, disable fetchproxy with CANVAS_DISABLE_FETCHPROXY=1 if browser-cookie authentication is not desired, and review the external npm package and fetchproxy extension before enabling them.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/canvas-parent)\n- [canvas-parent-mcp npm package](https://www.npmjs.com/package/canvas-parent-mcp)\n- [canvas-parent-mcp repository](https://github.com/chrischall/canvas-parent-mcp)\n- [fetchproxy extension](https://github.com/chrischall/fetchproxy)\n\n## Skill Output:\n\n**Output Type(s):** [text, configuration, shell commands, files]\n\n**Output Format:** [Markdown guidance with JSON configuration snippets and MCP tool responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May return Canvas LMS records and downloaded course files through MCP tools.]\n\n## Skill Version(s):\n\n2.1.1 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v2.1.0: 3 files, 4973 bytes\n\nFiles: skill-card.md (2616b), SKILL.md (7523b), _meta.json (132b)\n\nFile v2.1.0:SKILL.md\n\n---\nname: canvas-parent\ndescription: This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announcements, planner items, or files in Canvas.\n---\n\n# canvas-parent-mcp\n\nMCP server for Canvas LMS (Instructure) — read courses, grades, assignments, announcements, planner items, and conversations; download course files. Mirrors the parent/observer scope of the sibling `infinitecampus-mcp`.\n\n- **npm:** [npmjs.com/package/canvas-parent-mcp](https://www.npmjs.com/package/canvas-parent-mcp)\n- **Source:** [github.com/chrischall/canvas-parent-mcp](https://github.com/chrischall/canvas-parent-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"canvas\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"canvas-parent-mcp\"],\n      \"env\": {\n        \"CANVAS_BASE_URL\": \"https://cms.instructure.com\"\n      }\n    }\n  }\n}\n```\n\nWith the [fetchproxy extension](https://github.com/chrischall/fetchproxy) installed and a signed-in Canvas tab, that's enough — the MCP reads your session cookies at startup. Add `CANVAS_TOKEN`, `CANVAS_CLIENT_*`/`CANVAS_REFRESH_TOKEN`, or `CANVAS_USERNAME`/`CANVAS_PASSWORD` to the `env` block if you'd rather use one of those modes.\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/canvas-parent-mcp\ncd canvas-parent-mcp\nnpm install && npm run build\n```\n\n## Authentication\n\n**fetchproxy fallback (recommended, zero-config).** Set only `CANVAS_BASE_URL`. Install the [fetchproxy](https://github.com/chrischall/fetchproxy) browser extension, sign into your Canvas instance once. The MCP reads `canvas_session` + `pseudonym_credentials` cookies from your tab at startup; all API calls go directly from Node after that. Works with any auth flow (SSO/SAML/2FA included).\n\n### Alternatives (env-var)\n\n- **Personal access token** — set `CANVAS_TOKEN`. Most institutions have disabled this for non-admins.\n- **OAuth** — set `CANVAS_CLIENT_ID`, `CANVAS_CLIENT_SECRET`, `CANVAS_REFRESH_TOKEN`. Bootstrap via `canvas-parent-mcp-qr-login`.\n- **Username/password (session-scrape)** — set `CANVAS_USERNAME` + `CANVAS_PASSWORD`. Direct Canvas accounts only (no SSO/2FA). Brittle.\n\nPrecedence when multiple are set: `CANVAS_TOKEN` > username/password > OAuth > fetchproxy. Set `CANVAS_DISABLE_FETCHPROXY=1` to opt out of the fallback.\n\n## Tools (prefix `canvas_`)\n\n### Profile & observees\n- `canvas_get_profile` — your Canvas profile\n- `canvas_healthcheck` — which auth path resolved and whether Canvas accepts it; registered even when auth is unconfigured, so it can say why\n- `canvas_list_observees` — students linked to your observer account\n\n### Courses\n- `canvas_list_courses` — your active courses with grades\n- `canvas_get_course(courseId, view?)` — course detail with syllabus + teachers\n\n### Assignments & submissions\n- `canvas_list_assignments(courseId)` — assignments in a course\n- `canvas_list_missing_submissions` — past-due unsubmitted work\n- `canvas_get_submission(courseId, assignmentId, view?)` — your submission with comments + rubric\n- `canvas_list_recent_submissions(courseId, view?)` — recently graded submissions (default 14d)\n\n### Grades\n- `canvas_list_enrollments` — per-course grades\n\n### Calendar & planner\n- `canvas_list_calendar_events` — calendar events / assignments\n- `canvas_list_upcoming_events` — server-curated next 7 days\n- `canvas_list_planner_items` — unified to-do feed\n\n### Communication\n- `canvas_list_announcements(contextCodes, view?)` — course announcements\n- `canvas_list_conversations` — inbox\n- `canvas_get_conversation(id, view?)` — full conversation thread\n- `canvas_list_discussion_topics(courseId, view?)` — course discussion topics\n\n### Files\n- `canvas_list_course_files(courseId)` — file metadata\n- `canvas_download_file(url, destinationPath)` — download a file to disk\n\n## Response shape (`view`)\n\nNine tools take `view: \"compact\" | \"full\"`, and **`compact` is the default** —\nyou get the slim shape without asking for it:\n\n`canvas_get_profile`, `canvas_list_observees`, `canvas_get_course`,\n`canvas_get_submission`, `canvas_list_recent_submissions`,\n`canvas_list_announcements`, `canvas_list_conversations`,\n`canvas_get_conversation`, `canvas_list_discussion_topics`.\n\n**Compact here is media stripping, not a field projection — do not expect a\nfield list.** It removes the avatar URLs Canvas hangs on user objects\n(`avatar_url`, `avatar_image_url`) and nothing else. This server hands back\nCanvas's payload verbatim and holds no verified record of which of Canvas's\nfields a caller needs, so it does not claim to keep some and drop others: a\nrecord that came back with holes in it would read exactly like a verified\nanswer. Stripping is subtractive, so it cannot lose a field nobody knew about.\nA conversation participant keeps their name and id on compact; they lose their\npicture.\n\n- **The link fields survive both rungs, named explicitly.** `url`, `html_url`\n  and `preview_url` are kept by name — `html_url` opens the item in Canvas,\n  `preview_url` renders a submission, and `url` is the download handle\n  `canvas_list_course_files` emits and `canvas_download_file` consumes. On an\n  `online_url` submission that `url` IS the student's submitted work. Without\n  the name, a student who submitted a link ending in `.png` would have had\n  their submission silently removed on the default rung.\n- **Both avatar spellings really do appear.** One live\n  `canvas_list_conversations` response carried a default avatar\n  (`…/avatar-50.png`) on one participant and an uploaded, extension-less\n  thumbnail id on another. They are dropped by NAME, so both go — not one kept\n  and one lost depending on whether that person ever uploaded a photo.\n\nPass `view: \"full\"` when you want Canvas's payload untouched, avatars and all.\nThat is also why there is deliberately **no `raw` rung**: there is no\nnormalisation layer here for `full` to sit above, so `full` already IS the\nuntouched upstream payload and a third value would silently alias it.\n\nThe other ten tools take no `view`, for two different reasons:\n\n- **Nothing to strip.** `canvas_list_courses`, `canvas_list_assignments`,\n  `canvas_list_missing_submissions`, `canvas_list_enrollments`,\n  `canvas_list_calendar_events`, `canvas_list_upcoming_events` and\n  `canvas_list_planner_items` embed no user object — a live\n  `canvas_list_courses` over twelve courses carried no media field of any kind\n  — and a knob that does not turn is worse than no knob. `canvas_healthcheck`\n  returns a verdict, not a record.\n- **The URL is the product.** `canvas_list_course_files` and\n  `canvas_download_file` exist to hand you a file URL. Compact there would not\n  shrink the response, it would empty it.\n\nPassing `view` to one of those ten is not an error and not a warning: MCP tool\nschemas are non-strict, so the key is dropped and you get that tool's ordinary\noutput.\n\n## Notes\n\n- Set `CANVAS_NAME` if you want a friendly label other than the host portion of the base URL.\n- All read tools that target a user accept an optional `observeeId` parameter (defaults to `self`) — useful when an observer is checking on a linked student.\n\nFile v2.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"canvas-parent\",\n  \"version\": \"2.1.0\",\n  \"publishedAt\": 1789872747833\n}\n\nFile v2.1.0:skill-card.md\n\n## Description:\n\nThis skill helps an agent answer questions about Canvas LMS courses, grades, assignments, announcements, planner items, conversations, and course files for a user's own account or an observed student.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nStudents, parents, observers, and their agents use this skill to inspect Canvas LMS account data, including courses, grades, assignments, missing work, announcements, inbox conversations, planner items, and files. It is most useful when an agent needs to summarize Canvas status or retrieve course materials through the configured Canvas MCP server.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The local MCP process can access sensitive Canvas account data through tokens, credentials, OAuth refresh tokens, or browser session cookies.\n\nMitigation: Use the narrowest supported authentication method, avoid storing passwords in configuration, and install only in environments where this account access is acceptable.\n\nRisk: The recommended fetchproxy mode relies on cookies from a signed-in browser tab.\n\nMitigation: Keep the browser session limited to the intended Canvas instance and disable the fetchproxy fallback when another credential method is preferred.\n\nRisk: The skill can download Canvas course files to local paths.\n\nMitigation: Use explicit destination paths that the user controls and review downloaded files before opening or sharing them.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/canvas-parent)\n- [canvas-parent-mcp npm package](https://www.npmjs.com/package/canvas-parent-mcp)\n- [fetchproxy browser extension](https://github.com/chrischall/fetchproxy)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON configuration and shell command snippets; MCP tool responses may include compact or full Canvas payloads.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Can return Canvas LMS records and file download handles; compact mode strips avatar media fields while preserving link fields.]\n\n## Skill Version(s):\n\n2.1.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.","readmeExcerpt":"Skill: canvas-parent Owner: chrischall Summary: This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announce","codeSnippets":[],"executableExamples":[{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"canvas\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"canvas-parent-mcp\"],\n      \"env\": {\n        \"CANVAS_BASE_URL\": \"https://cms.instructure.com\"\n      }\n    }\n  }\n}"},{"language":"bash","snippet":"git clone https://github.com/chrischall/canvas-parent-mcp\ncd canvas-parent-mcp\nnpm install && npm run build"},{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"canvas\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"canvas-parent-mcp\"],\n      \"env\": {\n        \"CANVAS_BASE_URL\": \"https://cms.instructure.com\"\n      }\n    }\n  }\n}"},{"language":"bash","snippet":"git clone https://github.com/chrischall/canvas-parent-mcp\ncd canvas-parent-mcp\nnpm install && npm run build"},{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"canvas\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"canvas-parent-mcp\"],\n      \"env\": {\n        \"CANVAS_BASE_URL\": \"https://cms.instructure.com\"\n      }\n    }\n  }\n}"},{"language":"bash","snippet":"git clone https://github.com/chrischall/canvas-parent-mcp\ncd canvas-parent-mcp\nnpm install && npm run build"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: canvas-parent\ndescription: This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announcements, planner items, or files in Canvas.\n---\n\n# canvas-parent-mcp\n\nMCP server for Canvas LMS (Instructure) — read courses, grades, assignments, announcements, planner items, and conversations; download course files. Mirrors the parent/observer scope of the sibling `infinitecampus-mcp`.\n\n- **npm:** [npmjs.com/package/canvas-parent-mcp](https://www.npmjs.com/package/canvas-parent-mcp)\n- **Source:** [github.com/chrischall/canvas-parent-mcp](https://github.com/chrischall/canvas-parent-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"canvas\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"canvas-parent-mcp\"],\n      \"env\": {\n        \"CANVAS_BASE_URL\": \"https://cms.instructure.com\"\n      }\n    }\n  }\n}\n```\n\nWith the [ContextMint Bridge](https://github.com/nullnet-app/contextmint-bridge/releases) browser extension installed and a signed-in Canvas tab, that's enough — the MCP reads your session cookies from the browser on the first request and again whenever the session expires, so keep the extension installed and the browser running. Add `CANVAS_TOKEN`, `CANVAS_CLIENT_*`/`CANVAS_REFRESH_TOKEN`, or `CANVAS_USERNAME`/`CANVAS_PASSWORD` to the `env` block if you'd rather use one of those modes.\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/canvas-parent-mcp\ncd canvas-parent-mcp\nnpm install && npm run build\n```\n\n## Authentication\n\n**fetchproxy fallback (recommended, zero-config).** Set only `CANVAS_BASE_URL`. Install the [ContextMint Bridge](https://github.com/nullnet-app/contextmint-bridge/releases) browser extension, sign into your Canvas instance once. The MCP reads `canvas_session` + `pseudonym_credentials` cookies from your tab on the first request and re-reads them on every 401; API calls go directly from Node in between, but the extension must stay reachable to renew the session. Works with any auth flow (SSO/SAML/2FA included). It's the fetchproxy extension under its new name, same maintainer ([fetchproxy's README](https://github.com/chrischall/fetchproxy#extension) points to it); verify a release zip with `shasum -a 256 -c <zip>.sha256` or build it from [source](https://github.com/nullnet-app/contextmint-bridge).\n\n### Alternatives (env-var)\n\n- **Personal access token** — set `CANVAS_TOKEN`. Most institutions have disabled this for non-admins.\n- **OAuth** — set `CANVAS_CLIENT_ID`, `CANVAS_CLIENT_SECRET`, `CANVAS_REFRESH_TOKEN`. Bootstrap via `canvas-parent-mcp-qr-login`.\n- **Username/password (session-scrape)** — set `CANVAS_"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"canvas-parent\",\n  \"version\": \"2.1.9\",\n  \"publishedAt\": 1791588228426\n}"},{"path":"skill-card.md","content":"## Description:\n\nHelps users check courses, grades, assignments, messages, and files in their own or an observed student's Canvas account.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nStudents and parents or other observers use this skill to review Canvas coursework, grades, deadlines, announcements, conversations, and course files for accounts they can access.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Canvas tokens, passwords, or browser session cookies may expose private account records.\n\nMitigation: Use the least-privilege authentication available, protect credentials like passwords, and disable the browser-cookie fallback if live session cookies should not be used.\n\nRisk: Downloaded course files and Canvas responses may contain confidential student information.\n\nMitigation: Limit access to authorized accounts and handle downloaded files and responses as confidential student data.\n\n## Reference(s):\n\n- [Canvas Parent on ClawHub](https://clawhub.ai/chrischall/skills/canvas-parent)\n- [Canvas Parent MCP package](https://www.npmjs.com/package/canvas-parent-mcp)\n- [ContextMint Bridge releases](https://github.com/nullnet-app/contextmint-bridge/releases)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Guidance]\n\n**Output Format:** [Markdown or plain text]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include confidential Canvas student records and links to course files.]\n\n## Skill Version(s):\n\n2.1.9 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announcements, planner items, or files in Canvas. Skill: canvas-parent Owner: chrischall Summary: This skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like \"check Canvas\", \"what's my grade\", \"Canvas inbox\", \"what's due\", \"missing assignments\", \"Canvas LMS\", \"Instructure\", \"course announcements\", \"syllabus\", or any request about courses, assignments, grades, conversations, announce","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1191,"uniquenessScore":46,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T05:40:19.107Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T05:40:19.107Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T10:43:56.911Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}