给你的 Agent 一双盖房子的手:Pascal MCP 服务器进程内嵌入实战
发布时间:2026/9/27 11:04:44来源:尧图网络
给你的 Agent 一双盖房子的手Pascal MCP 服务器进程内嵌入实战【免费下载链接】editorOpen-source 3D architectural editor with a local CLI, MCP tools, and practical workflows for humans and AI agents.项目地址: https://gitcode.com/GitHub_Trending/editor93/editorPascal Editor 是一款开源 3D 建筑编辑器它的 pascal-app/mcp 包可以把完整的建模服务器塞进你自己的进程里做进程内嵌入不起子进程、不开端口、不依赖浏览器和外部数据库Agent 就能在内存中砌墙、开门窗、摆家具撤销重做照样可用。这篇文章先用一遍跑通的流程演示接进去之后能干什么再拆开三个关键对象最后讲持久化、审计与无头模式的能力边界。先跑一遍从空桥到导出场景的完整链路本节解决接完之后到底长什么样的问题直接采用官方可编译示例 examples/embed-in-agent.ts 的剧本在一个 Bun 进程里跑起客户端 服务器的完整对bun run packages/mcp/examples/embed-in-agent.ts即可执行。第一件事是造一个无头场景。SceneBridgebridge/scene-bridge.ts直连pascal-app/core的 Zustand store所有变更都走真实 store因此 Zundo 时间中间件会把每次修改自动收拢成单步可撤销操作。loadDefault()会先播种一层 Site → Building → Level 层级客户端启动即有可查对象import { createPascalMcpServer, SceneBridge } from pascal-app/mcp const bridge new SceneBridge() bridge.loadDefault() const server createPascalMcpServer({ bridge })接下来把客户端插进来。InMemoryTransport.createLinkedPair()返回一对已接通的传输端点服务端、客户端各连一端API 面与 stdio、HTTP 完全一致只是省掉了进程边界import { Client } from modelcontextprotocol/sdk/client/index.js import { InMemoryTransport } from modelcontextprotocol/sdk/inMemory.js 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)])之后所有建模动作都是普通异步调用。示例给出的剧本是找到楼层 → 建一堵 5 米墙 → 立即撤销 → 校验 → 导出const levels await client.callTool({ name: find_nodes, arguments: { type: level } }) const levelId (levels.structuredContent as { nodes: Array{ id: string } }).nodes[0]?.id await client.callTool({ name: create_wall, arguments: { levelId, start: [0, 0], end: [5, 0], thickness: 0.2, height: 2.5 }, }) await client.callTool({ name: undo, arguments: { steps: 1 } }) await client.callTool({ name: validate_scene, arguments: {} }) const exported await client.callTool({ name: export_json, arguments: { pretty: true } })注意运行时门槛服务器在无头模式下要求 Node.js 22.13 或更新版本或 Bun。Agent 框架为什么偏爱 InMemoryTransport上一节的示例没有拉起任何pascal-mcp进程这就是本节要回答的问题三种传输方式对自建 Agent 的代价差在哪。传输方式典型使用者是否有进程边界stdio需要把服务器当独立进程拉起的配置式客户端如 Claude Desktop有HTTP多客户端共享同一实例、需要远程访问的场景有InMemory把服务器直接嵌进你自己 Agent 运行时的场景无对自建框架来说InMemory的收益具体有三条不用管进程生命周期没有子进程要拉起和回收也没有端口占用问题能力面零差异内嵌后的 tools / resources / prompts 与另外两种传输完全同构测试里验证过的行为搬到生产不会变形单测友好在测试里秒级搭好客户端 服务器对跑CI 里做端到端断言的成本极低。服务器交给 Agent 的资产工具、资源与提示模板嵌入式接线的价值在于 Agent 一上线就拿到一整套建筑建模工具链30 个工具输入输出全部经 Zod 校验变更类工具被 Zundo 收拢为单步可撤销。按用途分组速览分组代表工具能做什么读场景get_scene/find_nodes/describe_node整图快照、按类型或楼层过滤节点、查看单个节点的血缘与属性建结构create_room/create_wall/create_level/cut_opening由多边形一键生成房间区域 板 顶棚 围合墙、加层、加墙、在墙上切出洞口门窗与家具add_door/add_window/place_item/furnish_room参数化挂门挂窗、按目录摆放家具、按房型自动布置一屋家具批处理与历史apply_patch/undo/redo创建/更新/删除先 dry-run 再原子提交沿时间历史逐步回退与重做校验与交付validate_schema 场景校验/check_collisions/export_json模式与父子关系校验、重叠及越界检测、序列化为 JSON 落盘工具之外还有两类配套资产完整清单见 packages/mcp/README.md5 个资源pascal://scene/current全量场景快照、pascal://scene/current/summary节点计数、包围盒与楼层面积的 Markdown 摘要、pascal://agent/guide写给 Agent 的建造工作流指南、pascal://catalog/items内置家具目录子集、pascal://constraints/{levelId}指定楼层的板轮廓与墙体多边形可当规划上下文3 个提示模板from_brief把80㎡两居室这类文字需求转成增量apply_patch调用序列、iterate_on_feedback按反馈产出最小差异补丁集、renovation_from_photos视觉工具 变更工具串联出翻修方案。把方向盘交给 LLM调用循环完全在你的代码里这节解决模型决策如何落到服务器动作的问题。接法很直接把listTools()的结果转成 function-calling 定义再把模型的选择喂回callTool()// LLM 决定调哪个工具你在本进程内完成路由 const decision await llm.decide({ tools: tools.tools, history }) const result await client.callTool({ name: decision.name, arguments: decision.args, }) // 把 result 当观察结果回喂模型ReAct 循环在此闭合由于没有进程边界思考 → 调工具 → 读场景 → 再思考全程发生在同一事件循环里往返延迟低于 stdio 子进程方案也方便你在中间夹入自定义的校验、限流或人工确认逻辑。官方示例正是按这个思路把整条链路查楼层、建 5 米墙、撤销、校验、导出串成了可编译脚本。落盘与审计createPascalMcpServer 的三个扩展点内存场景够玩但生产 Agent 通常还要存得下、查得到、拦得住。这三件事都走 server.ts 里工厂函数的选项选项作用store注入一个SceneStore实现后save_scene、load_scene、list_scenes等持久化工具随之可用executeTool包住每个工具处理器回调里拿到name、AbortSignal与execute()适合审计日志、耗时统计、权限拦截operations需要更深的定制时整层替换场景操作实现见 operations/SceneStore接口定义在 storage/types.ts核心方法是save/load/list/delete/rename另有项目状态、事件流等可选方法。包里内置了本地 SQLite 实现createSceneStore()storage/index.ts数据库默认落在~/.pascal/data/pascal.db可用PASCAL_DB_PATH或PASCAL_DATA_DIR指向别处换成 Supabase 或自建数据库同样可行。️const server createPascalMcpServer({ bridge, store: await createSceneStore(), executeTool: ({ name, signal, execute }) { console.log([audit] tool${name}) return execute() }, })一个小提醒启用executeTool后SDK 的工具改名机制会直接失败fail closed因为注册生命周期下安全地二次改名做不到——工具命名请在注册前定稿。无头模式的四条边界坐标、冲突与能力上限踩坑成本最高的四件事这节一次讲清。⚠️坐标约定Pascal 采用右手系X/Z 是地面平面、Y 朝上长度单位是米旋转为弧度。2D 平面点[x, z]直接映射为世界坐标(x, y, z)无符号翻转但挂在墙上的门窗其position是墙局部坐标沿墙的米数不是平面坐标。完整推演见 coordinate-conventions-demo.md。版本冲突当 MCP 与编辑器共享同一数据目录PASCAL_DATA_DIR时每次写入都会先做版本检查若浏览器或别的进程先存了更新的版本工具会返回live_sync_version_conflict用load_scene重新加载后再继续即可。能力上限export_glb依赖浏览器端的 Three.js 渲染器无头模式只能返回not_implementedanalyze_floorplan_image、analyze_room_photo等视觉工具要求宿主支持 sampling 能力createMessage不支持时收到结构化的sampling_unavailable。内存与派生几何无头模式没有渲染器消费dirtyNodes它们会持续累积关心可观测性时调bridge.flushDirty()排空墙体斜切、板三角化等派生几何的生成逻辑运行在编辑器 React hooks 里无头侧不会重算但节点数据本身可完整读写。收束一个三对象心智模型把整条链路压缩成一句话SceneBridge提供无头 3D 场景 →createPascalMcpServer装配 30 建筑工具与 5 资源 3 提示 →InMemoryTransport抹掉进程边界让 Agent 循环直接驱动。需要现成剧本时examples/ 目录里还有生成公寓、照片转场景、拍照翻修等完整案例可参考想给编辑器侧配同一套 MCP也可结合npx pascal-app/cli editor走 CLI 路线让 Agent 与浏览器编辑器实时同库协作。【免费下载链接】editorOpen-source 3D architectural editor with a local CLI, MCP tools, and practical workflows for humans and AI agents.项目地址: https://gitcode.com/GitHub_Trending/editor93/editor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网