@skenora/tooling 0.1.2

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.
Files changed (44) hide show
  1. package/README.md +32 -0
  2. package/bin/skenora-mcp-http.mjs +131 -0
  3. package/bin/skenora-mcp.mjs +50 -0
  4. package/bin/skenora.mjs +388 -0
  5. package/dist/doctor.d.ts +3 -0
  6. package/dist/doctor.d.ts.map +1 -0
  7. package/dist/doctor.js +109 -0
  8. package/dist/doctor.js.map +1 -0
  9. package/dist/examples.d.ts +26 -0
  10. package/dist/examples.d.ts.map +1 -0
  11. package/dist/examples.js +207 -0
  12. package/dist/examples.js.map +1 -0
  13. package/dist/index.d.ts +8 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +7 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/mcp-http.d.ts +16 -0
  18. package/dist/mcp-http.d.ts.map +1 -0
  19. package/dist/mcp-http.js +279 -0
  20. package/dist/mcp-http.js.map +1 -0
  21. package/dist/mcp.d.ts +79 -0
  22. package/dist/mcp.d.ts.map +1 -0
  23. package/dist/mcp.js +817 -0
  24. package/dist/mcp.js.map +1 -0
  25. package/dist/resources.d.ts +24 -0
  26. package/dist/resources.d.ts.map +1 -0
  27. package/dist/resources.js +141 -0
  28. package/dist/resources.js.map +1 -0
  29. package/dist/wgsl.d.ts +42 -0
  30. package/dist/wgsl.d.ts.map +1 -0
  31. package/dist/wgsl.js +133 -0
  32. package/dist/wgsl.js.map +1 -0
  33. package/package.json +53 -0
  34. package/resources/docs/diagnostics.md +16 -0
  35. package/resources/docs/overview.md +26 -0
  36. package/resources/docs/runtime-probe.md +17 -0
  37. package/resources/examples/gallery.json +1818 -0
  38. package/resources/examples/invalid-scene.json +9 -0
  39. package/resources/examples/valid-scene.json +69 -0
  40. package/resources/llms-full.txt +52 -0
  41. package/resources/llms.txt +19 -0
  42. package/resources/manifest.json +97 -0
  43. package/resources/schemas/example-manifest.schema.json +454 -0
  44. package/resources/schemas/scene-check-report.schema.json +36 -0
@@ -0,0 +1,279 @@
1
+ import { SKENORA_MCP_PROTOCOL_VERSION, createSkenoraMcpErrorResponse, getSkenoraMcpRequestProtocolVersion, validateSkenoraMcpModernRequest, } from "./mcp.js";
2
+ const LOOPBACK_HOSTS = Object.freeze(["127.0.0.1", "localhost", "[::1]"]);
3
+ /**
4
+ * Creates a fetch-compatible MCP 2026-07-28 HTTP handler. It does not open a
5
+ * socket, own an Editor, or implement an authorization server.
6
+ */
7
+ export function createSkenoraMcpHttpHandler(server, options = {}) {
8
+ const path = normalizePath(options.path ?? "/mcp");
9
+ const allowedHosts = normalizeStringSet(options.allowedHosts ?? LOOPBACK_HOSTS, "allowedHosts");
10
+ const allowedOrigins = normalizeStringSet(options.allowedOrigins ?? [], "allowedOrigins");
11
+ const maxBodyBytes = normalizeBodyLimit(options.maxBodyBytes);
12
+ const authorizationMetadataUrl = normalizeAuthorizationMetadataUrl(options.authorizationMetadataUrl);
13
+ if (server.authoring && !options.authenticate) {
14
+ throw new Error("An authoring MCP HTTP handler requires an authenticate callback");
15
+ }
16
+ if (server.authoring && !authorizationMetadataUrl) {
17
+ throw new Error("An authoring MCP HTTP handler requires authorizationMetadataUrl");
18
+ }
19
+ return async (request) => {
20
+ const url = new URL(request.url);
21
+ if (url.pathname !== path)
22
+ return textResponse(404, "Not Found");
23
+ if (request.method !== "POST") {
24
+ return textResponse(405, "Method Not Allowed", { Allow: "POST" });
25
+ }
26
+ if (!allowedHosts.has(url.hostname.toLocaleLowerCase())) {
27
+ return textResponse(403, "Forbidden host");
28
+ }
29
+ const origin = request.headers.get("origin");
30
+ if (origin && !allowedOrigins.has(origin.toLocaleLowerCase())) {
31
+ return textResponse(403, "Forbidden origin");
32
+ }
33
+ const contentType = request.headers.get("content-type") ?? "";
34
+ if (mediaType(contentType) !== "application/json") {
35
+ return jsonRpcResponse(createSkenoraMcpErrorResponse(null, -32600, "Expected application/json"), 415);
36
+ }
37
+ const contentLength = parseContentLength(request.headers.get("content-length"));
38
+ if (contentLength !== null && contentLength > maxBodyBytes) {
39
+ return jsonRpcResponse(createSkenoraMcpErrorResponse(null, -32600, "Request body too large"), 413);
40
+ }
41
+ let principal;
42
+ if (options.authenticate) {
43
+ let authenticated;
44
+ try {
45
+ authenticated = await options.authenticate(request);
46
+ }
47
+ catch {
48
+ return jsonRpcResponse(createSkenoraMcpErrorResponse(null, -32603, "Internal error"), 500);
49
+ }
50
+ if (!authenticated) {
51
+ return jsonRpcResponse(createSkenoraMcpErrorResponse(null, -32001, "Authorization required"), 401, authorizationHeaders(authorizationMetadataUrl));
52
+ }
53
+ try {
54
+ principal = normalizePrincipal(authenticated);
55
+ }
56
+ catch {
57
+ return jsonRpcResponse(createSkenoraMcpErrorResponse(null, -32603, "Internal error"), 500);
58
+ }
59
+ }
60
+ const bodyBytes = await readBoundedBody(request, maxBodyBytes);
61
+ if (!bodyBytes) {
62
+ return jsonRpcResponse(createSkenoraMcpErrorResponse(null, -32600, "Request body too large"), 413);
63
+ }
64
+ let body;
65
+ try {
66
+ body = new TextDecoder("utf-8", { fatal: true }).decode(bodyBytes);
67
+ }
68
+ catch {
69
+ return jsonRpcResponse(createSkenoraMcpErrorResponse(null, -32700, "Parse error"), 400);
70
+ }
71
+ let input;
72
+ try {
73
+ input = JSON.parse(body);
74
+ }
75
+ catch {
76
+ return jsonRpcResponse(createSkenoraMcpErrorResponse(null, -32700, "Parse error"), 400);
77
+ }
78
+ const protocolIssue = validateModernHeaders(request.headers, input);
79
+ if (protocolIssue) {
80
+ return jsonRpcResponse(createSkenoraMcpErrorResponse(requestId(input), protocolIssue.code, protocolIssue.message, protocolIssue.data), 400, { "MCP-Protocol-Version": SKENORA_MCP_PROTOCOL_VERSION });
81
+ }
82
+ const response = await server.handle(input, {
83
+ transport: "http",
84
+ protocolVersion: SKENORA_MCP_PROTOCOL_VERSION,
85
+ ...(principal === undefined ? {} : { principal }),
86
+ signal: request.signal,
87
+ });
88
+ if (!response)
89
+ return new Response(null, { status: 202 });
90
+ return jsonRpcResponse(response, 200, {
91
+ "MCP-Protocol-Version": SKENORA_MCP_PROTOCOL_VERSION,
92
+ });
93
+ };
94
+ }
95
+ function validateModernHeaders(headers, input) {
96
+ const notification = isRecord(input) && input.id === undefined;
97
+ const envelopeIssue = validateSkenoraMcpModernRequest(input);
98
+ if (notification)
99
+ return envelopeIssue;
100
+ const version = headers.get("mcp-protocol-version");
101
+ const bodyVersion = getSkenoraMcpRequestProtocolVersion(input);
102
+ if (bodyVersion !== undefined && version !== bodyVersion) {
103
+ return {
104
+ code: -32020,
105
+ message: "MCP protocol version header does not match params._meta",
106
+ };
107
+ }
108
+ if (version !== SKENORA_MCP_PROTOCOL_VERSION) {
109
+ return version === null
110
+ ? {
111
+ code: -32020,
112
+ message: "MCP-Protocol-Version header is required",
113
+ }
114
+ : {
115
+ code: -32022,
116
+ message: `Unsupported MCP protocol version: ${version}`,
117
+ data: { supportedVersions: [SKENORA_MCP_PROTOCOL_VERSION] },
118
+ };
119
+ }
120
+ if (envelopeIssue)
121
+ return envelopeIssue;
122
+ if (!isRecord(input) || typeof input.method !== "string")
123
+ return null;
124
+ const method = headers.get("mcp-method");
125
+ if (method !== input.method) {
126
+ return {
127
+ code: -32020,
128
+ message: "Mcp-Method header does not match method",
129
+ };
130
+ }
131
+ const expectedName = requestName(input);
132
+ if (expectedName !== null && headers.get("mcp-name") !== expectedName) {
133
+ return {
134
+ code: -32020,
135
+ message: "Mcp-Name header does not match request parameters",
136
+ };
137
+ }
138
+ return null;
139
+ }
140
+ async function readBoundedBody(request, maxBodyBytes) {
141
+ if (!request.body)
142
+ return new Uint8Array();
143
+ const reader = request.body.getReader();
144
+ const chunks = [];
145
+ let bytes = 0;
146
+ while (true) {
147
+ const next = await reader.read();
148
+ if (next.done)
149
+ break;
150
+ bytes += next.value.byteLength;
151
+ if (bytes > maxBodyBytes) {
152
+ try {
153
+ await reader.cancel("Request body too large");
154
+ }
155
+ catch {
156
+ // The limit decision is final even if the producer rejects cancellation.
157
+ }
158
+ return null;
159
+ }
160
+ chunks.push(next.value);
161
+ }
162
+ const body = new Uint8Array(bytes);
163
+ let offset = 0;
164
+ for (const chunk of chunks) {
165
+ body.set(chunk, offset);
166
+ offset += chunk.byteLength;
167
+ }
168
+ return body;
169
+ }
170
+ function requestName(input) {
171
+ if (!isRecord(input.params))
172
+ return null;
173
+ if (input.method === "tools/call") {
174
+ return typeof input.params.name === "string" ? input.params.name : null;
175
+ }
176
+ if (input.method === "resources/read") {
177
+ return typeof input.params.uri === "string" ? input.params.uri : null;
178
+ }
179
+ return null;
180
+ }
181
+ function mediaType(value) {
182
+ return (value.split(";", 1)[0] ?? "").trim().toLocaleLowerCase();
183
+ }
184
+ function normalizePrincipal(input) {
185
+ if (!input.subject || input.subject !== input.subject.trim()) {
186
+ throw new Error("MCP principal subject must be normalized and non-empty");
187
+ }
188
+ if (input.scopes &&
189
+ (!Array.isArray(input.scopes) ||
190
+ !input.scopes.every((scope) => typeof scope === "string" &&
191
+ scope === scope.trim() &&
192
+ scope.length > 0))) {
193
+ throw new Error("MCP principal scopes must be normalized strings");
194
+ }
195
+ return Object.freeze({
196
+ subject: input.subject,
197
+ ...(input.scopes
198
+ ? { scopes: Object.freeze([...new Set(input.scopes)]) }
199
+ : {}),
200
+ });
201
+ }
202
+ function normalizePath(value) {
203
+ if (!value.startsWith("/") || value.includes("?") || value.includes("#")) {
204
+ throw new Error("MCP HTTP path must be an absolute URL path");
205
+ }
206
+ return value;
207
+ }
208
+ function normalizeStringSet(values, name) {
209
+ if (!Array.isArray(values) ||
210
+ !values.every((value) => typeof value === "string" && value.trim())) {
211
+ throw new Error(`${name} must contain non-empty strings`);
212
+ }
213
+ return new Set(values.map((value) => value.toLocaleLowerCase()));
214
+ }
215
+ function normalizeBodyLimit(value) {
216
+ if (value === undefined)
217
+ return 1024 * 1024;
218
+ if (!Number.isInteger(value) || value < 1 || value > 16 * 1024 * 1024) {
219
+ throw new Error("maxBodyBytes must be an integer in 1..16777216");
220
+ }
221
+ return value;
222
+ }
223
+ function normalizeAuthorizationMetadataUrl(value) {
224
+ if (value === undefined)
225
+ return undefined;
226
+ const url = new URL(value);
227
+ const loopback = url.hostname === "127.0.0.1" ||
228
+ url.hostname === "localhost" ||
229
+ url.hostname === "[::1]";
230
+ if ((url.protocol !== "https:" && !(loopback && url.protocol === "http:")) ||
231
+ url.hash) {
232
+ throw new Error("authorizationMetadataUrl must be HTTPS, or HTTP on loopback, without a fragment");
233
+ }
234
+ return url.href;
235
+ }
236
+ function parseContentLength(value) {
237
+ if (value === null)
238
+ return null;
239
+ const length = Number(value);
240
+ return Number.isSafeInteger(length) && length >= 0 ? length : null;
241
+ }
242
+ function authorizationHeaders(resourceMetadataUrl) {
243
+ return resourceMetadataUrl
244
+ ? {
245
+ "WWW-Authenticate": `Bearer resource_metadata="${resourceMetadataUrl}"`,
246
+ }
247
+ : { "WWW-Authenticate": "Bearer" };
248
+ }
249
+ function jsonRpcResponse(value, status, headers = {}) {
250
+ return new Response(`${JSON.stringify(value)}\n`, {
251
+ status,
252
+ headers: {
253
+ "Cache-Control": "no-store",
254
+ "Content-Type": "application/json; charset=utf-8",
255
+ ...headers,
256
+ },
257
+ });
258
+ }
259
+ function textResponse(status, text, headers = {}) {
260
+ return new Response(`${text}\n`, {
261
+ status,
262
+ headers: {
263
+ "Content-Type": "text/plain; charset=utf-8",
264
+ ...headers,
265
+ },
266
+ });
267
+ }
268
+ function requestId(input) {
269
+ if (!isRecord(input))
270
+ return null;
271
+ const id = input.id;
272
+ return typeof id === "string" || typeof id === "number" || id === null
273
+ ? id
274
+ : null;
275
+ }
276
+ function isRecord(value) {
277
+ return value !== null && typeof value === "object" && !Array.isArray(value);
278
+ }
279
+ //# sourceMappingURL=mcp-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-http.js","sourceRoot":"","sources":["../src/mcp-http.ts"],"names":[],"mappings":"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"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,79 @@
1
+ export declare const SKENORA_MCP_PROTOCOL_VERSION: "2026-07-28";
2
+ export declare const SKENORA_MCP_LEGACY_PROTOCOL_VERSION: "2025-11-25";
3
+ export interface SkenoraMcpServerInfo {
4
+ readonly name: string;
5
+ readonly version: string;
6
+ }
7
+ export interface SkenoraMcpPrincipal {
8
+ readonly subject: string;
9
+ readonly scopes?: readonly string[];
10
+ }
11
+ export interface SkenoraMcpRequestContext {
12
+ readonly transport: "stdio" | "http" | "in-process";
13
+ readonly protocolVersion?: string;
14
+ readonly principal?: SkenoraMcpPrincipal;
15
+ readonly signal?: AbortSignal;
16
+ }
17
+ export interface SkenoraMcpRevisionToken {
18
+ readonly sceneId: string;
19
+ readonly sessionEpoch: string;
20
+ readonly revision: number;
21
+ readonly documentHash: string;
22
+ }
23
+ export interface SkenoraMcpScenePlanWriteIntent {
24
+ readonly planHash: string;
25
+ readonly expectedRevisionToken: SkenoraMcpRevisionToken;
26
+ readonly idempotencyKey: string;
27
+ readonly operationId?: string;
28
+ readonly label?: string;
29
+ readonly allowVariables: boolean;
30
+ readonly modelLoadPolicy: "strict";
31
+ }
32
+ export interface SkenoraMcpScenePlanGateway {
33
+ inspectScene(options?: Readonly<Record<string, unknown>>): unknown | Promise<unknown>;
34
+ searchResources(query?: Readonly<Record<string, unknown>>): Promise<unknown>;
35
+ validatePlan(input: unknown, options?: Readonly<Record<string, unknown>>): unknown | Promise<unknown>;
36
+ applyPlan(input: unknown, options?: Readonly<Record<string, unknown>>): Promise<unknown>;
37
+ waitOperation(operationId: string, options?: Readonly<Record<string, unknown>>): Promise<unknown> | null;
38
+ }
39
+ export interface SkenoraMcpScenePlanAccessRequest {
40
+ readonly toolName: string;
41
+ readonly access: "read" | "write";
42
+ readonly editorHandle: string;
43
+ readonly approvalToken?: string;
44
+ readonly writeIntent?: SkenoraMcpScenePlanWriteIntent;
45
+ }
46
+ export interface SkenoraMcpScenePlanHost {
47
+ resolve(editorHandle: string, context: SkenoraMcpRequestContext): SkenoraMcpScenePlanGateway | null | Promise<SkenoraMcpScenePlanGateway | null>;
48
+ authorize(request: SkenoraMcpScenePlanAccessRequest, context: SkenoraMcpRequestContext): void | Promise<void>;
49
+ }
50
+ export interface SkenoraMcpServerOptions {
51
+ readonly serverInfo?: SkenoraMcpServerInfo;
52
+ readonly scenePlans?: SkenoraMcpScenePlanHost;
53
+ }
54
+ export interface SkenoraMcpServer {
55
+ readonly serverInfo: SkenoraMcpServerInfo;
56
+ readonly authoring: boolean;
57
+ handle(request: unknown, context?: SkenoraMcpRequestContext): Promise<SkenoraMcpResponse | null>;
58
+ }
59
+ export interface SkenoraMcpResponse {
60
+ readonly jsonrpc: "2.0";
61
+ readonly id: string | number | null;
62
+ readonly result?: unknown;
63
+ readonly error?: Readonly<{
64
+ code: number;
65
+ message: string;
66
+ data?: unknown;
67
+ }>;
68
+ }
69
+ export interface SkenoraMcpProtocolIssue {
70
+ readonly code: number;
71
+ readonly message: string;
72
+ readonly data?: unknown;
73
+ }
74
+ export declare function createSkenoraMcpServer(options?: SkenoraMcpServerOptions): SkenoraMcpServer;
75
+ export declare function createSkenoraMcpErrorResponse(id: string | number | null, code: number, message: string, data?: unknown): SkenoraMcpResponse;
76
+ export declare function getSkenoraMcpRequestProtocolVersion(input: unknown): string | undefined;
77
+ export declare function validateSkenoraMcpModernRequest(input: unknown): SkenoraMcpProtocolIssue | null;
78
+ export declare function createSkenoraMcpPlanHash(input: unknown): string;
79
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}