fix(mcp): add shared operations and secure scene APIs

This commit is contained in:
Aymeric Rabot
2026-04-27 17:10:25 -04:00
parent 058ee747c9
commit 8dfd1a9429
81 changed files with 1332 additions and 1786 deletions
+5 -10
View File
@@ -1,20 +1,15 @@
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
import type { SceneBridge } from '../../bridge/scene-bridge'
import type { SceneStore } from '../../storage/types'
import type { SceneOperations } from '../../operations'
import { registerPhotoToScene } from './photo-to-scene'
/**
* Register the `photo_to_scene` orchestrator tool. Chains the vision
* (`analyze_floorplan_image`-equivalent sampling call) → SceneGraph
* synthesis → optional `SceneStore.save``bridge.setScene` so callers get a
* navigable Pascal scene from a single photo upload.
* synthesis → optional scene save → bridge setScene so callers get a navigable
* Pascal scene from a single photo upload.
*/
export function registerPhotoToSceneTool(
server: McpServer,
bridge: SceneBridge,
store: SceneStore,
): void {
registerPhotoToScene(server, bridge, store)
export function registerPhotoToSceneTool(server: McpServer, bridge: SceneOperations): void {
registerPhotoToScene(server, bridge)
}
export {
@@ -4,6 +4,7 @@ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js'
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
import { CreateMessageRequestSchema } from '@modelcontextprotocol/sdk/types.js'
import { SceneBridge } from '../../bridge/scene-bridge'
import { createSceneOperations } from '../../operations'
import { InMemorySceneStore } from '../scene-lifecycle/test-utils'
import { registerPhotoToScene } from './photo-to-scene'
@@ -22,8 +23,9 @@ async function makeWiredPair(opts: { withSampling: boolean; samplingHandler?: Ha
const bridge = new SceneBridge()
bridge.setScene({}, [])
const store = new InMemorySceneStore()
const operations = createSceneOperations({ bridge, store })
const server = new McpServer({ name: 'test', version: '0.0.0' })
registerPhotoToScene(server, bridge, store)
registerPhotoToScene(server, operations)
const [srvT, cliT] = InMemoryTransport.createLinkedPair()
@@ -11,8 +11,7 @@ import {
ZoneNode,
} from '@pascal-app/core/schema'
import { z } from 'zod'
import type { SceneBridge } from '../../bridge/scene-bridge'
import type { SceneStore } from '../../storage/types'
import type { SceneOperations } from '../../operations'
import { appendLiveSceneEvent } from '../live-sync'
/**
@@ -341,11 +340,7 @@ function buildSceneGraphFromVision(
}
}
export function registerPhotoToScene(
server: McpServer,
bridge: SceneBridge,
store: SceneStore,
): void {
export function registerPhotoToScene(server: McpServer, bridge: SceneOperations): void {
server.registerTool(
'photo_to_scene',
{
@@ -375,12 +370,12 @@ export function registerPhotoToScene(
// 4. Save or return inline.
if (save) {
const meta = await store.save({
const meta = await bridge.saveScene({
name,
graph,
})
bridge.setActiveScene(meta)
await appendLiveSceneEvent(store, meta.id, meta.version, 'photo_to_scene', graph)
await appendLiveSceneEvent(bridge, meta.id, meta.version, 'photo_to_scene', graph)
const payload: {
sceneId: string
url: string