MCP server for agent-authored 3D geo scenes: write SSDL, render on a real WebGPU engine, read the frame back.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
tools
-
ssworld_capture_frame
screenshot of the open preview through the engine (saveImage2Base64); stats with luma percentiles, exposure tails, colour-class coverage overall and per 3×3 region, top colours; runtime errors dedupli
-
ssworld_catalog
component index / one contract / components: [...] in one call (detail: compact hoists shared members); catalog_digest + if_digest for cache hits; units and rotation conventions annotated per member
-
ssworld_compile
SSDL 0.3 compiler with real diagnostics, node_count, budget usage and logic (declared properties, states, host calls); catalog/runtime mismatches are compile errors (Label without a font, material ani
-
ssworld_engine_status
engine pair installed? (install: true to download)
-
ssworld_environment_read
ask the engine what it actually received for the environment: the adopted sun's direction read back from the native sun and converted to azimuth/elevation at the anchor (with the deviation from the sc
-
ssworld_preview
starts the local preview server, returns http://127.0.0.1:8880/projects/<name>/index.html, whether the page is open, page.clients (every browser syncing the page: id, visibility, canvas, user agent) a
-
ssworld_project_create
new runnable project (anchored at lon/lat/height), compiled
-
ssworld_project_list
projects in ~/.ssworld/projects
-
ssworld_scene_inspect
compiled-scene facts without rendering: budget ratio, subtrees by size, leaf children by type, nodes per source file, primitive extent, the requested camera (lookAt-derived heading/pitch); render stat
-
ssworld_source_batch
atomic multi-edit: text patches and node-level {node_id, set, unset} across files; all validated in memory before anything is written; validate: compile + rollback restores the previous sources on a f
-
ssworld_source_patch
exact-span edit (old_string → new_string, uniqueness checked, replace_all opt-in) with the same digest guard
-
tool
purpose
analyzed commit 50327d9 · analyzer v33 · 5d ago
skills & prompt files 1
danger signals1
- dynamic code execution new Function() DataArche-SSWorld-50327d9/test/sun-readback.test.mjs :11
new Function(readFileSync(path.join(SSDL_ROOT, "runtime", "ssdl-builtins.js"), "utf8")).call(globalScope);
code files: 52
filesystem 26
- fs DataArche-SSWorld-50327d9/src/catalog.mjs :2
import { readFileSync } from "node:fs"; - fs DataArche-SSWorld-50327d9/src/compile.mjs :3
import { createReadStream, existsSync, readFileSync } from "node:fs"; - fs DataArche-SSWorld-50327d9/src/diagnose.mjs :5
import { existsSync, readFileSync, readdirSync } from "node:fs"; - fs DataArche-SSWorld-50327d9/src/engine.mjs :5
import { existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from "node:fs"; - fs DataArche-SSWorld-50327d9/src/inspect.mjs :5
import { existsSync, readFileSync } from "node:fs"; - fs DataArche-SSWorld-50327d9/src/install.mjs :4
import { cpSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs DataArche-SSWorld-50327d9/src/page.mjs :4
import { existsSync, readFileSync, renameSync, writeFileSync } from "node:fs"; - fs DataArche-SSWorld-50327d9/src/paths.mjs :4
import { existsSync, readFileSync } from "node:fs"; - fs DataArche-SSWorld-50327d9/src/preview.mjs :5
import { createReadStream, existsSync, readdirSync, statSync } from "node:fs"; - fs DataArche-SSWorld-50327d9/src/project.mjs :3
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, writeFileSync } from "node:fs"; - fs DataArche-SSWorld-50327d9/src/server.mjs :10
import { mkdirSync, writeFileSync } from "node:fs"; - fs DataArche-SSWorld-50327d9/ssdl/compiler/src/compiler-0.3.mjs :1
import { readFileSync } from "node:fs";
show 14 more
- fs (weak) DataArche-SSWorld-50327d9/test/asset-cache.test.mjs :3
import { readFileSync } from "node:fs"; - fs (weak) DataArche-SSWorld-50327d9/test/budget.test.mjs :3
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; - fs (weak) DataArche-SSWorld-50327d9/test/chase-camera.test.mjs :3
import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; - fs (weak) DataArche-SSWorld-50327d9/test/emissive.test.mjs :3
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs"; - fs (weak) DataArche-SSWorld-50327d9/test/engine.test.mjs :4
import { createReadStream, existsSync, mkdtempSync, readFileSync, statSync, writeFileSync } from "node:fs"; - fs (weak) DataArche-SSWorld-50327d9/test/game-logic.test.mjs :3
import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; - fs (weak) DataArche-SSWorld-50327d9/test/install.test.mjs :4
import { mkdtempSync, mkdirSync, readFileSync, writeFileSync, existsSync } from "node:fs"; - fs (weak) DataArche-SSWorld-50327d9/test/instancing.test.mjs :3
import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; - fs (weak) DataArche-SSWorld-50327d9/test/iteration-surface.test.mjs :3
import { mkdtempSync, rmSync } from "node:fs"; - fs (weak) DataArche-SSWorld-50327d9/test/scale-budgets.test.mjs :3
import { mkdtempSync, rmSync } from "node:fs"; - fs (weak) DataArche-SSWorld-50327d9/test/sky-tint-policy.test.mjs :3
import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; - fs (weak) DataArche-SSWorld-50327d9/test/smoke.test.mjs :4
import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; - fs (weak) DataArche-SSWorld-50327d9/test/sun-readback.test.mjs :3
import { readFileSync } from "node:fs"; - fs (weak) DataArche-SSWorld-50327d9/test/tangent-policy.test.mjs :3
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
shell / exec 4
- shell DataArche-SSWorld-50327d9/src/install.mjs :3
import { execFileSync, spawnSync } from "node:child_process"; - shell (weak) DataArche-SSWorld-50327d9/test/engine.test.mjs :3
import { spawn, spawnSync } from "node:child_process"; - shell (weak) DataArche-SSWorld-50327d9/test/install.test.mjs :3
import { spawnSync } from "node:child_process"; - shell (weak) DataArche-SSWorld-50327d9/test/smoke.test.mjs :3
import { spawn } from "node:child_process";
network 5
- net DataArche-SSWorld-50327d9/src/engine.mjs :52
const response = await fetch(url, { redirect: "follow" }); - net DataArche-SSWorld-50327d9/src/preview.mjs :6
import http from "node:http"; - net DataArche-SSWorld-50327d9/ssdl/engine-support/qtloader.js :128
const response = await fetch(path); - net (weak) DataArche-SSWorld-50327d9/test/engine.test.mjs :5
import http from "node:http"; - net (weak) DataArche-SSWorld-50327d9/test/smoke.test.mjs :429
const syncAs = (clientId, clientStatus, results = []) => fetch(syncUrl, { method: "POST", headers: { "Content-Type": "application/json" },
perm:untrusted 1
- untrusted (weak) DataArche-SSWorld-50327d9/test/smoke.test.mjs :688
const version = await fetch(`http://127.0.0.1:${PORT}/__ssdl_dev/version?path=projects/demo`).then((r) => r.json());