@pascal-app/mcp 1.0.0-beta.6 → 1.0.1
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/CHANGELOG.md +11 -0
- package/LICENSE +21 -0
- package/README.md +1 -1
- package/dist/bin/pascal-mcp.d.ts +1 -1
- package/dist/bin/pascal-mcp.js +7 -7
- package/dist/bridge/index.d.ts +2 -2
- package/dist/bridge/index.js +1 -1
- package/dist/bridge/scene-bridge.d.ts +2 -2
- package/dist/bridge/scene-bridge.d.ts.map +1 -1
- package/dist/bridge/scene-bridge.js +3 -3
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -4
- package/dist/operations/index.d.ts +1 -1
- package/dist/operations/index.js +1 -1
- package/dist/operations/scene-operations.d.ts +2 -2
- package/dist/prompts/from-brief.d.ts +1 -1
- package/dist/prompts/from-brief.d.ts.map +1 -1
- package/dist/prompts/from-brief.js +2 -1
- package/dist/prompts/index.d.ts +1 -1
- package/dist/prompts/index.js +3 -3
- package/dist/prompts/iterate-on-feedback.d.ts +1 -1
- package/dist/prompts/iterate-on-feedback.js +1 -1
- package/dist/prompts/renovation-from-photos.d.ts +1 -1
- package/dist/resources/agent-guide.d.ts +1 -1
- package/dist/resources/agent-guide.d.ts.map +1 -1
- package/dist/resources/agent-guide.js +1 -0
- package/dist/resources/catalog-items.d.ts +1 -1
- package/dist/resources/catalog-items.js +1 -1
- package/dist/resources/constraints.d.ts +1 -1
- package/dist/resources/index.d.ts +1 -1
- package/dist/resources/index.js +5 -5
- package/dist/resources/scene-current.d.ts +1 -1
- package/dist/resources/scene-summary.d.ts +1 -1
- package/dist/server.d.ts +14 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +60 -6
- package/dist/storage/index.d.ts +4 -4
- package/dist/storage/index.js +4 -4
- package/dist/storage/sqlite-scene-store.d.ts +1 -1
- package/dist/storage/sqlite-scene-store.js +3 -3
- package/dist/templates/index.js +3 -3
- package/dist/tools/annotations.d.ts +28 -0
- package/dist/tools/annotations.d.ts.map +1 -0
- package/dist/tools/annotations.js +27 -0
- package/dist/tools/apply-patch.d.ts +8 -1
- package/dist/tools/apply-patch.d.ts.map +1 -1
- package/dist/tools/apply-patch.js +9 -5
- package/dist/tools/check-collisions.d.ts +60 -1
- package/dist/tools/check-collisions.d.ts.map +1 -1
- package/dist/tools/check-collisions.js +242 -21
- package/dist/tools/construction-tools.d.ts +24 -2
- package/dist/tools/construction-tools.d.ts.map +1 -1
- package/dist/tools/construction-tools.js +36 -10
- package/dist/tools/create-level.d.ts +8 -1
- package/dist/tools/create-level.d.ts.map +1 -1
- package/dist/tools/create-level.js +9 -6
- package/dist/tools/create-unit.d.ts +27 -0
- package/dist/tools/create-unit.d.ts.map +1 -0
- package/dist/tools/create-unit.js +36 -0
- package/dist/tools/create-wall.d.ts +8 -1
- package/dist/tools/create-wall.d.ts.map +1 -1
- package/dist/tools/create-wall.js +9 -6
- package/dist/tools/cut-opening.d.ts +8 -1
- package/dist/tools/cut-opening.d.ts.map +1 -1
- package/dist/tools/cut-opening.js +10 -7
- package/dist/tools/delete-node.d.ts +8 -1
- package/dist/tools/delete-node.d.ts.map +1 -1
- package/dist/tools/delete-node.js +8 -5
- package/dist/tools/describe-node.d.ts +1 -1
- package/dist/tools/describe-node.d.ts.map +1 -1
- package/dist/tools/describe-node.js +5 -3
- package/dist/tools/door-clearance.d.ts +19 -3
- package/dist/tools/door-clearance.d.ts.map +1 -1
- package/dist/tools/door-clearance.js +102 -8
- package/dist/tools/duplicate-level.d.ts +8 -1
- package/dist/tools/duplicate-level.d.ts.map +1 -1
- package/dist/tools/duplicate-level.js +8 -4
- package/dist/tools/export-glb.d.ts +1 -1
- package/dist/tools/export-glb.d.ts.map +1 -1
- package/dist/tools/export-glb.js +4 -2
- package/dist/tools/export-json.d.ts +1 -1
- package/dist/tools/export-json.d.ts.map +1 -1
- package/dist/tools/export-json.js +2 -0
- package/dist/tools/find-nodes.d.ts +1 -1
- package/dist/tools/find-nodes.d.ts.map +1 -1
- package/dist/tools/find-nodes.js +3 -1
- package/dist/tools/get-node.d.ts +1 -1
- package/dist/tools/get-node.d.ts.map +1 -1
- package/dist/tools/get-node.js +4 -2
- package/dist/tools/get-scene.d.ts +1 -1
- package/dist/tools/get-scene.d.ts.map +1 -1
- package/dist/tools/get-scene.js +2 -0
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +32 -26
- package/dist/tools/layout-clearance.d.ts +4 -2
- package/dist/tools/layout-clearance.d.ts.map +1 -1
- package/dist/tools/layout-clearance.js +7 -3
- package/dist/tools/list-units.d.ts +38 -0
- package/dist/tools/list-units.d.ts.map +1 -0
- package/dist/tools/list-units.js +61 -0
- package/dist/tools/live-sync.d.ts +34 -4
- package/dist/tools/live-sync.d.ts.map +1 -1
- package/dist/tools/live-sync.js +38 -6
- package/dist/tools/measure.d.ts +2 -1
- package/dist/tools/measure.d.ts.map +1 -1
- package/dist/tools/measure.js +6 -2
- package/dist/tools/normalize-schema-dialect.d.ts +3 -0
- package/dist/tools/normalize-schema-dialect.d.ts.map +1 -0
- package/dist/tools/normalize-schema-dialect.js +28 -0
- package/dist/tools/photo-to-scene/index.d.ts +2 -2
- package/dist/tools/photo-to-scene/index.js +2 -2
- package/dist/tools/photo-to-scene/photo-to-scene.d.ts +1 -1
- package/dist/tools/photo-to-scene/photo-to-scene.d.ts.map +1 -1
- package/dist/tools/photo-to-scene/photo-to-scene.js +5 -3
- package/dist/tools/place-item.d.ts +8 -1
- package/dist/tools/place-item.d.ts.map +1 -1
- package/dist/tools/place-item.js +11 -7
- package/dist/tools/redo.d.ts +8 -1
- package/dist/tools/redo.d.ts.map +1 -1
- package/dist/tools/redo.js +6 -4
- package/dist/tools/room-tools.d.ts +29 -1
- package/dist/tools/room-tools.d.ts.map +1 -1
- package/dist/tools/room-tools.js +27 -12
- package/dist/tools/scene-lifecycle/create-project.d.ts +1 -1
- package/dist/tools/scene-lifecycle/create-project.d.ts.map +1 -1
- package/dist/tools/scene-lifecycle/create-project.js +4 -2
- package/dist/tools/scene-lifecycle/delete-scene.d.ts +1 -1
- package/dist/tools/scene-lifecycle/delete-scene.d.ts.map +1 -1
- package/dist/tools/scene-lifecycle/delete-scene.js +4 -2
- package/dist/tools/scene-lifecycle/get-project-status.d.ts +1 -1
- package/dist/tools/scene-lifecycle/get-project-status.d.ts.map +1 -1
- package/dist/tools/scene-lifecycle/get-project-status.js +4 -2
- package/dist/tools/scene-lifecycle/index.d.ts +8 -8
- package/dist/tools/scene-lifecycle/index.js +14 -14
- package/dist/tools/scene-lifecycle/list-scenes.d.ts +1 -1
- package/dist/tools/scene-lifecycle/list-scenes.d.ts.map +1 -1
- package/dist/tools/scene-lifecycle/list-scenes.js +3 -1
- package/dist/tools/scene-lifecycle/load-scene.d.ts +1 -1
- package/dist/tools/scene-lifecycle/load-scene.d.ts.map +1 -1
- package/dist/tools/scene-lifecycle/load-scene.js +4 -2
- package/dist/tools/scene-lifecycle/metadata.d.ts +3 -3
- package/dist/tools/scene-lifecycle/rename-scene.d.ts +1 -1
- package/dist/tools/scene-lifecycle/rename-scene.d.ts.map +1 -1
- package/dist/tools/scene-lifecycle/rename-scene.js +4 -2
- package/dist/tools/scene-lifecycle/save-scene.d.ts +1 -1
- package/dist/tools/scene-lifecycle/save-scene.d.ts.map +1 -1
- package/dist/tools/scene-lifecycle/save-scene.js +6 -4
- package/dist/tools/scene-lifecycle/test-utils.d.ts +7 -3
- package/dist/tools/scene-lifecycle/test-utils.d.ts.map +1 -1
- package/dist/tools/scene-lifecycle/test-utils.js +28 -4
- package/dist/tools/scene-query.d.ts +1 -1
- package/dist/tools/scene-query.d.ts.map +1 -1
- package/dist/tools/scene-query.js +9 -3
- package/dist/tools/set-unit-members.d.ts +20 -0
- package/dist/tools/set-unit-members.d.ts.map +1 -0
- package/dist/tools/set-unit-members.js +43 -0
- package/dist/tools/set-zone.d.ts +8 -1
- package/dist/tools/set-zone.d.ts.map +1 -1
- package/dist/tools/set-zone.js +8 -5
- package/dist/tools/templates/create-from-template.d.ts +1 -1
- package/dist/tools/templates/create-from-template.d.ts.map +1 -1
- package/dist/tools/templates/create-from-template.js +7 -5
- package/dist/tools/templates/create-house-from-brief.d.ts +1 -1
- package/dist/tools/templates/create-house-from-brief.d.ts.map +1 -1
- package/dist/tools/templates/create-house-from-brief.js +7 -5
- package/dist/tools/templates/index.d.ts +4 -4
- package/dist/tools/templates/index.js +6 -6
- package/dist/tools/templates/list-templates.d.ts.map +1 -1
- package/dist/tools/templates/list-templates.js +3 -1
- package/dist/tools/undo.d.ts +8 -1
- package/dist/tools/undo.d.ts.map +1 -1
- package/dist/tools/undo.js +6 -4
- package/dist/tools/unit-members.d.ts +4 -0
- package/dist/tools/unit-members.d.ts.map +1 -0
- package/dist/tools/unit-members.js +24 -0
- package/dist/tools/validate-scene.d.ts +1 -1
- package/dist/tools/validate-scene.d.ts.map +1 -1
- package/dist/tools/validate-scene.js +2 -0
- package/dist/tools/variants/generate-variants.d.ts +1 -1
- package/dist/tools/variants/generate-variants.d.ts.map +1 -1
- package/dist/tools/variants/generate-variants.js +4 -2
- package/dist/tools/variants/index.d.ts +3 -3
- package/dist/tools/variants/index.js +3 -3
- package/dist/tools/vision/analyze-floorplan-image.d.ts +1 -1
- package/dist/tools/vision/analyze-floorplan-image.d.ts.map +1 -1
- package/dist/tools/vision/analyze-floorplan-image.js +3 -1
- package/dist/tools/vision/analyze-room-photo.d.ts +1 -1
- package/dist/tools/vision/analyze-room-photo.d.ts.map +1 -1
- package/dist/tools/vision/analyze-room-photo.js +3 -1
- package/dist/tools/vision/index.d.ts +3 -3
- package/dist/tools/vision/index.js +4 -4
- package/package.json +8 -7
package/dist/tools/undo.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { DESTRUCTIVE_TOOL_ANNOTATIONS } from './annotations.js';
|
|
3
|
+
import { liveSyncOutput, persistencePayload, publishLiveSceneSnapshot } from './live-sync.js';
|
|
3
4
|
export const undoInput = {
|
|
4
5
|
steps: z.number().int().positive().optional(),
|
|
5
6
|
};
|
|
6
7
|
export const undoOutput = {
|
|
7
8
|
undone: z.number(),
|
|
9
|
+
...liveSyncOutput,
|
|
8
10
|
};
|
|
9
11
|
export function registerUndo(server, bridge) {
|
|
10
12
|
server.registerTool('undo', {
|
|
@@ -12,11 +14,11 @@ export function registerUndo(server, bridge) {
|
|
|
12
14
|
description: 'Undo the most recent N steps in the scene history (default 1). Returns the number of steps actually undone.',
|
|
13
15
|
inputSchema: undoInput,
|
|
14
16
|
outputSchema: undoOutput,
|
|
17
|
+
annotations: DESTRUCTIVE_TOOL_ANNOTATIONS,
|
|
15
18
|
}, async ({ steps }) => {
|
|
16
19
|
const undone = bridge.undo(steps ?? 1);
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const payload = { undone };
|
|
20
|
+
const persistence = undone > 0 ? await publishLiveSceneSnapshot(bridge, 'undo') : 'published';
|
|
21
|
+
const payload = { undone, ...persistencePayload(persistence) };
|
|
20
22
|
return {
|
|
21
23
|
content: [{ type: 'text', text: JSON.stringify(payload) }],
|
|
22
24
|
structuredContent: payload,
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ZoneNode } from '@pascal-app/core/schema';
|
|
2
|
+
import type { SceneOperations } from '../operations/index.js';
|
|
3
|
+
export declare function validateUnitMembers(bridge: SceneOperations, buildingId: string, memberZoneIds: string[]): ZoneNode['id'][];
|
|
4
|
+
//# sourceMappingURL=unit-members.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unit-members.d.ts","sourceRoot":"","sources":["../../src/tools/unit-members.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAGpD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EAAE,GACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,CA6BlB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ErrorCode, throwMcpError } from './errors.js';
|
|
2
|
+
export function validateUnitMembers(bridge, buildingId, memberZoneIds) {
|
|
3
|
+
const building = bridge.getNode(buildingId);
|
|
4
|
+
if (!building) {
|
|
5
|
+
throwMcpError(ErrorCode.InvalidParams, `Building not found: ${buildingId}`);
|
|
6
|
+
}
|
|
7
|
+
if (building.type !== 'building') {
|
|
8
|
+
throwMcpError(ErrorCode.InvalidParams, `Node ${buildingId} is a ${building.type}, expected building`);
|
|
9
|
+
}
|
|
10
|
+
return memberZoneIds.map((zoneId) => {
|
|
11
|
+
const zone = bridge.getNode(zoneId);
|
|
12
|
+
if (!zone) {
|
|
13
|
+
throwMcpError(ErrorCode.InvalidParams, `Zone not found: ${zoneId}`);
|
|
14
|
+
}
|
|
15
|
+
if (zone.type !== 'zone') {
|
|
16
|
+
throwMcpError(ErrorCode.InvalidParams, `Node ${zoneId} is a ${zone.type}, expected zone`);
|
|
17
|
+
}
|
|
18
|
+
const [, level, parent] = bridge.getAncestry(zone.id);
|
|
19
|
+
if (level?.type !== 'level' || parent?.id !== building.id) {
|
|
20
|
+
throwMcpError(ErrorCode.InvalidParams, `Zone ${zoneId} must belong to a level in building ${buildingId}`);
|
|
21
|
+
}
|
|
22
|
+
return zone.id;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import type { SceneOperations } from '../operations';
|
|
3
|
+
import type { SceneOperations } from '../operations/index.js';
|
|
4
4
|
export declare const validateSceneInput: {};
|
|
5
5
|
export declare const validateSceneOutput: {
|
|
6
6
|
valid: z.ZodBoolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-scene.d.ts","sourceRoot":"","sources":["../../src/tools/validate-scene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"validate-scene.d.ts","sourceRoot":"","sources":["../../src/tools/validate-scene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAGpD,eAAO,MAAM,kBAAkB,IAAK,CAAA;AAEpC,eAAO,MAAM,mBAAmB;;;;;;;CAS/B,CAAA;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAmBtF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { READ_ONLY_TOOL_ANNOTATIONS } from './annotations.js';
|
|
2
3
|
export const validateSceneInput = {};
|
|
3
4
|
export const validateSceneOutput = {
|
|
4
5
|
valid: z.boolean(),
|
|
@@ -14,6 +15,7 @@ export function registerValidateScene(server, bridge) {
|
|
|
14
15
|
description: 'Run Zod validation against every node in the scene. Returns `{ valid, errors }` where each error has `{ nodeId, path, message }`.',
|
|
15
16
|
inputSchema: validateSceneInput,
|
|
16
17
|
outputSchema: validateSceneOutput,
|
|
18
|
+
annotations: READ_ONLY_TOOL_ANNOTATIONS,
|
|
17
19
|
}, async () => {
|
|
18
20
|
const result = bridge.validateScene();
|
|
19
21
|
return {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import type { SceneOperations } from '../../operations';
|
|
3
|
+
import type { SceneOperations } from '../../operations/index.js';
|
|
4
4
|
export declare const generateVariantsInput: {
|
|
5
5
|
baseSceneId: z.ZodOptional<z.ZodString>;
|
|
6
6
|
count: z.ZodDefault<z.ZodNumber>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-variants.d.ts","sourceRoot":"","sources":["../../../src/tools/variants/generate-variants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"generate-variants.d.ts","sourceRoot":"","sources":["../../../src/tools/variants/generate-variants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAevD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;CAYjC,CAAA;AAED,eAAO,MAAM,sBAAsB;;;;;;;;;CAWlC,CAAA;AAcD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CA2FzF"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { forkSceneGraph } from '@pascal-app/core/clone-scene-graph';
|
|
2
2
|
import { AnyNode as AnyNodeSchema } from '@pascal-app/core/schema';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { ADDITIVE_TOOL_ANNOTATIONS } from '../annotations.js';
|
|
5
|
+
import { ErrorCode, throwMcpError } from '../errors.js';
|
|
6
|
+
import { applyMutation, describeVariant, mulberry32 } from './mutations.js';
|
|
6
7
|
const MUTATION_KINDS = [
|
|
7
8
|
'wall-thickness',
|
|
8
9
|
'wall-height',
|
|
@@ -53,6 +54,7 @@ export function registerGenerateVariants(server, bridge) {
|
|
|
53
54
|
description: 'Generate N variations of a base scene by forking and applying seeded mutations. Example: "give me 5 variations of this kitchen". If `save=true`, each variant is persisted via scene operations and returned with an id + URL; otherwise the graph is returned inline.',
|
|
54
55
|
inputSchema: generateVariantsInput,
|
|
55
56
|
outputSchema: generateVariantsOutput,
|
|
57
|
+
annotations: ADDITIVE_TOOL_ANNOTATIONS,
|
|
56
58
|
}, async ({ baseSceneId, count, vary, seed, save }) => {
|
|
57
59
|
// 1. Obtain the base SceneGraph.
|
|
58
60
|
let base;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type { SceneOperations } from '../../operations';
|
|
2
|
+
import type { SceneOperations } from '../../operations/index.js';
|
|
3
3
|
/**
|
|
4
4
|
* Register the variant-generation MCP tools against shared scene operations.
|
|
5
5
|
*/
|
|
6
6
|
export declare function registerVariantTools(server: McpServer, bridge: SceneOperations): void;
|
|
7
|
-
export { generateVariantsInput, generateVariantsOutput, registerGenerateVariants, } from './generate-variants';
|
|
8
|
-
export { applyMutation, describeVariant, type MutationKind, mulberry32, type Rng, } from './mutations';
|
|
7
|
+
export { generateVariantsInput, generateVariantsOutput, registerGenerateVariants, } from './generate-variants.js';
|
|
8
|
+
export { applyMutation, describeVariant, type MutationKind, mulberry32, type Rng, } from './mutations.js';
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { registerGenerateVariants } from './generate-variants';
|
|
1
|
+
import { registerGenerateVariants } from './generate-variants.js';
|
|
2
2
|
/**
|
|
3
3
|
* Register the variant-generation MCP tools against shared scene operations.
|
|
4
4
|
*/
|
|
5
5
|
export function registerVariantTools(server, bridge) {
|
|
6
6
|
registerGenerateVariants(server, bridge);
|
|
7
7
|
}
|
|
8
|
-
export { generateVariantsInput, generateVariantsOutput, registerGenerateVariants, } from './generate-variants';
|
|
9
|
-
export { applyMutation, describeVariant, mulberry32, } from './mutations';
|
|
8
|
+
export { generateVariantsInput, generateVariantsOutput, registerGenerateVariants, } from './generate-variants.js';
|
|
9
|
+
export { applyMutation, describeVariant, mulberry32, } from './mutations.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import type { SceneOperations } from '../../operations';
|
|
3
|
+
import type { SceneOperations } from '../../operations/index.js';
|
|
4
4
|
/**
|
|
5
5
|
* Input shape for `analyze_floorplan_image`.
|
|
6
6
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-floorplan-image.d.ts","sourceRoot":"","sources":["../../../src/tools/vision/analyze-floorplan-image.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"analyze-floorplan-image.d.ts","sourceRoot":"","sources":["../../../src/tools/vision/analyze-floorplan-image.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAGvD;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B;;;CAMtC,CAAA;AAED,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;CAoBvC,CAAA;AAgFD,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAkE/F"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
+
import { READ_ONLY_OPEN_WORLD_TOOL_ANNOTATIONS } from '../annotations.js';
|
|
3
4
|
/**
|
|
4
5
|
* Input shape for `analyze_floorplan_image`.
|
|
5
6
|
*
|
|
@@ -59,7 +60,7 @@ async function resolveImageBlock(image) {
|
|
|
59
60
|
if (/^https?:\/\//i.test(image)) {
|
|
60
61
|
// SSRF-safe fetch: blocks loopback / private / link-local / metadata IPs,
|
|
61
62
|
// caps size at 20 MB, times out at 10s, validates each redirect hop.
|
|
62
|
-
const { safeFetch } = await import('../../lib/safe-fetch');
|
|
63
|
+
const { safeFetch } = await import('../../lib/safe-fetch.js');
|
|
63
64
|
const res = await safeFetch(image, { accept: 'image/*' });
|
|
64
65
|
const data = res.buffer.toString('base64');
|
|
65
66
|
const mimeType = res.contentType ?? 'image/jpeg';
|
|
@@ -94,6 +95,7 @@ export function registerAnalyzeFloorplanImage(server, _bridge) {
|
|
|
94
95
|
description: 'Defer to the MCP host (via sampling) to extract walls, rooms, and approximate dimensions from a floor-plan image. Requires host support for sampling.',
|
|
95
96
|
inputSchema: analyzeFloorplanImageInput,
|
|
96
97
|
outputSchema: analyzeFloorplanImageOutput,
|
|
98
|
+
annotations: READ_ONLY_OPEN_WORLD_TOOL_ANNOTATIONS,
|
|
97
99
|
}, async ({ image, scaleHint }) => {
|
|
98
100
|
const caps = server.server.getClientCapabilities();
|
|
99
101
|
if (!caps?.sampling) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import type { SceneOperations } from '../../operations';
|
|
3
|
+
import type { SceneOperations } from '../../operations/index.js';
|
|
4
4
|
/**
|
|
5
5
|
* Input shape for `analyze_room_photo`.
|
|
6
6
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-room-photo.d.ts","sourceRoot":"","sources":["../../../src/tools/vision/analyze-room-photo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"analyze-room-photo.d.ts","sourceRoot":"","sources":["../../../src/tools/vision/analyze-room-photo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAGvD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;;CAEjC,CAAA;AAED,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;CAmBlC,CAAA;AAoED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAqE1F"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
+
import { READ_ONLY_OPEN_WORLD_TOOL_ANNOTATIONS } from '../annotations.js';
|
|
3
4
|
/**
|
|
4
5
|
* Input shape for `analyze_room_photo`.
|
|
5
6
|
*
|
|
@@ -41,7 +42,7 @@ const DATA_URI_RE = /^data:(image\/[a-z0-9.+-]+);base64,(.+)$/i;
|
|
|
41
42
|
async function resolveImageBlock(image) {
|
|
42
43
|
if (/^https?:\/\//i.test(image)) {
|
|
43
44
|
// SSRF-safe fetch (see packages/mcp/src/lib/safe-fetch.ts).
|
|
44
|
-
const { safeFetch } = await import('../../lib/safe-fetch');
|
|
45
|
+
const { safeFetch } = await import('../../lib/safe-fetch.js');
|
|
45
46
|
const res = await safeFetch(image, { accept: 'image/*' });
|
|
46
47
|
const data = res.buffer.toString('base64');
|
|
47
48
|
const mimeType = res.contentType ?? 'image/jpeg';
|
|
@@ -75,6 +76,7 @@ export function registerAnalyzeRoomPhoto(server, _bridge) {
|
|
|
75
76
|
description: 'Defer to the MCP host (via sampling) to extract approximate dimensions, fixtures, and windows from a single-room photograph. Requires host support for sampling.',
|
|
76
77
|
inputSchema: analyzeRoomPhotoInput,
|
|
77
78
|
outputSchema: analyzeRoomPhotoOutput,
|
|
79
|
+
annotations: READ_ONLY_OPEN_WORLD_TOOL_ANNOTATIONS,
|
|
78
80
|
}, async ({ image }) => {
|
|
79
81
|
const caps = server.server.getClientCapabilities();
|
|
80
82
|
if (!caps?.sampling) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type { SceneOperations } from '../../operations';
|
|
2
|
+
import type { SceneOperations } from '../../operations/index.js';
|
|
3
3
|
/**
|
|
4
4
|
* Register the vision-input tools that defer to the MCP host's sampling
|
|
5
5
|
* capability. No vision model is bundled in this package — if the host does
|
|
@@ -7,6 +7,6 @@ import type { SceneOperations } from '../../operations';
|
|
|
7
7
|
* `sampling_unavailable`.
|
|
8
8
|
*/
|
|
9
9
|
export declare function registerVisionTools(server: McpServer, operations: SceneOperations): void;
|
|
10
|
-
export { analyzeFloorplanImageInput, analyzeFloorplanImageOutput, registerAnalyzeFloorplanImage, } from './analyze-floorplan-image';
|
|
11
|
-
export { analyzeRoomPhotoInput, analyzeRoomPhotoOutput, registerAnalyzeRoomPhoto, } from './analyze-room-photo';
|
|
10
|
+
export { analyzeFloorplanImageInput, analyzeFloorplanImageOutput, registerAnalyzeFloorplanImage, } from './analyze-floorplan-image.js';
|
|
11
|
+
export { analyzeRoomPhotoInput, analyzeRoomPhotoOutput, registerAnalyzeRoomPhoto, } from './analyze-room-photo.js';
|
|
12
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { registerAnalyzeFloorplanImage } from './analyze-floorplan-image';
|
|
2
|
-
import { registerAnalyzeRoomPhoto } from './analyze-room-photo';
|
|
1
|
+
import { registerAnalyzeFloorplanImage } from './analyze-floorplan-image.js';
|
|
2
|
+
import { registerAnalyzeRoomPhoto } from './analyze-room-photo.js';
|
|
3
3
|
/**
|
|
4
4
|
* Register the vision-input tools that defer to the MCP host's sampling
|
|
5
5
|
* capability. No vision model is bundled in this package — if the host does
|
|
@@ -10,5 +10,5 @@ export function registerVisionTools(server, operations) {
|
|
|
10
10
|
registerAnalyzeFloorplanImage(server, operations);
|
|
11
11
|
registerAnalyzeRoomPhoto(server, operations);
|
|
12
12
|
}
|
|
13
|
-
export { analyzeFloorplanImageInput, analyzeFloorplanImageOutput, registerAnalyzeFloorplanImage, } from './analyze-floorplan-image';
|
|
14
|
-
export { analyzeRoomPhotoInput, analyzeRoomPhotoOutput, registerAnalyzeRoomPhoto, } from './analyze-room-photo';
|
|
13
|
+
export { analyzeFloorplanImageInput, analyzeFloorplanImageOutput, registerAnalyzeFloorplanImage, } from './analyze-floorplan-image.js';
|
|
14
|
+
export { analyzeRoomPhotoInput, analyzeRoomPhotoOutput, registerAnalyzeRoomPhoto, } from './analyze-room-photo.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pascal-app/mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Model Context Protocol server for Pascal 3D editor",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -47,23 +47,24 @@
|
|
|
47
47
|
"CHANGELOG.md"
|
|
48
48
|
],
|
|
49
49
|
"scripts": {
|
|
50
|
-
"build": "tsc --build",
|
|
50
|
+
"build": "tsc --build && bun ../../scripts/fix-node-esm-imports.ts ../core/dist && bun ../../scripts/fix-node-esm-imports.ts dist",
|
|
51
51
|
"dev": "tsgo --build --watch",
|
|
52
52
|
"start": "bun dist/bin/pascal-mcp.js",
|
|
53
53
|
"test": "bun test",
|
|
54
54
|
"smoke": "bun run scripts/smoke.ts",
|
|
55
|
-
"
|
|
55
|
+
"smoke:node": "node dist/bin/pascal-mcp.js --help",
|
|
56
|
+
"prepublishOnly": "bun run build && bun test && bun run smoke:node"
|
|
56
57
|
},
|
|
57
58
|
"peerDependencies": {
|
|
58
|
-
"@pascal-app/core": "^1.0.
|
|
59
|
+
"@pascal-app/core": "^1.0.1"
|
|
59
60
|
},
|
|
60
61
|
"dependencies": {
|
|
61
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
62
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
62
63
|
"@pascal-app/lingo": "^0.2.0",
|
|
63
|
-
"zod": "
|
|
64
|
+
"zod": ">=4.5.4 <4.6"
|
|
64
65
|
},
|
|
65
66
|
"devDependencies": {
|
|
66
|
-
"@pascal-app/core": "^1.0.
|
|
67
|
+
"@pascal-app/core": "^1.0.1",
|
|
67
68
|
"@pascal/typescript-config": "*",
|
|
68
69
|
"@types/node": "^22.19.20",
|
|
69
70
|
"typescript": "6.0.3"
|