canvas-design-mcp 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +200 -0
- package/DESIGN.md +288 -0
- package/PROFESSOR-INSTRUCTIONS.txt +131 -0
- package/README.md +250 -0
- package/dist/canvas-api.d.ts +24 -0
- package/dist/canvas-api.d.ts.map +1 -0
- package/dist/canvas-api.js +146 -0
- package/dist/canvas-api.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +22 -0
- package/dist/config.js.map +1 -0
- package/dist/design-engine.d.ts +5 -0
- package/dist/design-engine.d.ts.map +1 -0
- package/dist/design-engine.js +23 -0
- package/dist/design-engine.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +567 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/accessibility.d.ts +7 -0
- package/dist/tools/accessibility.d.ts.map +1 -0
- package/dist/tools/accessibility.js +149 -0
- package/dist/tools/accessibility.js.map +1 -0
- package/dist/tools/contrast.d.ts +2 -0
- package/dist/tools/contrast.d.ts.map +1 -0
- package/dist/tools/contrast.js +7 -0
- package/dist/tools/contrast.js.map +1 -0
- package/dist/tools/critique.d.ts +23 -0
- package/dist/tools/critique.d.ts.map +1 -0
- package/dist/tools/critique.js +194 -0
- package/dist/tools/critique.js.map +1 -0
- package/dist/tools/generate.d.ts +18 -0
- package/dist/tools/generate.d.ts.map +1 -0
- package/dist/tools/generate.js +101 -0
- package/dist/tools/generate.js.map +1 -0
- package/dist/tools/gotchas.d.ts +7 -0
- package/dist/tools/gotchas.d.ts.map +1 -0
- package/dist/tools/gotchas.js +61 -0
- package/dist/tools/gotchas.js.map +1 -0
- package/dist/tools/ingest.d.ts +44 -0
- package/dist/tools/ingest.d.ts.map +1 -0
- package/dist/tools/ingest.js +211 -0
- package/dist/tools/ingest.js.map +1 -0
- package/dist/tools/list-courses.d.ts +16 -0
- package/dist/tools/list-courses.d.ts.map +1 -0
- package/dist/tools/list-courses.js +79 -0
- package/dist/tools/list-courses.js.map +1 -0
- package/dist/tools/page-io.d.ts +19 -0
- package/dist/tools/page-io.d.ts.map +1 -0
- package/dist/tools/page-io.js +77 -0
- package/dist/tools/page-io.js.map +1 -0
- package/dist/tools/panopto.d.ts +36 -0
- package/dist/tools/panopto.d.ts.map +1 -0
- package/dist/tools/panopto.js +188 -0
- package/dist/tools/panopto.js.map +1 -0
- package/dist/tools/personas.d.ts +21 -0
- package/dist/tools/personas.d.ts.map +1 -0
- package/dist/tools/personas.js +464 -0
- package/dist/tools/personas.js.map +1 -0
- package/dist/tools/philosophy.d.ts +21 -0
- package/dist/tools/philosophy.d.ts.map +1 -0
- package/dist/tools/philosophy.js +137 -0
- package/dist/tools/philosophy.js.map +1 -0
- package/dist/tools/publish.d.ts +31 -0
- package/dist/tools/publish.d.ts.map +1 -0
- package/dist/tools/publish.js +198 -0
- package/dist/tools/publish.js.map +1 -0
- package/dist/tools/redesign.d.ts +18 -0
- package/dist/tools/redesign.d.ts.map +1 -0
- package/dist/tools/redesign.js +68 -0
- package/dist/tools/redesign.js.map +1 -0
- package/dist/tools/update-kb.d.ts +10 -0
- package/dist/tools/update-kb.d.ts.map +1 -0
- package/dist/tools/update-kb.js +93 -0
- package/dist/tools/update-kb.js.map +1 -0
- package/dist/tools/validate.d.ts +10 -0
- package/dist/tools/validate.d.ts.map +1 -0
- package/dist/tools/validate.js +76 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/wizard.d.ts +3 -0
- package/dist/wizard.d.ts.map +1 -0
- package/dist/wizard.js +229 -0
- package/dist/wizard.js.map +1 -0
- package/docs/canvas-design-kb/00-meta/Changelog.md +42 -0
- package/docs/canvas-design-kb/00-meta/Contributing.md +58 -0
- package/docs/canvas-design-kb/00-meta/KB-Overview.md +51 -0
- package/docs/canvas-design-kb/01-canvas-rce/CSS-Inline-Strategy.md +166 -0
- package/docs/canvas-design-kb/01-canvas-rce/Canvas-Built-In-CSS-Classes.md +243 -0
- package/docs/canvas-design-kb/01-canvas-rce/Canvas-Page-Types.md +59 -0
- package/docs/canvas-design-kb/01-canvas-rce/HTML-Allowlist.md +204 -0
- package/docs/canvas-design-kb/01-canvas-rce/RCE-Limitations-and-Workarounds.md +151 -0
- package/docs/canvas-design-kb/01-canvas-rce/RCE-Overview.md +92 -0
- package/docs/canvas-design-kb/02-design-md/DESIGN-MD-Canvas-Template.md +323 -0
- package/docs/canvas-design-kb/02-design-md/DESIGN-MD-File-Structure.md +245 -0
- package/docs/canvas-design-kb/02-design-md/DESIGN-MD-Overview.md +120 -0
- package/docs/canvas-design-kb/02-design-md/DESIGN-MD-Toolchain.md +234 -0
- package/docs/canvas-design-kb/03-design-systems/Color-and-Typography.md +146 -0
- package/docs/canvas-design-kb/03-design-systems/Component-Library.md +299 -0
- package/docs/canvas-design-kb/03-design-systems/Design-System-Principles.md +99 -0
- package/docs/canvas-design-kb/04-tools/Canvas-Theme-Editor.md +40 -0
- package/docs/canvas-design-kb/04-tools/Other-Canvas-Design-Tools.md +47 -0
- package/docs/canvas-design-kb/05-patterns/Course-Home-Page.md +224 -0
- package/docs/canvas-design-kb/06-accessibility/Accessibility-Overview.md +128 -0
- package/docs/canvas-design-kb/07-resources/Inspiration-and-Showcases.md +121 -0
- package/docs/canvas-design-kb/07-resources/Official-Canvas-Links.md +54 -0
- package/docs/canvas-design-kb/README.md +58 -0
- package/docs/feature-roadmap.md +123 -0
- package/docs/installation.md +340 -0
- package/package.json +45 -0
- package/scripts/deploy-public.ps1 +68 -0
- package/src/kb/design-principles.md +45 -0
- package/src/templates/ignite-assignment-page.html +203 -0
- package/src/templates/two-column-dashboard.html +33 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { CanvasApiClient } from './canvas-api.js';
|
|
6
|
+
import { configExists, loadConfig, saveConfig } from './config.js';
|
|
7
|
+
import { runWizard } from './wizard.js';
|
|
8
|
+
import { validateCanvasHtml } from './tools/validate.js';
|
|
9
|
+
import { generateCanvasPage } from './tools/generate.js';
|
|
10
|
+
import { updateCanvasKb } from './tools/update-kb.js';
|
|
11
|
+
import { listCanvasCourses } from './tools/list-courses.js';
|
|
12
|
+
import { publishToCanvas } from './tools/publish.js';
|
|
13
|
+
import { auditAccessibility } from './tools/accessibility.js';
|
|
14
|
+
import { critiqueCanvasPage } from './tools/critique.js';
|
|
15
|
+
import { redesignCanvasPage } from './tools/redesign.js';
|
|
16
|
+
import { searchPanoptoVideos, embedPanoptoVideo, fetchPanoptoCaptions, } from './tools/panopto.js';
|
|
17
|
+
import { ingestAssignmentFolder } from './tools/ingest.js';
|
|
18
|
+
import { getPhilosophyKb, updatePhilosophyKb } from './tools/philosophy.js';
|
|
19
|
+
import { generateStudentPersonas, getStudentPersonas } from './tools/personas.js';
|
|
20
|
+
import { loadCanvasPage, saveCanvasPage } from './tools/page-io.js';
|
|
21
|
+
async function main() {
|
|
22
|
+
if (!configExists()) {
|
|
23
|
+
if (!process.stdin.isTTY) {
|
|
24
|
+
process.stderr.write('Error: No institution config found.\n' +
|
|
25
|
+
'Run the setup wizard on your host machine first:\n\n' +
|
|
26
|
+
' npx canvas-design-mcp\n\n' +
|
|
27
|
+
'Then mount the config when running Docker:\n\n' +
|
|
28
|
+
' docker run -i --rm \\\n' +
|
|
29
|
+
' -v ~/.canvas-design-mcp:/root/.canvas-design-mcp \\\n' +
|
|
30
|
+
' ghcr.io/ryfter/canvas-design-studio:latest\n');
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
await runWizard();
|
|
34
|
+
}
|
|
35
|
+
const server = new Server({ name: 'canvas-design-studio', version: '0.1.0' }, { capabilities: { tools: {} } });
|
|
36
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
37
|
+
tools: [
|
|
38
|
+
{
|
|
39
|
+
name: 'setup_institution',
|
|
40
|
+
description: 'Re-run the setup wizard to update institution config (brand colors, Canvas URL, API token). Run this to change institutions or rotate credentials.',
|
|
41
|
+
inputSchema: { type: 'object', properties: {} },
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'generate_canvas_page',
|
|
45
|
+
description: 'Generate a beautiful, Canvas-safe HTML assignment page from a brief. Returns HTML ready to paste into Canvas, a hero image prompt for ChatGPT, and the suggested filename. If the professor philosophy KB is in context, apply the professor\'s tone, framing, and pedagogical emphasis preferences when generating content.',
|
|
46
|
+
inputSchema: {
|
|
47
|
+
type: 'object',
|
|
48
|
+
required: ['assignmentBrief', 'courseName', 'courseNumber', 'assignmentNumber', 'professorName', 'semester'],
|
|
49
|
+
properties: {
|
|
50
|
+
assignmentBrief: { type: 'string', description: 'Raw assignment instructions — paste from Word, email, or notes. Claude will rewrite into polished student-friendly copy.' },
|
|
51
|
+
courseName: { type: 'string', description: 'e.g. AI Augmented Projects' },
|
|
52
|
+
courseNumber: { type: 'string', description: 'e.g. ITM 370' },
|
|
53
|
+
assignmentNumber: { type: 'string', description: 'e.g. 16.06' },
|
|
54
|
+
professorName: { type: 'string', description: 'e.g. Dr. Rank' },
|
|
55
|
+
semester: { type: 'string', description: 'e.g. Fall 2026' },
|
|
56
|
+
styleNotes: { type: 'string', description: 'Optional layout or tone preferences. e.g. "two-column, energetic tone, include a resources sidebar"' },
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: 'validate_canvas_html',
|
|
62
|
+
description: 'Check any HTML string against Canvas RCE compliance rules. Returns a list of violations with the offending snippets. Use before pasting into Canvas.',
|
|
63
|
+
inputSchema: {
|
|
64
|
+
type: 'object',
|
|
65
|
+
required: ['html'],
|
|
66
|
+
properties: {
|
|
67
|
+
html: { type: 'string', description: 'HTML string to validate' },
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'update_canvas_kb',
|
|
73
|
+
description: 'Refresh the Canvas knowledge base from live Instructure documentation via Context7. Run periodically to keep validation rules and component references current.',
|
|
74
|
+
inputSchema: {
|
|
75
|
+
type: 'object',
|
|
76
|
+
properties: {
|
|
77
|
+
force: { type: 'boolean', description: 'Force update even if KB was recently refreshed' },
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: 'list_canvas_courses',
|
|
83
|
+
description: 'List Canvas courses available to the configured professor, with semester filtering, favorite pinning, and course metadata to help choose the right course.',
|
|
84
|
+
inputSchema: {
|
|
85
|
+
type: 'object',
|
|
86
|
+
properties: {
|
|
87
|
+
semester: {
|
|
88
|
+
type: 'string',
|
|
89
|
+
enum: ['current', 'future', 'past', 'all'],
|
|
90
|
+
description: 'Course filter: current active courses, future invited/pending courses, past completed courses, or all courses.',
|
|
91
|
+
},
|
|
92
|
+
includeFavorites: {
|
|
93
|
+
type: 'boolean',
|
|
94
|
+
description: 'Pin configured favorite course IDs to the top. Defaults to true.',
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: 'publish_to_canvas',
|
|
101
|
+
description: 'Validate and publish Canvas-safe HTML to a Canvas course page. Detects FERPA risks, validation issues, and similar existing page titles before writing.',
|
|
102
|
+
inputSchema: {
|
|
103
|
+
type: 'object',
|
|
104
|
+
required: ['courseId', 'html', 'pageTitle'],
|
|
105
|
+
properties: {
|
|
106
|
+
courseId: { type: 'number', description: 'Canvas course ID from list_canvas_courses.' },
|
|
107
|
+
html: { type: 'string', description: 'Canvas-safe HTML to publish.' },
|
|
108
|
+
pageTitle: { type: 'string', description: 'Canvas page title.' },
|
|
109
|
+
forcePublish: { type: 'boolean', description: 'Skip Canvas HTML validation gate. Defaults to false.' },
|
|
110
|
+
skipFerpaCheck: { type: 'boolean', description: 'Skip FERPA/PII scan. Defaults to false.' },
|
|
111
|
+
collisionAction: {
|
|
112
|
+
type: 'string',
|
|
113
|
+
enum: ['update', 'create', 'related', 'cancel'],
|
|
114
|
+
description: 'Use only after a TITLE_COLLISION response to choose how to proceed.',
|
|
115
|
+
},
|
|
116
|
+
relatedPageTitle: {
|
|
117
|
+
type: 'string',
|
|
118
|
+
description: 'Required when collisionAction is related.',
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: 'critique_canvas_page',
|
|
125
|
+
description: 'Evaluate a Canvas HTML page for visual design quality. Returns a score, strengths, and prioritized findings. Use quick mode for a fast structural check; comprehensive mode for a full design review with KB context for Claude to reason about. If the professor philosophy KB is in context, evaluate the page against the professor\'s stated standards and teaching philosophy. If student personas are in context, factor their backgrounds into the findings where relevant.',
|
|
126
|
+
inputSchema: {
|
|
127
|
+
type: 'object',
|
|
128
|
+
required: ['html', 'pageType', 'primaryGoal'],
|
|
129
|
+
properties: {
|
|
130
|
+
html: { type: 'string', description: 'Canvas HTML to evaluate.' },
|
|
131
|
+
pageType: {
|
|
132
|
+
type: 'string',
|
|
133
|
+
enum: ['assignment', 'week-overview', 'course-home', 'syllabus', 'other'],
|
|
134
|
+
description: 'Type of Canvas page — informs which checks apply.',
|
|
135
|
+
},
|
|
136
|
+
primaryGoal: { type: 'string', description: 'What a student should do or understand from this page. e.g. "Submit the video project" or "Know what to read this week."' },
|
|
137
|
+
audience: { type: 'string', description: 'Optional. e.g. "first-year undergrads" or "graduate students".' },
|
|
138
|
+
mode: {
|
|
139
|
+
type: 'string',
|
|
140
|
+
enum: ['quick', 'comprehensive'],
|
|
141
|
+
description: 'quick: fast code-based checks only. comprehensive: adds KB design principles to the response for deeper Claude analysis. Defaults to quick.',
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: 'redesign_canvas_page',
|
|
148
|
+
description: 'Apply design fixes to Canvas HTML based on critique findings. Applies mechanical fixes automatically; returns remaining findings and KB context for Claude to address. Runs WCAG 2.1 AA accessibility check on output. If the professor philosophy KB is in context, redesign toward the professor\'s aesthetic and pedagogical preferences.',
|
|
149
|
+
inputSchema: {
|
|
150
|
+
type: 'object',
|
|
151
|
+
required: ['html', 'findings'],
|
|
152
|
+
properties: {
|
|
153
|
+
html: { type: 'string', description: 'Original Canvas HTML to fix.' },
|
|
154
|
+
findings: { type: 'array', description: 'findings array from critique_canvas_page output.' },
|
|
155
|
+
mode: {
|
|
156
|
+
type: 'string',
|
|
157
|
+
enum: ['quick', 'comprehensive'],
|
|
158
|
+
description: 'quick: mechanical fixes only. comprehensive: mechanical fixes + KB context for Claude to complete the redesign. Defaults to quick.',
|
|
159
|
+
},
|
|
160
|
+
pageType: { type: 'string', description: 'Optional. Helps Claude in comprehensive mode.' },
|
|
161
|
+
primaryGoal: { type: 'string', description: 'Optional. Helps Claude in comprehensive mode.' },
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
name: 'search_panopto_videos',
|
|
167
|
+
description: 'Search or browse your Panopto video library. Omit the query to list all videos. Returns video IDs, titles, durations, and captions status. Paginates automatically — a full semester of videos comes back in one call. Requires Panopto API credentials configured during setup.',
|
|
168
|
+
inputSchema: {
|
|
169
|
+
type: 'object',
|
|
170
|
+
properties: {
|
|
171
|
+
query: { type: 'string', description: 'Search terms. Omit to list all videos in your library.' },
|
|
172
|
+
limit: { type: 'number', description: 'Maximum results to return. Default: all (capped at 500).' },
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
name: 'embed_panopto_video',
|
|
178
|
+
description: 'Generate Canvas-safe HTML to embed a Panopto video. Works without API credentials (provide the video ID and title manually). When API is configured, fetches the video title and verifies captions. Generates an iframe embed if Panopto is whitelisted in Canvas, or an accessible fallback link if not.',
|
|
179
|
+
inputSchema: {
|
|
180
|
+
type: 'object',
|
|
181
|
+
required: ['videoId', 'placement'],
|
|
182
|
+
properties: {
|
|
183
|
+
videoId: { type: 'string', description: 'Panopto video ID (UUID from search_panopto_videos or the Panopto URL).' },
|
|
184
|
+
placement: {
|
|
185
|
+
type: 'string',
|
|
186
|
+
enum: ['inline', 'full-page'],
|
|
187
|
+
description: 'inline: embed returned as-is for inserting into a content card. full-page: wrapped in a centered 720px container.',
|
|
188
|
+
},
|
|
189
|
+
title: { type: 'string', description: 'Video title used for the accessibility label. If omitted and API is configured, fetched automatically.' },
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
name: 'fetch_panopto_captions',
|
|
195
|
+
description: 'Download captions for a Panopto video, strip timestamps, and save the plain-text transcript to ~/.canvas-design-mcp/transcripts/ as a Markdown file. Use to build a searchable lecture knowledge base. Requires Panopto API credentials.',
|
|
196
|
+
inputSchema: {
|
|
197
|
+
type: 'object',
|
|
198
|
+
required: ['videoId'],
|
|
199
|
+
properties: {
|
|
200
|
+
videoId: { type: 'string', description: 'Panopto video ID (UUID).' },
|
|
201
|
+
title: { type: 'string', description: 'Video title — used for the saved filename. If omitted, videoId is used.' },
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
name: 'ingest_assignment_folder',
|
|
207
|
+
description: 'Read assignment materials from a folder and generate a Canvas-safe HTML page. ' +
|
|
208
|
+
'Supports simple mode (ingest/ folder with up to 5 files) and advanced mode ' +
|
|
209
|
+
'(assignments/{id}/ subfolders with shared rubric and shell inheritance for assignment groups). ' +
|
|
210
|
+
'Returns the generated HTML alongside the raw brief, rubric, and shell content so Claude can ' +
|
|
211
|
+
'review brief clarity, rubric alignment, and shell completeness. ' +
|
|
212
|
+
'Brief and style-notes are per-assignment; rubric and shell are inherited from parent folders if not present locally. ' +
|
|
213
|
+
'If the professor philosophy KB is in context, apply it when generating the page and note any alignment between the assignment materials and the professor\'s philosophy. ' +
|
|
214
|
+
'If student personas are in context, consider their backgrounds when noting alignment gaps between assignment materials and student needs.',
|
|
215
|
+
inputSchema: {
|
|
216
|
+
type: 'object',
|
|
217
|
+
properties: {
|
|
218
|
+
folderPath: {
|
|
219
|
+
type: 'string',
|
|
220
|
+
description: 'Path to the assignment folder, relative to the project root. ' +
|
|
221
|
+
'Defaults to "ingest/" if omitted. ' +
|
|
222
|
+
'For advanced mode, point at a specific assignment subfolder ' +
|
|
223
|
+
'(e.g., "assignments/ai-challenge/week-01").',
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
name: 'get_philosophy_kb',
|
|
230
|
+
description: 'Load the professor\'s teaching philosophy KB into context. Returns the full KB content, whether it exists, and which sections have been populated. Call once at the start of a session when working on Canvas pages. If the KB does not exist yet, returns an empty template with interview questions embedded so you can build it through conversation.',
|
|
231
|
+
inputSchema: { type: 'object', properties: {} },
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
name: 'update_philosophy_kb',
|
|
235
|
+
description: 'Append a new entry to the professor\'s philosophy KB. Use after a professor shares a quote, teaching insight, or course-specific note. Also used to save Panopto-sourced statements after professor approval. Never overwrites existing content — always appends.',
|
|
236
|
+
inputSchema: {
|
|
237
|
+
type: 'object',
|
|
238
|
+
required: ['entry', 'section'],
|
|
239
|
+
properties: {
|
|
240
|
+
entry: { type: 'string', description: 'Content to add to the specified section.' },
|
|
241
|
+
section: {
|
|
242
|
+
type: 'string',
|
|
243
|
+
enum: ['core', 'course', 'quotes', 'lectures'],
|
|
244
|
+
description: 'core: Core Teaching Philosophy (applies to all courses). course: Course-Specific Focus (requires courseKey). quotes: Quotes & Aphorisms. lectures: From Lecture Captures.',
|
|
245
|
+
},
|
|
246
|
+
courseKey: {
|
|
247
|
+
type: 'string',
|
|
248
|
+
description: 'Required when section is "course". The course identifier, e.g. "ITM 370 — AI Augmented Projects".',
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
name: 'get_student_personas',
|
|
255
|
+
description: 'Load saved student personas into context. If personas have been generated previously, returns them and asks whether to reuse or generate a new set. If none exist, returns an empty template and instructs you to call generate_student_personas. Call this at the start of any persona review session before asking the professor what to do.',
|
|
256
|
+
inputSchema: { type: 'object', properties: {} },
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
name: 'generate_student_personas',
|
|
260
|
+
description: 'Generate statistically grounded student personas using real demographic distributions for race/ethnicity and learning disabilities/challenges, with randomized values across 21 other dimensions (age, work/study balance, financial situation, motivation, confidence, etc.). Saves to ~/.canvas-design-mcp/student-personas.md and returns the full content. Always overwrites any existing saved personas — this is a fresh start.',
|
|
261
|
+
inputSchema: {
|
|
262
|
+
type: 'object',
|
|
263
|
+
properties: {
|
|
264
|
+
count: {
|
|
265
|
+
type: 'number',
|
|
266
|
+
description: 'Number of personas to generate. Default 3. Min 1, max 20.',
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
name: 'load_canvas_page',
|
|
273
|
+
description: 'Load the most recently generated Canvas HTML page from output/ back into context. Use after critique_canvas_page or get_student_personas to retrieve the HTML you want to improve. Returns the HTML content and filename — pass the filename unchanged to save_canvas_page when done editing.',
|
|
274
|
+
inputSchema: {
|
|
275
|
+
type: 'object',
|
|
276
|
+
properties: {
|
|
277
|
+
filename: { type: 'string', description: 'Specific file to load from output/. If omitted, loads the most recently modified .html file.' },
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
name: 'save_canvas_page',
|
|
283
|
+
description: 'Save improved Canvas HTML back to output/, automatically creating a .bak backup of the previous version. Call this after editing the HTML loaded with load_canvas_page. The filename returned by load_canvas_page should be passed here unchanged.',
|
|
284
|
+
inputSchema: {
|
|
285
|
+
type: 'object',
|
|
286
|
+
required: ['html', 'filename'],
|
|
287
|
+
properties: {
|
|
288
|
+
html: { type: 'string', description: 'The full improved HTML to write to disk.' },
|
|
289
|
+
filename: { type: 'string', description: 'Filename within output/ — use the filename returned by load_canvas_page.' },
|
|
290
|
+
},
|
|
291
|
+
},
|
|
292
|
+
},
|
|
293
|
+
],
|
|
294
|
+
}));
|
|
295
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
296
|
+
const { name, arguments: args } = request.params;
|
|
297
|
+
try {
|
|
298
|
+
if (name === 'setup_institution') {
|
|
299
|
+
await runWizard();
|
|
300
|
+
return {
|
|
301
|
+
content: [{ type: 'text', text: 'Institution config updated. Canvas Design Studio is ready.' }],
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
if (name === 'validate_canvas_html') {
|
|
305
|
+
const { html } = args;
|
|
306
|
+
const rce = validateCanvasHtml(html);
|
|
307
|
+
const a11y = auditAccessibility(html);
|
|
308
|
+
const rceSummary = rce.valid
|
|
309
|
+
? '✓ Canvas RCE: HTML is Canvas-compliant. No violations found.'
|
|
310
|
+
: `✗ Canvas RCE: ${rce.violations.length} violation(s) found:\n\n` +
|
|
311
|
+
rce.violations.map((v, i) => `${i + 1}. ${v.rule}\n Context: ${v.context}`).join('\n\n');
|
|
312
|
+
const a11ySummary = a11y.length === 0
|
|
313
|
+
? '✓ Accessibility (WCAG 2.1 AA): No issues found.'
|
|
314
|
+
: `⚠ Accessibility (WCAG 2.1 AA — advisory): ${a11y.length} issue(s) found:\n\n` +
|
|
315
|
+
a11y.map((w, i) => `${i + 1}. ${w.check}: ${w.message}${w.context ? `\n Context: ${w.context}` : ''}`).join('\n\n');
|
|
316
|
+
return {
|
|
317
|
+
content: [{ type: 'text', text: `${rceSummary}\n\n${a11ySummary}` }],
|
|
318
|
+
isError: !rce.valid,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
if (name === 'generate_canvas_page') {
|
|
322
|
+
const config = loadConfig();
|
|
323
|
+
const result = generateCanvasPage(args, config);
|
|
324
|
+
const response = [
|
|
325
|
+
`✓ Page generated: ${result.filename}`,
|
|
326
|
+
result.warnings.length > 0
|
|
327
|
+
? `\n⚠ Warnings:\n${result.warnings.map(w => ` • ${w}`).join('\n')}`
|
|
328
|
+
: '',
|
|
329
|
+
`\n📸 Hero image prompt (1200×400px):\n${result.heroImagePrompt}`,
|
|
330
|
+
`\n\`\`\`html\n${result.html}\n\`\`\``,
|
|
331
|
+
].join('');
|
|
332
|
+
return { content: [{ type: 'text', text: response }] };
|
|
333
|
+
}
|
|
334
|
+
if (name === 'update_canvas_kb') {
|
|
335
|
+
const { force } = (args ?? {});
|
|
336
|
+
const result = await updateCanvasKb(force ?? false);
|
|
337
|
+
const lines = [];
|
|
338
|
+
if (!result.updated && result.changes.length === 0) {
|
|
339
|
+
lines.push(`✓ KB is current (last checked: ${result.lastChecked})`);
|
|
340
|
+
lines.push(` ${result.cssPropsCount} CSS properties · ${result.htmlTagsCount} HTML tags tracked`);
|
|
341
|
+
}
|
|
342
|
+
else if (result.parseWarning) {
|
|
343
|
+
lines.push(`⚠ ${result.parseWarning}`);
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
lines.push(`✓ KB updated from Canvas LMS source (${result.lastChecked})`);
|
|
347
|
+
lines.push(` ${result.cssPropsCount} CSS properties · ${result.htmlTagsCount} HTML tags`);
|
|
348
|
+
if (result.changes.length > 0) {
|
|
349
|
+
lines.push(`\nChanges:\n${result.changes.map(c => ` ${c}`).join('\n')}`);
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
lines.push(' No changes detected — allowlist is unchanged.');
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
356
|
+
}
|
|
357
|
+
if (name === 'list_canvas_courses') {
|
|
358
|
+
const config = loadConfig();
|
|
359
|
+
const api = new CanvasApiClient(config);
|
|
360
|
+
const result = await listCanvasCourses((args ?? {}), config, api, saveConfig);
|
|
361
|
+
return { content: [{ type: 'text', text: result.text }] };
|
|
362
|
+
}
|
|
363
|
+
if (name === 'publish_to_canvas') {
|
|
364
|
+
const config = loadConfig();
|
|
365
|
+
const api = new CanvasApiClient(config);
|
|
366
|
+
const result = await publishToCanvas(args, config, api);
|
|
367
|
+
return {
|
|
368
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
369
|
+
isError: 'error' in result,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
if (name === 'critique_canvas_page') {
|
|
373
|
+
const input = args;
|
|
374
|
+
const result = critiqueCanvasPage(input);
|
|
375
|
+
const lines = [];
|
|
376
|
+
lines.push(`Design Score: ${result.score}/100 (${result.mode} mode${input.pageType ? ` — ${input.pageType}` : ''})`);
|
|
377
|
+
if (result.strengths.length > 0) {
|
|
378
|
+
lines.push(`\n\nStrengths:\n${result.strengths.map(s => ` ✓ ${s}`).join('\n')}`);
|
|
379
|
+
}
|
|
380
|
+
if (result.findings.length === 0) {
|
|
381
|
+
lines.push('\n\n✓ No design issues found.');
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
for (const p of ['high', 'medium', 'low']) {
|
|
385
|
+
const group = result.findings.filter(f => f.priority === p);
|
|
386
|
+
if (group.length === 0)
|
|
387
|
+
continue;
|
|
388
|
+
lines.push(`\n\n${p.toUpperCase()} priority:\n` +
|
|
389
|
+
group.map(f => ` [${f.area}] ${f.issue}\n → ${f.suggestion}`).join('\n'));
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
if (result.kbContext) {
|
|
393
|
+
lines.push(`\n\n---\nDesign KB (comprehensive mode):\n${result.kbContext}`);
|
|
394
|
+
}
|
|
395
|
+
return { content: [{ type: 'text', text: lines.join('') }] };
|
|
396
|
+
}
|
|
397
|
+
if (name === 'redesign_canvas_page') {
|
|
398
|
+
const input = args;
|
|
399
|
+
const result = redesignCanvasPage(input);
|
|
400
|
+
const lines = [];
|
|
401
|
+
if (result.appliedFixes.length > 0) {
|
|
402
|
+
lines.push(`✓ Applied ${result.appliedFixes.length} fix(es):\n${result.appliedFixes.map(f => ` • ${f}`).join('\n')}`);
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
lines.push('No mechanical fixes were applicable.');
|
|
406
|
+
}
|
|
407
|
+
if (result.skippedFindings.length > 0) {
|
|
408
|
+
lines.push(`\n\n⚠ ${result.skippedFindings.length} finding(s) need manual attention:\n` +
|
|
409
|
+
result.skippedFindings.map(s => ` • ${s}`).join('\n'));
|
|
410
|
+
}
|
|
411
|
+
if (result.accessibilityWarnings?.length) {
|
|
412
|
+
lines.push(`\n\nAccessibility (WCAG 2.1 AA — advisory):\n` +
|
|
413
|
+
result.accessibilityWarnings.map(w => ` ⚠ ${w.check}: ${w.message}`).join('\n'));
|
|
414
|
+
}
|
|
415
|
+
if (result.kbContext) {
|
|
416
|
+
lines.push(`\n\n---\nDesign KB (use this to complete remaining fixes):\n${result.kbContext}`);
|
|
417
|
+
}
|
|
418
|
+
lines.push(`\n\n\`\`\`html\n${result.html}\n\`\`\``);
|
|
419
|
+
return { content: [{ type: 'text', text: lines.join('') }] };
|
|
420
|
+
}
|
|
421
|
+
if (name === 'search_panopto_videos') {
|
|
422
|
+
const config = loadConfig();
|
|
423
|
+
if (!config.panopto) {
|
|
424
|
+
return {
|
|
425
|
+
content: [{ type: 'text', text: 'Panopto is not configured. Run setup_institution to add Panopto settings.' }],
|
|
426
|
+
isError: true,
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
const { query, limit } = (args ?? {});
|
|
430
|
+
const result = await searchPanoptoVideos({ query, limit }, config.panopto);
|
|
431
|
+
const isApiError = result.startsWith('API_NOT_CONFIGURED');
|
|
432
|
+
return { content: [{ type: 'text', text: result }], ...(isApiError ? { isError: true } : {}) };
|
|
433
|
+
}
|
|
434
|
+
if (name === 'embed_panopto_video') {
|
|
435
|
+
const config = loadConfig();
|
|
436
|
+
if (!config.panopto) {
|
|
437
|
+
return {
|
|
438
|
+
content: [{ type: 'text', text: 'Panopto is not configured. Run setup_institution to add Panopto settings.' }],
|
|
439
|
+
isError: true,
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
const { videoId, placement, title } = args;
|
|
443
|
+
const result = await embedPanoptoVideo({ videoId, placement, title }, config.panopto);
|
|
444
|
+
const lines = [`Video: ${result.videoTitle}`];
|
|
445
|
+
if (result.captionWarning)
|
|
446
|
+
lines.push(`⚠ ${result.captionWarning}`);
|
|
447
|
+
lines.push(`Embed type: ${result.iframeUsed ? 'iframe (whitelisted)' : 'fallback link'}`);
|
|
448
|
+
lines.push(`\n\`\`\`html\n${result.html}\n\`\`\``);
|
|
449
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
450
|
+
}
|
|
451
|
+
if (name === 'fetch_panopto_captions') {
|
|
452
|
+
const config = loadConfig();
|
|
453
|
+
if (!config.panopto) {
|
|
454
|
+
return {
|
|
455
|
+
content: [{ type: 'text', text: 'Panopto is not configured. Run setup_institution to add Panopto settings.' }],
|
|
456
|
+
isError: true,
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
const { videoId, title } = args;
|
|
460
|
+
const result = await fetchPanoptoCaptions({ videoId, title }, config.panopto);
|
|
461
|
+
const isApiError = result.startsWith('API_NOT_CONFIGURED');
|
|
462
|
+
return { content: [{ type: 'text', text: result }], ...(isApiError ? { isError: true } : {}) };
|
|
463
|
+
}
|
|
464
|
+
if (name === 'ingest_assignment_folder') {
|
|
465
|
+
const config = loadConfig();
|
|
466
|
+
const { folderPath } = (args ?? {});
|
|
467
|
+
const result = ingestAssignmentFolder({ folderPath }, config);
|
|
468
|
+
const lines = [
|
|
469
|
+
`✓ Generated: ${result.filename}`,
|
|
470
|
+
` Course: ${result.courseInfo.courseName} (${result.courseInfo.courseNumber})`,
|
|
471
|
+
` Assignment: ${result.courseInfo.assignmentNumber} — ${result.courseInfo.semester}`,
|
|
472
|
+
` Brief: ${result.sources.sourceMap.brief}`,
|
|
473
|
+
];
|
|
474
|
+
if (result.sources.rubric)
|
|
475
|
+
lines.push(` Rubric: ${result.sources.sourceMap.rubric}`);
|
|
476
|
+
if (result.sources.shell)
|
|
477
|
+
lines.push(` Shell: ${result.sources.sourceMap.shell}`);
|
|
478
|
+
if (result.sources.styleNotes)
|
|
479
|
+
lines.push(` Style Notes: ${result.sources.sourceMap.styleNotes}`);
|
|
480
|
+
if (result.warnings.length > 0) {
|
|
481
|
+
lines.push(`\n⚠ Warnings:\n${result.warnings.map(w => ` • ${w}`).join('\n')}`);
|
|
482
|
+
}
|
|
483
|
+
if (result.heroImagePrompt) {
|
|
484
|
+
lines.push(`\n📸 Hero image prompt (1200×400px):\n${result.heroImagePrompt}`);
|
|
485
|
+
}
|
|
486
|
+
// Return raw sources so Claude can review brief/rubric/shell alignment
|
|
487
|
+
lines.push(`\n---\n**Source content for review:**`);
|
|
488
|
+
lines.push(`\n**Brief:**\n${result.sources.brief}`);
|
|
489
|
+
if (result.sources.rubric)
|
|
490
|
+
lines.push(`\n**Rubric:**\n${result.sources.rubric}`);
|
|
491
|
+
if (result.sources.shell)
|
|
492
|
+
lines.push(`\n**Shell:**\n${result.sources.shell}`);
|
|
493
|
+
if (result.sources.styleNotes)
|
|
494
|
+
lines.push(`\n**Style Notes:**\n${result.sources.styleNotes}`);
|
|
495
|
+
lines.push(`\n\`\`\`html\n${result.html}\n\`\`\``);
|
|
496
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
497
|
+
}
|
|
498
|
+
if (name === 'get_philosophy_kb') {
|
|
499
|
+
const result = getPhilosophyKb();
|
|
500
|
+
const lines = [];
|
|
501
|
+
if (!result.exists) {
|
|
502
|
+
lines.push('> No philosophy KB found. Returning template with interview questions.');
|
|
503
|
+
lines.push('> To build the KB: run setup_institution or ask the professor the interview questions and call update_philosophy_kb for each answer.');
|
|
504
|
+
}
|
|
505
|
+
lines.push('> Apply this philosophy when generating, critiquing, or redesigning Canvas pages for this professor.');
|
|
506
|
+
lines.push('');
|
|
507
|
+
lines.push(`Sections populated — Core: ${result.sections.hasCore}, Course-specific: ${result.sections.hasCourseSpecific}, Quotes: ${result.sections.hasQuotes}, Lecture captures: ${result.sections.hasLectureCaptures}`);
|
|
508
|
+
lines.push('');
|
|
509
|
+
lines.push(result.content);
|
|
510
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
511
|
+
}
|
|
512
|
+
if (name === 'update_philosophy_kb') {
|
|
513
|
+
const input = args;
|
|
514
|
+
const result = updatePhilosophyKb(input);
|
|
515
|
+
return { content: [{ type: 'text', text: result }] };
|
|
516
|
+
}
|
|
517
|
+
if (name === 'get_student_personas') {
|
|
518
|
+
const result = getStudentPersonas();
|
|
519
|
+
const lines = [];
|
|
520
|
+
if (result.exists) {
|
|
521
|
+
lines.push('> Saved personas found. Ask the professor whether to reuse these or generate a new set before reviewing.');
|
|
522
|
+
}
|
|
523
|
+
else {
|
|
524
|
+
lines.push('> No personas saved yet. Ask the professor how many to generate, then call generate_student_personas.');
|
|
525
|
+
}
|
|
526
|
+
lines.push('');
|
|
527
|
+
lines.push(result.content);
|
|
528
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
529
|
+
}
|
|
530
|
+
if (name === 'generate_student_personas') {
|
|
531
|
+
const input = (args ?? {});
|
|
532
|
+
const result = generateStudentPersonas(input);
|
|
533
|
+
return { content: [{ type: 'text', text: result }] };
|
|
534
|
+
}
|
|
535
|
+
if (name === 'load_canvas_page') {
|
|
536
|
+
const { filename } = (args ?? {});
|
|
537
|
+
const result = loadCanvasPage({ filename });
|
|
538
|
+
return {
|
|
539
|
+
content: [{
|
|
540
|
+
type: 'text',
|
|
541
|
+
text: `Loaded: ${result.filename}\n\n\`\`\`html\n${result.html}\n\`\`\``,
|
|
542
|
+
}],
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
if (name === 'save_canvas_page') {
|
|
546
|
+
const { html, filename } = args;
|
|
547
|
+
const result = saveCanvasPage({ html, filename });
|
|
548
|
+
const lines = [`✓ Saved to ${result.saved}`];
|
|
549
|
+
if (result.backup)
|
|
550
|
+
lines.push(` Backup created: ${result.backup}`);
|
|
551
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
552
|
+
}
|
|
553
|
+
return {
|
|
554
|
+
content: [{ type: 'text', text: `Unknown tool: ${name}` }],
|
|
555
|
+
isError: true,
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
catch (err) {
|
|
559
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
560
|
+
return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
const transport = new StdioServerTransport();
|
|
564
|
+
await server.connect(transport);
|
|
565
|
+
}
|
|
566
|
+
main().catch(console.error);
|
|
567
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accessibility.d.ts","sourceRoot":"","sources":["../../src/tools/accessibility.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAmJD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAUvE"}
|