AI 클라이언트가 벽, 방, 문, 가구 등을 포함하여 편집 가능한 3D 건축 장면을 생성, 검사, 검증 및 저장할 수 있도록 합니다.
다른 이름 pascalorg/editor, editor, @pascal-app/mcp
- 스타
- 25,486
- Tools
- 53
- 다운로드, 30일
- —
- 최신 버전
- 1.1.4
- 마지막 커밋
- 2026년 11월 12일
- 라이선스
- MIT
Pascal 3D Editor MCP란?
Pascal 3D Editor은(는) MCP server입니다. AI 클라이언트가 벽, 방, 문, 가구 등을 포함하여 편집 가능한 3D 건축 장면을 생성, 검사, 검증 및 저장할 수 있도록 합니다. 53개 도구를 제공합니다. 예: get_scene, get_node, find_by_type.
프로젝트 README에서 생성된 요약
Pascal 3D Editor MCP 설치 방법
형식 확인: 2026년 11월 10일Claude Code에 Pascal 3D Editor MCP 설치
$ claude mcp add editor -- npx -y @pascal-app/mcpCursor에 Pascal 3D Editor MCP 설치
~/.cursor/mcp.json
{
"mcpServers": {
"editor": {
"command": "npx",
"args": [
"-y",
"@pascal-app/mcp"
]
}
}
}VS Code에 Pascal 3D Editor MCP 설치
.vscode/mcp.json
{
"servers": {
"editor": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@pascal-app/mcp"
]
}
}
}Claude Desktop에 Pascal 3D Editor MCP 설치
claude_desktop_config.json
{
"mcpServers": {
"editor": {
"command": "npx",
"args": [
"-y",
"@pascal-app/mcp"
]
}
}
}Codex에 Pascal 3D Editor MCP 설치
~/.codex/config.toml
[mcp_servers.editor] command = "npx" args = ["-y", "@pascal-app/mcp"]
Gemini CLI에 Pascal 3D Editor MCP 설치
~/.gemini/settings.json
{
"mcpServers": {
"editor": {
"command": "npx",
"args": [
"-y",
"@pascal-app/mcp"
]
}
}
}Pascal 3D Editor MCP 도구 53
README에서 감지됨get_sceneget_nodefind_by_typelist_levelsget_level_summaryget_wallsget_zonesget_siteplace_buildingmeasureview_scenesearch_assets
| get_scene | — | |
| get_node | — | |
| find_by_type | — | |
| list_levels | — | |
| get_level_summary | — | |
| get_walls | — | |
| get_zones | — | |
| get_site | — | |
| place_building | — | |
| measure | — | |
| view_scene | — | |
| search_assets | — |
도구 53개 모두 보기도구 수 줄이기
design_briefview_assetssearch_materialspaintcreate_story_shellcreate_stairmeasure_stairfit_staircreate_roofmove_roofs_to_roof_levelcreate_roomadd_dooradd_windowfurnish_roomadd_corner_windowmerge_windowsapply_patchadd_levelset_ground_leveladd_wallset_wall_typeadd_columnadd_fenceplace_itemsplace_designset_zoneduplicate_levelcreate_unitset_unit_memberslist_unitsdelete_nodeclear_sceneundoredoexport_jsonexport_glbvalidate_designverify_scenecheck_collisionsanalyze_floorplan_imageanalyze_room_photo
| design_brief | — | |
| view_assets | — | |
| search_materials | — | |
| paint | — | |
| create_story_shell | — | |
| create_stair | — | |
| measure_stair | — | |
| fit_stair | — | |
| create_roof | — | |
| move_roofs_to_roof_level | — | |
| create_room | — | |
| add_door | — | |
| add_window | — | |
| furnish_room | — | |
| add_corner_window | — | |
| merge_windows | — | |
| apply_patch | — | |
| add_level | — | |
| set_ground_level | — | |
| add_wall | — | |
| set_wall_type | — | |
| add_column | — | |
| add_fence | — | |
| place_items | — | |
| place_design | — | |
| set_zone | — | |
| duplicate_level | — | |
| create_unit | — | |
| set_unit_members | — | |
| list_units | — | |
| delete_node | — | |
| clear_scene | — | |
| undo | — | |
| redo | — | |
| export_json | — | |
| export_glb | — | |
| validate_design | — | |
| verify_scene | — | |
| check_collisions | — | |
| analyze_floorplan_image | — | |
| analyze_room_photo | — |
구성
PASCAL_DATA_DIRPASCAL_MCP_HTTP_TOKEN
| 이름 | 설명 | 유형 |
|---|---|---|
| PASCAL_DATA_DIR | — | |
| PASCAL_MCP_HTTP_TOKEN | — |
자동 검사
2026년 11월 11일에 실행됨전체 보고서 →자동 검사를 통과했습니다. 이는 보안 감사가 아닙니다. 코드를 직접 읽고 서버에 필요한 최소한의 권한만 부여하십시오. 검사 방식
- 소스 저장소 연결 및 접근 가능통과
- 오픈 소스 라이선스 (OSI)통과
- 최근 1년 내 커밋 또는 릴리스통과
- 패키지 이름이 인기 패키지와 유사하지 않음통과
- 원격 엔드포인트가 HTTPS 사용통과
- 파괴적인 도구에 라벨 표시됨검사되지 않음
- 모델에 대한 숨겨진 지침 없음통과
- 패키지와 의존성에 심각한 보안 권고 없음통과
README
GitHub에서 보기@pascal-app/mcp
Also listed on Smithery.
Model Context Protocol server for the Pascal 3D editor. Drives the
@pascal-app/core scene graph from any MCP-compatible AI host.
For the hosted Pascal MCP endpoint and copy-ready setup for Claude Code, Codex, Cursor, and OpenClaw, read Connect an AI agent. The hosted endpoint edits projects in a Pascal account; this package is the open-source, local server for custom hosts and local scene storage.
Listed in the official MCP Registry as
app.pascal/editor.
The server runs headlessly in Node.js (22.23.4+ on 22.x, 24.22.1+ on 24.x, or 26.12.1+) or Bun, with no browser, WebGPU, React, or external database service. It exposes the same scene mutations used by the editor UI (create walls, place items, cut openings, undo, etc.) as MCP tools, resources, and prompts.
Recommended local setup
For a local editor and MCP that share projects automatically, install the Pascal CLI:
npx @pascal-app/cli editor
pascal mcp setup codex
pascal editor starts the editor and an authenticated MCP service together.
pascal mcp connect is a stable stdio connector that discovers the dynamic loopback
port, so MCP client configuration contains neither a changing port nor a secret.
Use this package directly when embedding the MCP server, supplying a custom store, or running MCP without the Pascal editor.
Install the package directly
bun add @pascal-app/mcp
@pascal-app/core is a peer dependency. The local store uses Bun SQLite under Bun and
Node's built-in SQLite driver under Node.js.
Quick start
Launch the server over stdio in one line:
bunx @pascal-app/mcp
# or
npm exec --package=@pascal-app/mcp -- pascal-mcp
Load an initial scene from disk:
bunx @pascal-app/mcp --stdio --scene ./my-scene.json
Expose it over loopback HTTP:
bunx @pascal-app/mcp --http --port 8787
Binding a non-loopback host requires a bearer token:
PASCAL_MCP_HTTP_TOKEN="$(openssl rand -hex 32)" \
bunx @pascal-app/mcp --http --host 0.0.0.0 --port 8787 --cors-origin https://editor.example
Local scene storage
Scenes saved through MCP are stored in a local SQLite database:
~/.pascal/data/pascal.db
Set PASCAL_DATA_DIR when you want the MCP server and the running editor to
share a different directory, or PASCAL_DB_PATH when you need an exact database
file path. The store uses WAL mode and transactional version checks so separate
local processes can save and open the same scene database.
During workspace development, run both sides with the same data directory:
# Terminal 1: run the editor
PASCAL_DATA_DIR="$HOME/.pascal/data" bun run dev
# Terminal 2 or an MCP host: run the server
PASCAL_DATA_DIR="$HOME/.pascal/data" bun packages/mcp/dist/bin/pascal-mcp.js
Local geometry artifacts
Scripted objects keep their GLB and source in <database-path>.artifacts/<sha256> beside the
local SQLite scene database, where saved scenes live (also with --scene, which only seeds the
first scene); keep that directory with the database. Files are verified against their hash and
written once, so saved scenes and undo history keep their original geometry. The standalone
editor reads and writes the same database-side store.
Local MCP compilation is opt-in with PASCAL_SERVER_SCRIPT_COMPILE=1. It runs in a separate
process without inherited environment variables, with a deadline; this is not a sandbox for
untrusted code. Blender (bpy) modules run in the Blender binary PASCAL_BLENDER names
(blender -b), with the same caveat; Blender geometry scripts
walks through one. get_source can read saved scripts without enabling compilation.
Live editor updates
When the editor and MCP server share the same PASCAL_DATA_DIR, MCP mutations
against a loaded saved scene are persisted to SQLite and recorded in a local
scene_events stream. The editor page subscribes to that stream at
/api/scenes/:id/events with server-sent events, so an open browser tab can
apply scene graph snapshots as the agent edits the scene.
The flow is intentionally local and lightweight:
- Open or create a scene in the editor so it is saved in the local database.
- Load that scene through MCP with
load_scene. - Run MCP mutation tools such as
create_room,add_door,furnish_room,add_wall,place_items, orset_zone.
Each mutation version-checks the saved scene before writing. If the browser or
another MCP process saved a newer version first, the MCP tool returns
live_sync_version_conflict; reload the scene with load_scene before
continuing.
Managed CLI client configuration
The recommended JSON configuration for Claude Desktop, Cursor, and compatible clients is:
Edit ~/Library/Application Support/Claude/claude_desktop_config.json
(macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"pascal": {
"command": "pascal",
"args": ["mcp", "connect"]
}
}
}
Claude Code
Via the CLI:
pascal mcp setup claude
Or add to .mcp.json at the repo root:
{
"mcpServers": {
"pascal": {
"command": "pascal",
"args": ["mcp", "connect"]
}
}
}
For package-development testing without the managed CLI, build first and point Claude Code at the built binary:
{
"mcpServers": {
"pascal": {
"command": "node",
"args": ["/absolute/path/to/editor/packages/mcp/dist/bin/pascal-mcp.js"],
"env": {
"PASCAL_DATA_DIR": "/Users/you/.pascal/data"
}
}
}
}
Codex CLI
Via the CLI:
pascal mcp setup codex
For local workspace testing before publish:
bun run --cwd packages/mcp build
codex mcp add pascal-dev \
--env PASCAL_DATA_DIR="$HOME/.pascal/data" \
-- node "$PWD/packages/mcp/dist/bin/pascal-mcp.js"
This writes an entry like this to ~/.codex/config.toml:
[mcp_servers.pascal-dev]
command = "node"
args = ["/absolute/path/to/editor/packages/mcp/dist/bin/pascal-mcp.js"]
[mcp_servers.pascal-dev.env]
PASCAL_DATA_DIR = "/Users/you/.pascal/data"
Cursor config
In Cursor settings (settings.json):
{
"mcp.servers": {
"pascal": {
"command": "pascal",
"args": ["mcp", "connect"]
}
}
}
Programmatic use
Embed the server in your own Node.js or Bun process using the in-memory transport. The example below runs a full client/server pair inside a single script — useful for agent frameworks and tests.
import { createPascalMcpServer, SceneBridge } from '@pascal-app/mcp'
import { Client, InMemoryTransport } from '@modelcontextprotocol/client'
const bridge = new SceneBridge()
// Or over a detached scene a host opened (`@pascal-app/core/runtime`): every tool then reads and
// writes that scene, with its ids, and the host turns it into a patch.
// const bridge = new SceneBridge({ runtime: openDetachedScene(snapshot, options) })
bridge.loadDefault()
const server = createPascalMcpServer({ bridge })
const [srvT, cliT] = InMemoryTransport.createLinkedPair()
const client = new Client({ name: 'my-agent', version: '0.1.0' })
await Promise.all([server.connect(srvT), client.connect(cliT)])
const tools = await client.listTools()
console.log('available tools:', tools.tools.map((t) => t.name))
const scene = await client.callTool({ name: 'get_scene', arguments: {} })
console.log(scene)
A host that passes its own operations (createPascalMcpServer({ operations })) may implement
runInScene(run): every tool handler starts inside it, and tools re-enter it after their awaits,
so the ids a tool mints and the operations it plans run in the scene's synchronous scope. It is
optional; without it handlers run as they always have, with random ids. An implementation that
computes on a detached scene must provide it, delegating to SceneBridge.runInScene, or its tools'
ids will not be the scene's and a recomputed effect will not match.
See examples/embed-in-agent.ts for a
compilable version.
Plugin tools and the person's floor
A plugin's 'operation' tools register with the same runner as the shared
tools: it parses the input, applies the outcome as one history step and answers
with achieved and the refusals. The annotations are the host's, never read
from the plugin's contract.
import { createSceneOperations } from '@pascal-app/mcp/operations'
import { registerOperationTool } from '@pascal-app/mcp/tools/shared-tools'
import { signageAgentTools } from 'acme-signage/agent-tools'
import { signageAgentOperations } from 'acme-signage/agent-operations'
const operations = createSceneOperations({
bridge,
// The floor the person is viewing: a tool call that names no level reads it.
// Leave it out on a host with no view, and the lowest storey is read.
activeLevelId: () => myHost.viewedLevelId(),
})
for (const contract of signageAgentTools.tools) {
if (contract.runsIn !== 'operation') continue
registerOperationTool(server, operations, {
contract,
operation: signageAgentOperations[contract.name],
annotations: { readOnlyHint: false, destructiveHint: false },
})
}
The contract shapes, versions and trust rules are in plugin authoring.
Coordinate conventions
Pascal is a right-handed scene where X and Z form the ground plane and Y
is up. Lengths are in metres; rotations are radians, stored as Euler
[x, y, z] tuples.
Plan → world. Every 2-D point you pass is a level/building-local
ground-plane coordinate
[x, z] — this includes wall.start / wall.end and the polygon / holes
arrays of slab, zone, and ceiling. With the default identity building
transform, it appears in world space as:
[x, z] → (x, y, z) // the 2nd component is world Z (depth), not "up"
There is no sign flip in the stored convention: tooling consumes the second
component as world Z directly. The vertical y starts from the owning level's
stacked height as computed by the level system from accumulated level heights,
plus the element's own height; slabs additionally carry an absolute
elevation.
Heads-up when you compute coordinates outside the editor. Pascal's
viewports apply their own rotations on top of the world axes: the 2-D plan
panel rotates its content by the user's view rotation (north-aligned = 0°,
FLOORPLAN_VIEW_ROTATION_DEG baseline, north = world −Z), and
the 3-D "top-down" snap preserves the camera's current azimuth, so when invoked
from the iso default position, world and screen axes are offset by ~45° until
you orbit to an axis-aligned view. So a layout authored as if
"Y = north, viewed top-down" — common in land surveys, north-up site plans,
and 2-D plotting libraries — will arrive rotated relative to its source
when viewed in Pascal (and possibly further reflected, depending on which
viewport and camera state you're in). The editor's own 2-D and 3-D tools are
internally consistent with their stored coordinates, so this only affects
geometry authored programmatically. To verify orientation before trusting
externally-computed coordinates, place a scaled guide image at known anchor
points and check alignment; apply whatever rotation (or reflection) your
authoring side needs to match.
A worked demonstration of all of this — axis-aligned baseline, the rotated
30° example below, and a paired "page-intent vs world-result" L for the
external-coordinate gotcha — lives in
examples/coordinate-conventions-demo.md
and examples/coordinate-conventions-demo.json.
Load the JSON with
bunx @pascal-app/mcp --stdio --scene examples/coordinate-conventions-demo.json.
Example — a 6 × 4 m slab rotated 30° about its first corner (coordinates rounded to 3 dp; sides ≈ 6 m / 4 m; not axis-aligned, so the mapping is actually exercised):
{
"op": "create",
"parentId": "<levelId>",
"node": {
"type": "slab",
"elevation": 0.0,
"polygon": [[0, 0], [5.196, 3.0], [3.196, 6.464], [-2.0, 3.464]]
}
}
This lands flat on the ground (Y = 0), about 6 m along a heading 30° off the +X axis and 4 m along its perpendicular — i.e. occupying world (x, z) directly.
One separate gotcha: wall-attached coordinates are wall-local, not plan
coordinates. Stored door/window position[0] is metres along the wall, and
wall-attached rotations are wall-local too.
Pascal 3D Editor MCP 질문
Pascal 3D Editor MCP를 Claude Code에 추가하려면 어떻게 하나요?
터미널에서 claude mcp add editor -- npx -y @pascal-app/mcp를 실행합니다. 모든 프로젝트에서 사용할 수 있게 하려면 --scope user를 추가합니다.
Pascal 3D Editor MCP를 Cursor에 추가하려면 어떻게 하나요?
~/.cursor/mcp.json를 열고 mcpServers 아래에 서버를 추가합니다. 위 설치 섹션에 표시된 Cursor 구성을 사용합니다.
Pascal 3D Editor MCP는 어떤 도구를 제공하나요?
53개 도구를 제공합니다. 예: get_scene, get_node, find_by_type, list_levels, get_level_summary.
Pascal 3D editor MCP server는 어떤 역할을 하나요?
Pascal editor의 장면 변형(scene mutations) 기능을 MCP 도구로 제공하여, AI 호스트가 벽, 방, 문, 아이템을 포함한 3D 건축 장면을 구축하고 편집할 수 있게 합니다.
Pascal MCP server는 저장된 장면을 어디에 보관하나요?
MCP를 통해 저장된 장면은 ~/.pascal/data/pascal.db에 있는 로컬 SQLite 데이터베이스에 저장됩니다. PASCAL_DATA_DIR 또는 PASCAL_DB_PATH를 사용하여 위치를 변경할 수 있습니다.
Pascal MCP server를 로컬에서 실행하려면 어떻게 해야 하나요?
bunx @pascal-app/mcp를 사용하여 stdio를 통해 실행하거나, --http 및 --port 플래그를 사용하여 loopback HTTP로 노출할 수 있습니다. 권장 설정은 'pascal editor' 실행 후 Pascal CLI에서 'pascal mcp connect'를 사용하는 것입니다.
Pascal MCP server를 사용하려면 토큰이 필요한가요?
Loopback HTTP는 토큰이 필요하지 않지만, loopback이 아닌 호스트에 바인딩하려면 PASCAL_MCP_HTTP_TOKEN을 통해 bearer 토큰을 설정해야 합니다.
AI agent가 장면을 편집하는 동안 editor를 실시간으로 업데이트할 수 있나요?
네. editor와 MCP server가 동일한 데이터 디렉토리를 공유하면, 변형 사항이 영구 저장되며 server-sent events를 통해 열려 있는 editor 탭으로 스트리밍됩니다.