Open-source MCP server that gives AI assistants a visual design canvas, rendering HTML/CSS scene graphs to PNG via headless Chromium.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http counts 60 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
apply_preset
-
apply_structure
-
batch_design
-
canvas_add_variant
-
canvas_archive
-
canvas_autofix
-
canvas_bind
-
canvas_check_drift
-
canvas_create
-
canvas_delete
-
canvas_diff
-
canvas_evaluate
-
canvas_import_html
-
canvas_import_url
-
canvas_list
-
canvas_move
-
canvas_revise
-
canvas_set_genre
-
canvas_stress
-
canvas_sync_from_url
-
canvas_unarchive
-
canvas_version
-
copy_nodes
-
create_component
-
export
-
find_nodes
-
generate_color_system
-
generate_design_system
-
generate_scale
-
get_feedback
-
get_fonts
-
get_variables
-
import_design_md
-
init
-
list_presets
-
list_structures
-
project_apply_preset
-
project_create
-
project_delete
-
project_evaluate
-
project_get_design_system
-
project_list
-
project_rename
-
project_set_design_system
-
read_nodes
-
replace_matching_properties
-
resolve_feedback
-
screenshot
-
screenshot_responsive
-
set_fonts
-
set_variables
-
snapshot_layout
-
viewer_url
-
workspace_apply_preset
-
workspace_create
-
workspace_delete
-
workspace_get_design_system
-
workspace_list
-
workspace_rename
-
workspace_set_design_system
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 144
filesystem 47
- fs (weak) vicmaster-framesmith-0dd3811/benchmark/run.ts :9
import { readFile, writeFile } from 'node:fs/promises'; - fs (weak) vicmaster-framesmith-0dd3811/scripts/build-bloom-landing.ts :17
import { mkdir, writeFile } from 'node:fs/promises'; - fs (weak) vicmaster-framesmith-0dd3811/scripts/build-hero.ts :8
import { mkdir, writeFile } from 'node:fs/promises'; - fs (weak) vicmaster-framesmith-0dd3811/scripts/build-phase8-release.ts :20
import { mkdir, writeFile } from 'node:fs/promises'; - fs (weak) vicmaster-framesmith-0dd3811/scripts/build-phase9-showcase.ts :19
import { mkdir, writeFile } from 'node:fs/promises'; - fs (weak) vicmaster-framesmith-0dd3811/scripts/build-viewer-mock.ts :11
import { mkdir, writeFile } from 'node:fs/promises'; - fs (weak) vicmaster-framesmith-0dd3811/scripts/generate-tailwind-palette.ts :16
import { readFileSync, writeFileSync } from 'node:fs'; - fs vicmaster-framesmith-0dd3811/src/aggregate.ts :20
import { watch, existsSync, type FSWatcher } from 'node:fs'; - fs vicmaster-framesmith-0dd3811/src/assets.ts :13
import { mkdirSync, writeFileSync, readFileSync, existsSync, renameSync } from 'node:fs'; - fs vicmaster-framesmith-0dd3811/src/bind.ts :11
import { existsSync } from 'node:fs'; - fs vicmaster-framesmith-0dd3811/src/fonts.ts :21
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'; - fs vicmaster-framesmith-0dd3811/src/icons.ts :1
import { readFileSync, readdirSync, existsSync } from 'node:fs'; - fs vicmaster-framesmith-0dd3811/src/import.ts :15
import { readdirSync, readFileSync } from 'node:fs'; - fs vicmaster-framesmith-0dd3811/src/index.ts :3
import { readFile } from 'node:fs/promises'; - fs vicmaster-framesmith-0dd3811/src/repo-store.ts :21
import { mkdirSync, writeFileSync, readFileSync, readdirSync, unlinkSync, existsSync, renameSync, statSync } from 'node:fs'; - fs vicmaster-framesmith-0dd3811/src/scene-graph.ts :2
import { mkdirSync, writeFileSync, readFileSync, readdirSync, unlinkSync, existsSync, statSync } from 'node:fs'; - fs vicmaster-framesmith-0dd3811/src/screenshot.ts :1
import { writeFile, mkdir } from 'node:fs/promises'; - fs vicmaster-framesmith-0dd3811/src/viewer-standalone.ts :22
import { mkdirSync } from 'node:fs'; - fs vicmaster-framesmith-0dd3811/src/workspaces.ts :12
import { mkdirSync, writeFileSync, readFileSync, existsSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-archive-view.ts :9
import { mkdtempSync, rmSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-build-log.ts :14
import { mkdtempSync, existsSync, readFileSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-cli.ts :9
import { mkdtempSync, rmSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-design-system-inheritance.ts :17
import { mkdtempSync, rmSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-discoverability.ts :18
import { readFileSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-empty-thumbnail.ts :7
import { mkdtempSync, rmSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-env.ts :12
import { mkdtempSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-feedback.ts :13
import { existsSync, readFileSync, writeFileSync, utimesSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-fonts-by-name.ts :14
import { existsSync, readFileSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-gradient-shadow-move-fixes.ts :10
import { mkdtempSync, existsSync, readdirSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-guidelines.ts :11
import { access, readFile } from 'node:fs/promises'; - fs (weak) vicmaster-framesmith-0dd3811/test-import-core.ts :10
import { readFileSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-init.ts :10
import { mkdtempSync, existsSync, readdirSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-repo-assets.ts :11
import { mkdtempSync, existsSync, readFileSync, readdirSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-repo-canvases.ts :13
import { mkdirSync, mkdtempSync, existsSync, readFileSync, readdirSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-repo-external-change.ts :10
import { mkdtempSync, writeFileSync, unlinkSync, utimesSync, readFileSync, existsSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-responsive.ts :12
import { writeFile, mkdir } from 'node:fs/promises'; - fs (weak) vicmaster-framesmith-0dd3811/test-viewer-feedback.ts :11
import { mkdtempSync, existsSync, readFileSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-viewer-logo-favicon.ts :10
import { mkdtempSync, rmSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-viewer-navbar.ts :8
import { writeFile, mkdir } from 'node:fs/promises'; - fs (weak) vicmaster-framesmith-0dd3811/test-viewer-repo-aggregation.ts :10
import { mkdtempSync, existsSync, readFileSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-viewer-repo-lifecycle.ts :10
import { mkdtempSync, existsSync, readFileSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-viewer-resolves-workspace-tokens.ts :19
import { mkdtempSync, rmSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-viewer-sidebar.ts :8
import { mkdtempSync, rmSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-viewer-watch.ts :10
import { mkdirSync, writeFileSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-visual.ts :14
import { writeFile, mkdir } from 'node:fs/promises'; - fs (weak) vicmaster-framesmith-0dd3811/test-workspace-mcp-tools.ts :10
import { mkdtempSync, rmSync, existsSync } from 'node:fs'; - fs (weak) vicmaster-framesmith-0dd3811/test-workspace-migration.ts :11
import { mkdirSync, readFileSync, writeFileSync, existsSync, rmSync } from 'node:fs';
shell / exec 1
- shell (weak) vicmaster-framesmith-0dd3811/test-cli.ts :12
import { spawn } from 'node:child_process';
network 9
- net vicmaster-framesmith-0dd3811/src/index.ts :2360
const res = await fetch(`http://localhost:${port}/api/canvases`, { signal: AbortSignal.timeout(1000) }); - net vicmaster-framesmith-0dd3811/src/viewer.ts :1
import { createServer, type IncomingMessage, type Server } from 'node:http'; - net (weak) vicmaster-framesmith-0dd3811/test-check-drift-url.ts :10
import { createServer, type Server } from 'node:http'; - net (weak) vicmaster-framesmith-0dd3811/test-cli.ts :13
import { createServer, type Server } from 'node:http'; - net (weak) vicmaster-framesmith-0dd3811/test-import-url.ts :10
import { createServer, type Server } from 'node:http'; - net (weak) vicmaster-framesmith-0dd3811/test-sync-drift.ts :10
import { createServer, type Server } from 'node:http'; - net (weak) vicmaster-framesmith-0dd3811/test-viewer-feedback.ts :36
const api = (suffix: string, init?: RequestInit) => fetch(`${base}/api/canvas/${canvas.id}${suffix}`, init); - net (weak) vicmaster-framesmith-0dd3811/test-viewer-navbar.ts :18
const list = await (await fetch(`${base}/api/canvases`)).json(); - net (weak) vicmaster-framesmith-0dd3811/test-viewer.ts :74
const galleryRes = await fetch(`http://localhost:${PORT}/`);
secrets 3
- secrets vicmaster-framesmith-0dd3811/src/llm-judge.ts :80
if (process.env.ANTHROPIC_API_KEY) return 'anthropic'; - secrets (weak) vicmaster-framesmith-0dd3811/test-flow-critique.ts :76
const saved = { p: process.env.FRAMESMITH_LLM_PROVIDER, a: process.env.ANTHROPIC_API_KEY, o: process.env.OPENAI_API_KEY }; - secrets (weak) vicmaster-framesmith-0dd3811/test-llm-judge.ts :81
const saved = { f: process.env.FRAMESMITH_LLM_PROVIDER, a: process.env.ANTHROPIC_API_KEY, o: process.env.OPENAI_API_KEY };
tool registrations 60
- canvas_create vicmaster-framesmith-0dd3811/src/index.ts :161
- canvas_list vicmaster-framesmith-0dd3811/src/index.ts :194
- canvas_add_variant vicmaster-framesmith-0dd3811/src/index.ts :212
- canvas_move vicmaster-framesmith-0dd3811/src/index.ts :247
- canvas_archive vicmaster-framesmith-0dd3811/src/index.ts :263
- canvas_unarchive vicmaster-framesmith-0dd3811/src/index.ts :275
- canvas_delete vicmaster-framesmith-0dd3811/src/index.ts :287
- workspace_create vicmaster-framesmith-0dd3811/src/index.ts :299
- workspace_list vicmaster-framesmith-0dd3811/src/index.ts :310
- workspace_rename vicmaster-framesmith-0dd3811/src/index.ts :320
- workspace_delete vicmaster-framesmith-0dd3811/src/index.ts :335
- project_create vicmaster-framesmith-0dd3811/src/index.ts :354
- project_list vicmaster-framesmith-0dd3811/src/index.ts :369
- project_rename vicmaster-framesmith-0dd3811/src/index.ts :379
- project_delete vicmaster-framesmith-0dd3811/src/index.ts :394
- workspace_set_design_system vicmaster-framesmith-0dd3811/src/index.ts :431
- workspace_get_design_system vicmaster-framesmith-0dd3811/src/index.ts :446
- workspace_apply_preset vicmaster-framesmith-0dd3811/src/index.ts :457
- project_set_design_system vicmaster-framesmith-0dd3811/src/index.ts :474
- project_get_design_system vicmaster-framesmith-0dd3811/src/index.ts :489
- project_apply_preset vicmaster-framesmith-0dd3811/src/index.ts :500
- batch_design vicmaster-framesmith-0dd3811/src/index.ts :517
- find_nodes vicmaster-framesmith-0dd3811/src/index.ts :590
- replace_matching_properties vicmaster-framesmith-0dd3811/src/index.ts :623
- create_component vicmaster-framesmith-0dd3811/src/index.ts :676
- copy_nodes vicmaster-framesmith-0dd3811/src/index.ts :708
- screenshot vicmaster-framesmith-0dd3811/src/index.ts :773
- read_nodes vicmaster-framesmith-0dd3811/src/index.ts :808
- snapshot_layout vicmaster-framesmith-0dd3811/src/index.ts :836
- get_variables vicmaster-framesmith-0dd3811/src/index.ts :861
- set_variables vicmaster-framesmith-0dd3811/src/index.ts :873
- generate_scale vicmaster-framesmith-0dd3811/src/index.ts :917
- generate_color_system vicmaster-framesmith-0dd3811/src/index.ts :991
- generate_design_system vicmaster-framesmith-0dd3811/src/index.ts :1065
- get_fonts vicmaster-framesmith-0dd3811/src/index.ts :1143
- set_fonts vicmaster-framesmith-0dd3811/src/index.ts :1155
- export vicmaster-framesmith-0dd3811/src/index.ts :1225
- screenshot_responsive vicmaster-framesmith-0dd3811/src/index.ts :1266
- canvas_diff vicmaster-framesmith-0dd3811/src/index.ts :1314
- list_presets vicmaster-framesmith-0dd3811/src/index.ts :1363
- list_structures vicmaster-framesmith-0dd3811/src/index.ts :1373
- apply_structure vicmaster-framesmith-0dd3811/src/index.ts :1395
- apply_preset vicmaster-framesmith-0dd3811/src/index.ts :1445
- canvas_import_html vicmaster-framesmith-0dd3811/src/index.ts :1542
- canvas_import_url vicmaster-framesmith-0dd3811/src/index.ts :1586
- canvas_sync_from_url vicmaster-framesmith-0dd3811/src/index.ts :1646
- canvas_check_drift vicmaster-framesmith-0dd3811/src/index.ts :1703
- canvas_version vicmaster-framesmith-0dd3811/src/index.ts :1754
- import_design_md vicmaster-framesmith-0dd3811/src/index.ts :1781
- get_feedback vicmaster-framesmith-0dd3811/src/index.ts :1835
- resolve_feedback vicmaster-framesmith-0dd3811/src/index.ts :1864
- canvas_set_genre vicmaster-framesmith-0dd3811/src/index.ts :1883
- canvas_evaluate vicmaster-framesmith-0dd3811/src/index.ts :1913
- canvas_autofix vicmaster-framesmith-0dd3811/src/index.ts :1994
- canvas_stress vicmaster-framesmith-0dd3811/src/index.ts :2060
- project_evaluate vicmaster-framesmith-0dd3811/src/index.ts :2136
- canvas_revise vicmaster-framesmith-0dd3811/src/index.ts :2209
- viewer_url vicmaster-framesmith-0dd3811/src/index.ts :2244
- canvas_bind vicmaster-framesmith-0dd3811/src/index.ts :2270
- init vicmaster-framesmith-0dd3811/src/index.ts :2298
install hooks 1
- prepublishOnly vicmaster-framesmith-0dd3811/package.json :17
npm run build
declared dependencies 11
- @modelcontextprotocol/sdk@^1.12.1
- @anthropic-ai/sdk@^0.96.0
- @material-symbols/svg-400@^0.44.12
- lucide-static@^0.577.0
- nanoid@^5.1.5
- openai@^6.38.0
- puppeteer@^24.7.2
- zod@^3.24.4
- @types/node@^22.15.3
- tsx@^4.19.4
- typescript@^5.8.3
perm:untrusted 1
- untrusted (weak) vicmaster-framesmith-0dd3811/test-viewer-navbar.ts :18
const list = await (await fetch(`${base}/api/canvases`)).json();