{"_id":"3dstreet-mcp","_rev":"5-bc1c5a597fa257d8a67c23e17cc44584","name":"3dstreet-mcp","dist-tags":{"latest":"0.2.3"},"versions":{"0.1.0":{"name":"3dstreet-mcp","version":"0.1.0","keywords":["mcp","model-context-protocol","3dstreet","claude","anthropic","aframe","urban-planning"],"author":{"name":"3DStreet contributors"},"license":"AGPL-3.0-or-later","_id":"3dstreet-mcp@0.1.0","maintainers":[{"name":"kfarr","email":"kieran.farr@gmail.com"}],"homepage":"https://github.com/3DStreet/3dstreet-mcp","bugs":{"url":"https://github.com/3DStreet/3dstreet/issues"},"bin":{"3dstreet-mcp":"src/cli.js"},"dist":{"shasum":"8646c06511a02f90e530fa751da85cb93ec116a6","tarball":"https://registry.npmjs.org/3dstreet-mcp/-/3dstreet-mcp-0.1.0.tgz","fileCount":5,"integrity":"sha512-WO5gGTW0kcjvpcvP92KOWpyG9ivOGcxXgb/J5NCGcE90hU2tJSewP3BdUEXmo+7S55kZUzM3pbwOnenESG/zNw==","signatures":[{"sig":"MEQCICoJ1CZ6pS6nwe1+s3ecan8ksQauDy9SxoR5TTQkCLg4AiA0gTxzRUxFC7SQsQlpcPtUhxXQ8Uf8gbaK4AemQqcRqg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54218},"main":"src/relay.js","type":"module","engines":{"node":">=18"},"exports":{".":"./src/relay.js"},"gitHead":"71be1db0fcad407d543eae98e28e7ca9d73c300b","scripts":{"test":"node --test test/*.test.js","start":"node src/cli.js"},"_npmUser":{"name":"kfarr","email":"kieran.farr@gmail.com"},"repository":{"url":"git+https://github.com/3DStreet/3dstreet-mcp.git","type":"git"},"_npmVersion":"10.9.4","description":"Model Context Protocol server for 3DStreet — drive an open 3DStreet tab from Claude Desktop or Claude Code.","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.20.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/3dstreet-mcp_0.1.0_1777834150019_0.5567951539784701","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"3dstreet-mcp","version":"0.2.0","keywords":["mcp","model-context-protocol","3dstreet","claude","anthropic","aframe","urban-planning"],"author":{"name":"3DStreet contributors"},"license":"AGPL-3.0-or-later","_id":"3dstreet-mcp@0.2.0","maintainers":[{"name":"kfarr","email":"kieran.farr@gmail.com"}],"homepage":"https://github.com/3DStreet/3dstreet-mcp","bugs":{"url":"https://github.com/3DStreet/3dstreet/issues"},"bin":{"3dstreet-mcp":"src/cli.js"},"dist":{"shasum":"fdc0ec6bd05f20fb50d7957647d8ea8d0330e0b4","tarball":"https://registry.npmjs.org/3dstreet-mcp/-/3dstreet-mcp-0.2.0.tgz","fileCount":5,"integrity":"sha512-3tkjMwsanyy0aWYylsXgjLf77fWUotgJ3VkchBOVJnP/JnqFvWhoTsjL/3Q4vgBCG3UftLLUwDevxsxxAI/y5Q==","signatures":[{"sig":"MEUCIQCTcgJWvswnonv1aruhLbiw9r6SdQVUzFb8bgw7IQuw/gIgEzgT8T52MIlxwKB8zQCQto4hmsn6PcNOOi0r/apZXZs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59751},"main":"src/relay.js","type":"module","engines":{"node":">=18"},"exports":{".":"./src/relay.js"},"gitHead":"f11c9aa31d41e22616ba49d0de474cbb20588aaf","scripts":{"test":"node --test test/*.test.js","start":"node src/cli.js"},"_npmUser":{"name":"kfarr","email":"kieran.farr@gmail.com"},"repository":{"url":"git+https://github.com/3DStreet/3dstreet-mcp.git","type":"git"},"_npmVersion":"10.9.4","description":"Model Context Protocol server for 3DStreet — drive an open 3DStreet tab from Claude Desktop or Claude Code.","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.20.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/3dstreet-mcp_0.2.0_1778169673099_0.012443553352806891","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"3dstreet-mcp","version":"0.2.1","keywords":["mcp","model-context-protocol","3dstreet","claude","anthropic","aframe","urban-planning"],"author":{"name":"3DStreet contributors"},"license":"AGPL-3.0-or-later","_id":"3dstreet-mcp@0.2.1","maintainers":[{"name":"kfarr","email":"kieran.farr@gmail.com"}],"homepage":"https://github.com/3DStreet/3dstreet-mcp","bugs":{"url":"https://github.com/3DStreet/3dstreet/issues"},"bin":{"3dstreet-mcp":"src/cli.js"},"dist":{"shasum":"1b6e1b22b00df9895f7aba5d06ff1290a0850861","tarball":"https://registry.npmjs.org/3dstreet-mcp/-/3dstreet-mcp-0.2.1.tgz","fileCount":5,"integrity":"sha512-7IsSUYxll5IWK+H3hOqZv0UzSmK0RIjQqXErdoRQ1AvzyqX6XOSlKhKzgKQeH8nzJE9+fyqKkZNMgfQ4oG+QmQ==","signatures":[{"sig":"MEUCIQDZF+6/ZyFroYDFqtkSDsSb4kcDrfkOwd4JGLrNZSD23wIgW5nQc1M1xc7Y0UP0rno/xOIkKK2QZafhWm+S2rznuh4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59789},"main":"src/relay.js","type":"module","engines":{"node":">=18"},"exports":{".":"./src/relay.js"},"gitHead":"c9644ce755eaa84ea9247697be907bbd61d4f95b","mcpName":"app.3dstreet/3dstreet","scripts":{"test":"node --test test/*.test.js","start":"node src/cli.js"},"_npmUser":{"name":"kfarr","email":"kieran.farr@gmail.com"},"repository":{"url":"git+https://github.com/3DStreet/3dstreet-mcp.git","type":"git"},"_npmVersion":"10.9.4","description":"Model Context Protocol server for 3DStreet — drive an open 3DStreet tab from Claude Desktop or Claude Code.","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.20.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/3dstreet-mcp_0.2.1_1778170245006_0.8586963167836652","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"3dstreet-mcp","version":"0.2.2","keywords":["mcp","model-context-protocol","3dstreet","claude","anthropic","aframe","urban-planning"],"author":{"name":"3DStreet contributors"},"license":"AGPL-3.0-or-later","_id":"3dstreet-mcp@0.2.2","maintainers":[{"name":"kfarr","email":"kieran.farr@gmail.com"}],"homepage":"https://github.com/3DStreet/3dstreet-mcp","bugs":{"url":"https://github.com/3DStreet/3dstreet/issues"},"bin":{"3dstreet-mcp":"src/cli.js"},"dist":{"shasum":"c8d170932dae03cf16f59d88d6af8a69f527dc29","tarball":"https://registry.npmjs.org/3dstreet-mcp/-/3dstreet-mcp-0.2.2.tgz","fileCount":5,"integrity":"sha512-9oEai+2eEiCO0cX34eNN0sGmjf4KIDJeK7lZ1nCMphJs4mR2DOlfWiK5hKHnmsD0KfGBE/0GpAAYBEZ1Nr6uWQ==","signatures":[{"sig":"MEUCIA+lAUrjeknQKv7IZ+fuE8pps6xHqQM9USvjzlDZsq+BAiEA1OAb2TuvqmgzpqRqHzjhm74Evzz5C0hD7W64K3ZBwmM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60062},"main":"src/relay.js","type":"module","engines":{"node":">=18"},"exports":{".":"./src/relay.js"},"gitHead":"d53ee862e55ac11f76beb9bfeff6b2707e95c4cc","mcpName":"app.3dstreet/3dstreet","scripts":{"test":"node --test test/*.test.js","start":"node src/cli.js"},"_npmUser":{"name":"kfarr","email":"kieran.farr@gmail.com"},"repository":{"url":"git+https://github.com/3DStreet/3dstreet-mcp.git","type":"git"},"_npmVersion":"10.9.4","description":"Model Context Protocol server for 3DStreet — drive an open 3DStreet tab from Claude Desktop or Claude Code.","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.20.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/3dstreet-mcp_0.2.2_1778170653654_0.7231877474180957","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"3dstreet-mcp","version":"0.2.3","mcpName":"app.3dstreet/3dstreet","description":"Fallback MCP relay for 3DStreet: drive an open 3DStreet tab from clients without WebMCP (Claude Desktop, Claude Code). Browser-embedded agents should use WebMCP directly at https://3dstreet.app — nothing to install.","type":"module","main":"src/relay.js","exports":{".":"./src/relay.js"},"bin":{"3dstreet-mcp":"src/cli.js"},"scripts":{"start":"node src/cli.js","test":"node --test test/*.test.js"},"engines":{"node":">=18"},"license":"AGPL-3.0-or-later","author":{"name":"3DStreet contributors"},"homepage":"https://github.com/3DStreet/3dstreet-mcp","repository":{"type":"git","url":"git+https://github.com/3DStreet/3dstreet-mcp.git"},"bugs":{"url":"https://github.com/3DStreet/3dstreet/issues"},"keywords":["mcp","model-context-protocol","3dstreet","claude","anthropic","aframe","urban-planning"],"dependencies":{"ws":"^8.20.0"},"_id":"3dstreet-mcp@0.2.3","gitHead":"89c9b5b5ad0dfe0ee893ed37bdd335b3d16e33ea","_nodeVersion":"22.22.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-Tx0xLdoXHRv7DQ0BjDjTWTybq6nJJIvKKKfJbC9Af+Hf5YlS1x1cSOZMGD/okazkwHP6+cjTJ110GTpGPO1+IQ==","shasum":"45637c77462afa15c0effa4ffe357c350a4e6c15","tarball":"https://registry.npmjs.org/3dstreet-mcp/-/3dstreet-mcp-0.2.3.tgz","fileCount":5,"unpackedSize":61166,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCsY/tjIDFxAAPKm/hbS6huhoolXwg0J6U4bYaBCKDIHwIhALaHgSYAtPj4JjndOXx7ajoejP/u6MwP/YOKaeB+uc8o"}]},"_npmUser":{"name":"kfarr","email":"kieran.farr@gmail.com"},"directories":{},"maintainers":[{"name":"kfarr","email":"kieran.farr@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/3dstreet-mcp_0.2.3_1788459744477_0.5168805061965867"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-03T18:49:10.018Z","modified":"2026-09-03T18:22:24.780Z","0.1.0":"2026-05-03T18:49:10.156Z","0.2.0":"2026-05-07T16:01:13.245Z","0.2.1":"2026-05-07T16:10:45.182Z","0.2.2":"2026-05-07T16:17:33.814Z","0.2.3":"2026-09-03T18:22:24.620Z"},"bugs":{"url":"https://github.com/3DStreet/3dstreet/issues"},"author":{"name":"3DStreet contributors"},"license":"AGPL-3.0-or-later","homepage":"https://github.com/3DStreet/3dstreet-mcp","keywords":["mcp","model-context-protocol","3dstreet","claude","anthropic","aframe","urban-planning"],"repository":{"type":"git","url":"git+https://github.com/3DStreet/3dstreet-mcp.git"},"description":"Fallback MCP relay for 3DStreet: drive an open 3DStreet tab from clients without WebMCP (Claude Desktop, Claude Code). Browser-embedded agents should use WebMCP directly at https://3dstreet.app — nothing to install.","maintainers":[{"name":"kfarr","email":"kieran.farr@gmail.com"}],"readme":"# 3dstreet-mcp\n\nA [Model Context Protocol][mcp] relay that lets [Claude Desktop][cd] or\n[Claude Code][cc] drive a [3DStreet][3ds] scene running in your browser.\n\n> **Is this the right tool?** This relay is the **fallback** for MCP clients\n> that cannot use WebMCP. If your agent runs *inside* a browser (ChatGPT's\n> desktop browser, Gemini in Chrome, Chrome 149+ with the WebMCP origin\n> trial or `chrome://flags/#enable-webmcp-testing`), you do not need this\n> package: open <https://3dstreet.app> and the page registers the same\n> tools with the browser via `document.modelContext` — nothing to install,\n> no pairing. See the [3DStreet WebMCP docs][webmcp]. Use this relay only\n> for clients with no browser of their own or no WebMCP support (Claude\n> Desktop, Claude Code, Cursor, headless scripts). It will be retired once\n> those clients read WebMCP natively.\n\nListed on the [MCP Registry][registry] as `app.3dstreet/3dstreet`.\n\nStatus: **alpha** — protocol may change. Tracks\n[3DStreet#1582][issue] (design) and\n[3DStreet#1600][pr] (browser side). Scene creation works in any\n3dstreet.app tab; saving and geospatial features require a free\n3DStreet account.\n\n## How it works\n\n```\nClaude Desktop  ── stdio MCP ──▶  3dstreet-mcp  ── ws://127.0.0.1:51735 ──▶  3DStreet tab\nor Claude Code                    (this package)                              (your browser)\n```\n\nThe relay speaks MCP over stdio and bridges every `tools/list` and\n`tools/call` to a 3DStreet tab over a localhost WebSocket. The tab does\nthe actual work — it's already signed in, has the catalog loaded, owns\nthe cloud-save flow. The relay is a dumb pipe.\n\nNo auth tokens cross the WebSocket. The relay's port binds to `127.0.0.1`\nonly and rejects WebSocket upgrades from origins outside the 3DStreet\nallowlist (`https://3dstreet.app`, `https://dev-3dstreet.web.app`,\n`http://localhost:3333`, `http://127.0.0.1:3333`).\n\n## Setup\n\n### Claude Desktop\n\nEdit `~/Library/Application Support/Claude/claude_desktop_config.json`\n(macOS) or `%APPDATA%/Claude/claude_desktop_config.json` (Windows):\n\n```json\n{\n  \"mcpServers\": {\n    \"3dstreet\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"3dstreet-mcp\"]\n    }\n  }\n}\n```\n\nRestart Claude Desktop.\n\n### Claude Code\n\n```bash\nclaude mcp add 3dstreet -- npx -y 3dstreet-mcp\n```\n\n### Pair the browser tab\n\nOn startup the relay prints an auto-pair URL to its log, like:\n\n```\nopen this URL to pair a 3DStreet tab: https://3dstreet.app/#mcp\n```\n\nOpen that URL in a signed-in browser and the editor will detect the\n`#mcp` fragment, open the **AI Assistant** pane, and pair with the\nrelay automatically — no console commands needed. (If you ran the\nrelay on a non-default port the URL will look like\n`https://3dstreet.app/#mcp=PORT`.)\n\nIf you'd rather pair manually: open <https://3dstreet.app>, click\n**AI Assistant** in the right panel, type `/mcp`, and click\n**Reconnect**.\n\nYou can now ask Claude things like:\n\n- \"What's in my current scene?\"\n- \"Add a bike lane on the left side of the street.\"\n- \"Change the environment preset to night.\"\n\nToggle **Read-only** in the status bar to block scene mutations\n(useful when you just want Claude to explain a scene).\n\n## CLI\n\n```\n3dstreet-mcp [options]\n\nOptions:\n  -p, --port <number>    WebSocket port (default 51735)\n  -o, --origin <url>     Origin used in the printed auto-pair URL and\n                         the MCP `instructions` hint (default\n                         https://3dstreet.app — set to\n                         http://localhost:3333 when running 3DStreet\n                         from a local dev server)\n  -h, --help             Show this help\n  -v, --version          Print version and exit\n```\n\nIf you need a different port (e.g. running two Claude clients against\ntwo different tabs), pass `--port` and open the auto-pair URL the\nrelay prints — `https://3dstreet.app/#mcp=PORT` — which both selects\nthe port and triggers auto-pair.\n\nFor local 3DStreet development, point `--origin` at your dev server so\nthe printed URL and the LLM's `instructions` hint both resolve to the\nright tab:\n\n```bash\nnode src/cli.js --origin http://localhost:3333\n# → open this URL to pair a 3DStreet tab: http://localhost:3333/#mcp\n```\n\n## Telling the LLM how to pair\n\nThe relay returns an `instructions` string on every `initialize` (an\noptional MCP field clients may fold into the LLM's system prompt). It\nexplains that scene tools are forwarded to a paired tab, names the\nauto-pair URL, and tells the model to surface that URL to the user\nwhen no tab is connected — so the LLM proactively guides users\nthrough pairing instead of waiting for an opaque tool-call timeout.\n\nWhen no tab has *ever* paired this relay session, `tools/call` also\nfast-fails with the auto-pair URL in the error message, rather than\nqueuing for 30 seconds. Once a tab has paired, brief disconnects\nrevert to the queued retry behaviour so reconnecting peers can drain\nin-flight calls.\n\n## Tools exposed\n\nThe tool list is fetched from the connected browser tab on pair, so it\nalways matches whatever the editor's command registry exposes. As of\n[#1600][pr] that includes:\n\n- **Reads:** `getScene`, `getEntity`, `getSelectedEntity`,\n  `getManagedStreet`, `listMixins`, `getSessionInfo`\n- **Selection / camera:** `selectEntity`, `focusCamera`\n- **Mutations:** `entityCreate`, `entityUpdate`, `entityRemove`,\n  `entityClone`, `entityReparent`, `componentAdd`, `componentRemove`,\n  `segmentAdd`, `segmentUpdate`, `segmentRemove`, `replaceManagedStreet`,\n  …and the rest of the registry\n- **History:** `undo`, `redo`\n\nRun `tools/list` from your MCP client to see the current set.\n\n## Wire protocol (for contributors)\n\nStdio side: line-delimited JSON-RPC 2.0, MCP `2024-11-05`.\n\nWebSocket side: same JSON-RPC envelope, with the relay handling\n`initialize` / `ping` / notifications locally and forwarding only\n`tools/list` and `tools/call` to the peer. The peer assigns its own ids\non incoming frames; replies match by id.\n\nThe single-peer policy: first browser tab to connect holds the slot.\nSecond connection gets WebSocket close code `4001` with reason\n`paired-elsewhere`.\n\n## Development\n\n```bash\ngit clone https://github.com/3DStreet/3dstreet-mcp.git\ncd 3dstreet-mcp\nnpm install\nnpm test\n```\n\nSmoke-test against a real 3DStreet build:\n\n```bash\n# Terminal 1 — the relay, REPL-free, just stdio\nnode src/cli.js\n\n# Terminal 2 — exercise it with the MCP inspector\nnpx @modelcontextprotocol/inspector node src/cli.js\n```\n\n## License\n\nAGPL-3.0-or-later, matching 3DStreet itself.\n\n[mcp]: https://modelcontextprotocol.io\n[webmcp]: https://github.com/3DStreet/3dstreet/blob/main/docs/webmcp.md\n[cd]: https://claude.ai/download\n[cc]: https://docs.claude.com/en/docs/claude-code\n[3ds]: https://3dstreet.app\n[issue]: https://github.com/3DStreet/3dstreet/issues/1582\n[pr]: https://github.com/3DStreet/3dstreet/pull/1600\n[registry]: https://registry.modelcontextprotocol.io/v0.1/servers?search=app.3dstreet/3dstreet\n","readmeFilename":"README.md"}