@helix3/helix-mcp 0.2.2-helix3.14
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/LICENSE +21 -0
- package/README.md +46 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +353 -0
- package/dist/server.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/docs/catalog.md +28 -0
- package/docs/character-world.md +506 -0
- package/docs/manifest.md +51 -0
- package/docs/multiplayer-logic.md +394 -0
- package/docs/multiplayer-templates/chrono-orchard.md +123 -0
- package/docs/multiplayer-templates/collect-a-thon.md +126 -0
- package/docs/multiplayer-templates/collections.md +116 -0
- package/docs/multiplayer-templates/hangout.md +184 -0
- package/docs/multiplayer-templates/obby.md +84 -0
- package/docs/multiplayer-templates/physics-bumper.md +153 -0
- package/docs/multiplayer-templates/physics-football.md +133 -0
- package/docs/multiplayer-templates/relic-bearers.md +140 -0
- package/docs/multiplayer-templates/server-motion.md +128 -0
- package/docs/multiplayer-templates/team-control.md +98 -0
- package/docs/multiplayer-templates/turn-arena.md +159 -0
- package/docs/multiplayer-templates/wave-survival.md +141 -0
- package/docs/multiplayer-world.md +231 -0
- package/docs/publishing.md +42 -0
- package/docs/sdk.md +117 -0
- package/docs/world-recipe.md +137 -0
- package/package.json +33 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Hypersonic Labs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# @hypersoniclabs/helix-mcp
|
|
2
|
+
|
|
3
|
+
The **HELIX Instant MCP server** — gives AI coding agents the platform contract so they can inspect
|
|
4
|
+
it, generate a compatible world, validate it, and publish it. Resources expose the docs an agent
|
|
5
|
+
reads before generating; tools run the same code paths as the human `helix` CLI (it depends on
|
|
6
|
+
`@hypersoniclabs/helix-cli`). Login stays human (`helix login` once); agents check `whoami`.
|
|
7
|
+
|
|
8
|
+
## Use it
|
|
9
|
+
|
|
10
|
+
Add to your MCP client config (Claude Desktop, Cursor, etc.):
|
|
11
|
+
|
|
12
|
+
```jsonc
|
|
13
|
+
{
|
|
14
|
+
"mcpServers": {
|
|
15
|
+
"helix-instant": {
|
|
16
|
+
"command": "npx",
|
|
17
|
+
"args": ["-y", "@hypersoniclabs/helix-mcp@latest"]
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Point it at a backend with the `HELIX_API_URL` env var (defaults to localhost); discovery tools work
|
|
24
|
+
unauthenticated, publishing needs `helix login` (a client token).
|
|
25
|
+
|
|
26
|
+
## Tools
|
|
27
|
+
|
|
28
|
+
`get_started`, `read_doc`, `whoami`, `validate_world`, `publish_world`, `list_my_worlds`,
|
|
29
|
+
`list_systems`, `list_abilities`, `get_package_manifest`, `check_for_updates`.
|
|
30
|
+
|
|
31
|
+
## Resources
|
|
32
|
+
|
|
33
|
+
`helix://docs/{character-world,world-recipe,sdk,manifest,publishing,catalog}` — the agent
|
|
34
|
+
documentation, served from `docs/`.
|
|
35
|
+
|
|
36
|
+
## Develop
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm install
|
|
40
|
+
npm run build # tsc → dist/ (bin: dist/server.js)
|
|
41
|
+
npm test # boots the server over stdio and asserts the tools register
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
This package is intentionally thin: it depends on `@hypersoniclabs/helix-cli` for all publish/validate/discovery
|
|
45
|
+
logic, so the CLI and MCP can never drift. The `humanoid-character` system, its abilities, and
|
|
46
|
+
asset-packs are authored in `helix-web-engine` and published to the catalog the agent discovers.
|
package/dist/server.d.ts
ADDED
package/dist/server.js
ADDED
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
// HELIX Instant MCP server (stdio). The contract: "An AI agent should be able
|
|
4
|
+
// to inspect the HELIX contract, generate a compatible world, test it, package
|
|
5
|
+
// it, and publish it."
|
|
6
|
+
//
|
|
7
|
+
// Resources = the contract (docs an agent reads before generating).
|
|
8
|
+
// Tools = the actions (same code paths as the human `helix` CLI).
|
|
9
|
+
// Login stays human: run `helix login` once; agents check whoami.
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
12
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
13
|
+
const zod_1 = require("zod");
|
|
14
|
+
const node_fs_1 = require("node:fs");
|
|
15
|
+
const node_path_1 = require("node:path");
|
|
16
|
+
const helix_cli_1 = require("@hypersoniclabs/helix-cli");
|
|
17
|
+
const DOCS_DIR = (0, node_path_1.join)(__dirname, '..', 'docs');
|
|
18
|
+
const doc = (name) => (0, node_fs_1.readFileSync)((0, node_path_1.join)(DOCS_DIR, name), 'utf8');
|
|
19
|
+
const TEMPLATES_DIR = (0, node_path_1.join)(DOCS_DIR, 'multiplayer-templates');
|
|
20
|
+
const listTemplateNames = () => (0, node_fs_1.readdirSync)(TEMPLATES_DIR)
|
|
21
|
+
.filter((f) => f.endsWith('.md'))
|
|
22
|
+
.map((f) => f.slice(0, -3))
|
|
23
|
+
.sort();
|
|
24
|
+
// This MCP server's own version (independent of the CLI it depends on).
|
|
25
|
+
const VERSION = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(__dirname, '..', 'package.json'), 'utf8')).version;
|
|
26
|
+
// Toolchain package names in THIS build's scope (HELIX_SCOPE comes from the bundled
|
|
27
|
+
// CLI: @helixdev on staging, @helix3 on helix3, @hypersoniclabs in production) — used
|
|
28
|
+
// in install hints and the docs an agent acts on.
|
|
29
|
+
const CLI_PKG = `${helix_cli_1.HELIX_SCOPE}/helix-cli`;
|
|
30
|
+
const SDK_PKG = `${helix_cli_1.HELIX_SCOPE}/helix-sdk`;
|
|
31
|
+
// Non-prod lanes (staging, helix3): prepend a one-line note to any doc/template that references
|
|
32
|
+
// the SDK. The import specifier never changes; only the package.json dependency is aliased to
|
|
33
|
+
// the lane SDK so the world builds against the lane's wire contract. Production serves verbatim.
|
|
34
|
+
const LANE_SDK_NOTE = `> ⚠️ **${helix_cli_1.HELIX_ENV} toolchain (${helix_cli_1.HELIX_SCOPE}).** Keep every \`@hypersoniclabs/helix-sdk\` import exactly as written — ` +
|
|
35
|
+
`only the package.json *dependency* changes: pin it as ` +
|
|
36
|
+
`\`"@hypersoniclabs/helix-sdk": "npm:${SDK_PKG}@<version from check_for_updates>"\` so the world builds against the ` +
|
|
37
|
+
`${helix_cli_1.HELIX_ENV} wire contract (the production SDK would mismatch the ${helix_cli_1.HELIX_ENV} room).`;
|
|
38
|
+
const withSdkNote = (content) => helix_cli_1.HELIX_ENV !== 'production' && content.includes('@hypersoniclabs/helix-sdk')
|
|
39
|
+
? `${LANE_SDK_NOTE}\n\n${content}`
|
|
40
|
+
: content;
|
|
41
|
+
const server = new mcp_js_1.McpServer({ name: 'helix-instant', version: VERSION }, {
|
|
42
|
+
instructions: [
|
|
43
|
+
'HELIX Instant: build browser worlds with AI and publish them to a play-from-a-link platform.',
|
|
44
|
+
'ALWAYS DISCOVER FIRST: before designing a world, call list_systems + list_abilities to see what is already published — the catalog grows, so reuse a published system/ability instead of rebuilding it.',
|
|
45
|
+
'NEVER GUESS SETTINGS OR CAPABILITIES — read them. get_package_manifest returns the full tunable surface + what a package can do: for a SYSTEM, `config` (every tunable with defaults/ranges: camera modes, body, locomotion, …) + `capabilities` (input actions, blackboard conventions, built-in abilities, API); for an ABILITY, ability.json incl. its configSchema. Read it before you pin OR configure a system/ability — do not invent config keys.',
|
|
46
|
+
'TUNABLES LIVE IN THE MANIFEST `config`, NOT THE TYPESCRIPT CLASS API. Speed, spawn, look-sensitivity, initial look direction, FOV, slope, jump feel — almost everything a designer reaches for is a config VALUE, not a method. If you inspect the Character/LocomotionAbility class and conclude "no setting for X exists", you looked in the wrong place — re-read the manifest `config`. Set values two ways: initial via `Character.create({ config: { locomotion: { runSpeed: 7 }, character: { spawn:{x,z}, camera:{ mode, initialYaw, lookSensitivity } } } })`, or live via `character.config.set("ns.key", value)` (read every tick — use it for timed buffs, re-facing, difficulty). Runtime-only actions (teleport/applyImpulse/respawn/setEnabled/camera.setYaw/addTrauma) are in `capabilities.api`. The character-world recipe has worked examples (timed speed-boost, camera re-face, top-down/2.5D).',
|
|
47
|
+
'MATCH THE CONTROLS TO THE GENRE — every `allow*` gate DEFAULTS TO ON, so you must DISABLE what does not fit, or the player keeps a control the game should not have. A first-person game MUST set `character.camera.allowModeToggle:false` or pressing T still flips to third-person; top-down sets `allowRotate:false`+`allowZoom:false`; a no-jump walking sim/puzzle sets `locomotion.allowJump:false`. Pick the camera mode AND lock the gates that contradict it whenever you configure a character.',
|
|
48
|
+
'PICK THE FOUNDATION: if the world has a player character — ANY camera framing: first-person, third-person, 3D top-down (twin-stick/ARPG/MOBA), 2.5D / side-on (platformer), an avatar that walks/runs/jumps, or behaviors like fly / swim / shoot — build on the humanoid-character system: call get_started({ kind: "character" }). Top-down & 2.5D are just camera/movement config on this system. If players must SEE EACH OTHER or share a game (a hangout, co-op, an arena, a shared-object game), call get_started({ kind: "multiplayer" }) — the hub: a capability-indexed template index (then list_templates + read_template for a complete worked world) plus the declarative game-logic DSL (read_doc multiplayer-logic). You write no server code. For a bare scene with no character, get_started({ kind: "scene" }).',
|
|
49
|
+
'THEN BUILD: follow the recipe get_started returns EXACTLY (do NOT guess the format) → generate the files → npm install (a character world also needs `helix install` to resolve its pins) → npm run build → validate_world on dist/ and fix every problem → whoami → publish_world on dist/ for the public play link.',
|
|
50
|
+
`Deeper references via read_doc (character-world, multiplayer-world, multiplayer-logic, sdk, manifest, publishing, catalog). For shared game state beyond presence (scores, teams, server objects, rules) read multiplayer-logic. Run check_for_updates to confirm the toolchain (CLI/MCP) + a project’s ${SDK_PKG} are current.`,
|
|
51
|
+
].join('\n'),
|
|
52
|
+
});
|
|
53
|
+
// ---- Resources: the platform contract --------------------------------------
|
|
54
|
+
const RESOURCES = [
|
|
55
|
+
{
|
|
56
|
+
uri: 'helix://docs/character-world',
|
|
57
|
+
name: 'Character world recipe',
|
|
58
|
+
file: 'character-world.md',
|
|
59
|
+
description: 'Recipe for a world with a player character on the humanoid-character system: discover + pin systems/abilities, helix install, the Character/ability flow, first/third-person, top-down/2.5D, and the single-three + assets-from-CDN rules.',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
uri: 'helix://docs/multiplayer-world',
|
|
63
|
+
name: 'Multiplayer hub (start here for multiplayer)',
|
|
64
|
+
file: 'multiplayer-world.md',
|
|
65
|
+
description: 'The multiplayer HUB — the entry point for worlds where players share a space and/or a game. The model + the v0.3 manifest opt-in (maxPlayers + the multiplayer permission) + a presence on-ramp (joinRoom, ReplicaScene/NetworkDriver, sendState), and a capability-indexed index of 12 worked templates (presence, server/owned/shared/physics entities, collections, state machine, time, checkpoints, teams) routing to read_template + the multiplayer-logic DSL. Platform-owned authoritative room; you write no server code.',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
uri: 'helix://docs/multiplayer-logic',
|
|
69
|
+
name: 'Multiplayer logic — the declarative DSL reference',
|
|
70
|
+
file: 'multiplayer-logic.md',
|
|
71
|
+
description: 'Reference for HELIX server-authoritative multiplayer GAME LOGIC declared as data in helix.json (you write no server code): roomVars/playerVars, the when/if/then rule DSL, server- and client-hosted entities, zones, timers, a state machine, broadcast events, client actions, structured collections, and ownership/presence. Read this when a world needs shared game state beyond presence (scores, teams, objects, rules).',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
uri: 'helix://docs/world-recipe',
|
|
75
|
+
name: 'World project recipe',
|
|
76
|
+
file: 'world-recipe.md',
|
|
77
|
+
description: 'Bare-scene recipe (no player character): complete file-by-file recipe for a publishable HELIX Instant world (Vite + Three.js + SDK).',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
uri: 'helix://docs/sdk',
|
|
81
|
+
name: `SDK contract (${SDK_PKG})`,
|
|
82
|
+
file: 'sdk.md',
|
|
83
|
+
description: 'Full SDK API contract: Helix.init(), auth APIs, login overlay behavior, standalone mode.',
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
uri: 'helix://docs/manifest',
|
|
87
|
+
name: 'Manifest reference (helix.json)',
|
|
88
|
+
file: 'manifest.md',
|
|
89
|
+
description: 'Every helix.json field with constraints, plus bundle rules (size caps, allowed file types).',
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
uri: 'helix://docs/publishing',
|
|
93
|
+
name: 'Publishing workflow',
|
|
94
|
+
file: 'publishing.md',
|
|
95
|
+
description: 'How validation and publishing work, what errors mean, and the human login prerequisite.',
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
uri: 'helix://docs/catalog',
|
|
99
|
+
name: 'Platform catalog (systems, abilities, asset-packs)',
|
|
100
|
+
file: 'catalog.md',
|
|
101
|
+
description: 'What systems/abilities/asset-packs are and how an agent discovers and configures them (list_* + get_package_manifest).',
|
|
102
|
+
},
|
|
103
|
+
];
|
|
104
|
+
for (const r of RESOURCES) {
|
|
105
|
+
server.registerResource(r.name, r.uri, { description: r.description, mimeType: 'text/markdown' }, () => ({ contents: [{ uri: r.uri, mimeType: 'text/markdown', text: doc(r.file) }] }));
|
|
106
|
+
}
|
|
107
|
+
// ---- Tools ------------------------------------------------------------------
|
|
108
|
+
const text = (s) => ({ content: [{ type: 'text', text: s }] });
|
|
109
|
+
const errText = (s) => ({ content: [{ type: 'text', text: s }], isError: true });
|
|
110
|
+
const GET_STARTED_ROUTER = [
|
|
111
|
+
'Pick the recipe that matches the world, then call get_started again with that kind:',
|
|
112
|
+
'',
|
|
113
|
+
'- get_started({ kind: "character" }) — the world has a PLAYER CHARACTER, in ANY camera framing:',
|
|
114
|
+
' first-person, third-person, 3D top-down (twin-stick/ARPG/MOBA), 2.5D / side-on platformer, an',
|
|
115
|
+
' avatar that walks/runs/jumps, or behaviors like fly/swim/shoot. Built on the published',
|
|
116
|
+
' humanoid-character system. Discover the abilities you can pin first: list_abilities.',
|
|
117
|
+
'- get_started({ kind: "multiplayer" }) — a world where players SHARE a space and/or a GAME: presence',
|
|
118
|
+
' (see each other move) AND declarative game logic — scores, teams, server/owned/physics entities, zones,',
|
|
119
|
+
' timers, turns. Built on the character system; you write NO server code. It returns the HUB (a',
|
|
120
|
+
' capability-indexed index of 12 worked templates) → list_templates + read_template for a complete world,',
|
|
121
|
+
' plus read_doc({ name: "multiplayer-logic" }) for the full DSL.',
|
|
122
|
+
'- get_started({ kind: "scene" }) — a BARE scene with no character (a spinning object, a data viz, a',
|
|
123
|
+
' menu, an ambient experience).',
|
|
124
|
+
'',
|
|
125
|
+
'Unsure? If the user controls a character, or the world has movement or abilities, it is a character world',
|
|
126
|
+
'— regardless of camera angle (top-down and 2.5D included). If players share a space OR any shared game',
|
|
127
|
+
'state (seeing each other, scores, teams, shared objects), it is multiplayer.',
|
|
128
|
+
].join('\n');
|
|
129
|
+
server.registerTool('get_started', {
|
|
130
|
+
description: 'REQUIRED FIRST STEP before building any HELIX Instant world. Returns the complete project recipe. Pass kind="character" for a world with a player character in ANY camera framing — all built on the humanoid-character system. Pass kind="multiplayer" for a world where players share a space and/or a game — presence PLUS declarative game logic (scores, teams, entities, physics, turns); returns the multiplayer HUB that routes to 12 worked templates + the multiplayer-logic DSL (you write no server code). Pass kind="scene" for a bare scene with no character. Omit kind to get the decision guide.',
|
|
131
|
+
inputSchema: {
|
|
132
|
+
kind: zod_1.z.enum(['character', 'multiplayer', 'scene']).optional().describe('"character" = humanoid-character world; "multiplayer" = shared world (presence + declarative game logic; the hub + 12 templates + the DSL); "scene" = bare world; omit for the decision guide'),
|
|
133
|
+
},
|
|
134
|
+
}, ({ kind }) => {
|
|
135
|
+
if (kind === 'character')
|
|
136
|
+
return text(withSdkNote(doc('character-world.md')));
|
|
137
|
+
if (kind === 'multiplayer')
|
|
138
|
+
return text(withSdkNote(doc('multiplayer-world.md')));
|
|
139
|
+
if (kind === 'scene')
|
|
140
|
+
return text(withSdkNote(doc('world-recipe.md')));
|
|
141
|
+
return text(withSdkNote(GET_STARTED_ROUTER));
|
|
142
|
+
});
|
|
143
|
+
server.registerTool('read_doc', {
|
|
144
|
+
description: `Read a HELIX Instant reference document: "character-world", "multiplayer-world" (shared-presence worlds: join flow, replicas, sendState), "multiplayer-logic" (the declarative game-logic DSL: declared state, when/if/then rules, entities, zones, timers, state machine, collections, ownership), "sdk" (full ${SDK_PKG} API), "manifest" (every helix.json field + bundle rules), "publishing" (pipeline, login, error semantics), "catalog" (platform systems/abilities/asset-packs).`,
|
|
145
|
+
inputSchema: { name: zod_1.z.enum(['character-world', 'multiplayer-world', 'multiplayer-logic', 'sdk', 'manifest', 'publishing', 'catalog']) },
|
|
146
|
+
}, ({ name }) => text(withSdkNote(doc(`${name}.md`))));
|
|
147
|
+
server.registerTool('list_templates', {
|
|
148
|
+
description: 'List the available multiplayer world TEMPLATES — complete, publish-shaped worked worlds, one per capability cluster (presence, server/owned/shared/physics entities, collections, state machine, time, checkpoints, teams). After get_started({kind:"multiplayer"}), pick the closest and read it with read_template({name}).',
|
|
149
|
+
inputSchema: {},
|
|
150
|
+
}, () => {
|
|
151
|
+
const names = listTemplateNames();
|
|
152
|
+
if (names.length === 0)
|
|
153
|
+
return text('No multiplayer templates available yet.');
|
|
154
|
+
return text(`Multiplayer templates (read one with read_template({ name })):\n${names.map((n) => `- ${n}`).join('\n')}`);
|
|
155
|
+
});
|
|
156
|
+
server.registerTool('read_template', {
|
|
157
|
+
description: 'Read a complete, publish-shaped multiplayer world template: its DSL checklist, the full public/helix.json (incl. the multiplayer block), the client src/main.ts delta, and build/publish steps. Pick the name from the hub (get_started multiplayer) or list_templates — e.g. "hangout".',
|
|
158
|
+
inputSchema: { name: zod_1.z.string().describe('Template name, e.g. "hangout" (see list_templates)') },
|
|
159
|
+
}, ({ name }) => {
|
|
160
|
+
const names = listTemplateNames();
|
|
161
|
+
if (!names.includes(name))
|
|
162
|
+
return errText(`No template "${name}". Available: ${names.join(', ') || '(none yet)'}.`);
|
|
163
|
+
return text(withSdkNote(doc(`multiplayer-templates/${name}.md`)));
|
|
164
|
+
});
|
|
165
|
+
server.registerTool('whoami', {
|
|
166
|
+
description: 'Check HELIX login state. Publishing requires a logged-in creator account; if not logged in, ask the human to run `helix login` (interactive — agents cannot do it).',
|
|
167
|
+
inputSchema: {},
|
|
168
|
+
}, () => {
|
|
169
|
+
const status = (0, helix_cli_1.authStatus)();
|
|
170
|
+
if (!status.loggedIn) {
|
|
171
|
+
return text(`Not logged in. Ask the human to run: npm i -g ${CLI_PKG} && helix login`);
|
|
172
|
+
}
|
|
173
|
+
return text(`Logged in as ${status.username} against ${status.apiUrl} (token valid until ${status.expiresAt ?? 'unknown'}).`);
|
|
174
|
+
});
|
|
175
|
+
server.registerTool('validate_world', {
|
|
176
|
+
description: 'Validate a built world bundle directory (the Vite dist/ folder containing helix.json) against the exact rules the platform enforces at publish. Run this after building and fix every reported problem before publishing.',
|
|
177
|
+
inputSchema: { directory: zod_1.z.string().describe('Absolute path to the built bundle directory (e.g. the dist/ folder)') },
|
|
178
|
+
}, ({ directory }) => {
|
|
179
|
+
const result = (0, helix_cli_1.checkBundle)((0, node_path_1.resolve)(directory));
|
|
180
|
+
if (result.errors.length) {
|
|
181
|
+
return errText(`INVALID bundle (${result.errors.length} problems):\n${result.errors.map((e) => `- ${e}`).join('\n')}`);
|
|
182
|
+
}
|
|
183
|
+
const total = result.files.reduce((sum, f) => sum + f.size, 0);
|
|
184
|
+
return text(`VALID bundle: "${result.manifest.title}" (slug: ${result.manifest.slug}, ${result.files.length} files, ${(total / 1024).toFixed(1)} KiB). Ready to publish.`);
|
|
185
|
+
});
|
|
186
|
+
server.registerTool('publish_world', {
|
|
187
|
+
description: 'Publish a validated world bundle to HELIX Instant. Uploads the files and activates the build; returns the public play URL. Requires login (check whoami first). Re-publishing the same slug creates the next build of that world.',
|
|
188
|
+
inputSchema: { directory: zod_1.z.string().describe('Absolute path to the built bundle directory (e.g. the dist/ folder)') },
|
|
189
|
+
}, async ({ directory }) => {
|
|
190
|
+
const creds = (0, helix_cli_1.loadCredentials)();
|
|
191
|
+
if (!creds)
|
|
192
|
+
return errText('Not logged in. Ask the human to run: helix login');
|
|
193
|
+
try {
|
|
194
|
+
const result = await (0, helix_cli_1.publishWorld)((0, node_path_1.resolve)(directory), creds);
|
|
195
|
+
return text([
|
|
196
|
+
`Published "${result.title}" build ${result.buildNumber}.`,
|
|
197
|
+
result.playUrl ? `Play URL: ${result.playUrl}` : 'Play URL: (pending CDN propagation)',
|
|
198
|
+
`World API: ${result.worldUrl}`,
|
|
199
|
+
].join('\n'));
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
return errText(err instanceof helix_cli_1.ApiError ? err.render() : `Publish failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
server.registerTool('list_my_worlds', {
|
|
206
|
+
description: 'List the worlds owned by the logged-in creator (including drafts), with their slugs and build state.',
|
|
207
|
+
inputSchema: {},
|
|
208
|
+
}, async () => {
|
|
209
|
+
const creds = (0, helix_cli_1.loadCredentials)();
|
|
210
|
+
if (!creds)
|
|
211
|
+
return errText('Not logged in. Ask the human to run: helix login');
|
|
212
|
+
try {
|
|
213
|
+
const worlds = await (0, helix_cli_1.listMyWorlds)(creds);
|
|
214
|
+
if (worlds.length === 0)
|
|
215
|
+
return text('No worlds yet.');
|
|
216
|
+
return text(worlds.map((w) => `- ${w.slug} ("${w.title}") — ${w.status}, hasActiveBuild: ${w.hasActiveBuild}`).join('\n'));
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
return errText(err instanceof helix_cli_1.ApiError ? err.render() : `Failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
server.registerTool('import_character', {
|
|
223
|
+
description: 'Convert an external biped character GLB (a Meshy AI export, or any Mixamo-named rig) into a helix-humanoid@1 character asset. ' +
|
|
224
|
+
'Conforms the mesh onto the canonical skeleton AT ITS OWN PROPORTIONS (the platform’s shared locomotion clips then drive it), generates the LOD chain ' +
|
|
225
|
+
'(micro-chart baked atlases are auto-rebaked: weld → re-unwrap → closest-point texture transfer), and KTX2-encodes the textures — all in-process, no native tools, ' +
|
|
226
|
+
'no extra files (the canonical helix-humanoid@1 skeleton is bundled; a world’s installed humanoid-character pack or `canonical` overrides it). ' +
|
|
227
|
+
'Outputs <output>/<name>.web.glb (multi-scene: scene i = LOD i; the head is sliced into a FaceMesh node per level so first-person mode can hide it, like the stock face part), plus <output>/anims/<clipName>.glb when `anim` is given. ' +
|
|
228
|
+
'Use when the human supplies a custom character model instead of the stock bodies. ' +
|
|
229
|
+
'Validated example — a Meshy AI character with its walk animation, everything else default: ' +
|
|
230
|
+
'{ "body": "C:/downloads/Meshy_AI_Warrior_biped_Character_output.glb", "anim": "C:/downloads/Meshy_AI_Warrior_biped_Animation_Walking_withSkin.glb", ' +
|
|
231
|
+
'"name": "warrior", "output": "./characters" } ' +
|
|
232
|
+
'→ characters/warrior.web.glb (~3MB, LOD tris ≈10000/5000/1500 at 1024/512/256px KTX2, UASTC up close + ETC1S far) + characters/anims/locomotion.warriorWalk.glb.',
|
|
233
|
+
inputSchema: {
|
|
234
|
+
body: zod_1.z.string().describe('Absolute path to the source biped character GLB (skinned body)'),
|
|
235
|
+
anim: zod_1.z.string().optional().describe('Optional animation GLB on the SAME source rig — retargeted onto the canonical skeleton'),
|
|
236
|
+
clipName: zod_1.z.string().optional().describe("Clip name for `anim` (default 'locomotion.warriorWalk')"),
|
|
237
|
+
canonical: zod_1.z.string().optional().describe('Canonical helix body GLB override; omit to use the world’s installed humanoid-character pack when present, else the bundled helix-humanoid@1 skeleton'),
|
|
238
|
+
worldDir: zod_1.z.string().optional().describe('World directory searched for the installed pack and used as the base for a relative `output` (default: cwd)'),
|
|
239
|
+
output: zod_1.z.string().optional().describe("Output directory (default './character-out')"),
|
|
240
|
+
name: zod_1.z.string().optional().describe('Output basename → <name>.web.glb (default: derived from the body file name)'),
|
|
241
|
+
texSize: zod_1.z.number().int().positive().optional().describe('Texture longest-edge cap, halved per LOD level (default 1024)'),
|
|
242
|
+
lodTris: zod_1.z.array(zod_1.z.number().int().positive()).optional().describe('Triangle target per LOD level, high→low (default [10000, 5000, 1500])'),
|
|
243
|
+
},
|
|
244
|
+
}, async ({ body, anim, clipName, canonical, worldDir, output, name, texSize, lodTris }) => {
|
|
245
|
+
const progress = [];
|
|
246
|
+
try {
|
|
247
|
+
const result = await (0, helix_cli_1.importCharacter)({
|
|
248
|
+
body: (0, node_path_1.resolve)(body),
|
|
249
|
+
...(anim !== undefined && { anim: (0, node_path_1.resolve)(anim) }),
|
|
250
|
+
...(clipName !== undefined && { clipName }),
|
|
251
|
+
...(canonical !== undefined && { canonical: (0, node_path_1.resolve)(canonical) }),
|
|
252
|
+
...(worldDir !== undefined && { cwd: (0, node_path_1.resolve)(worldDir) }),
|
|
253
|
+
...(output !== undefined && { output }),
|
|
254
|
+
...(name !== undefined && { name }),
|
|
255
|
+
...(texSize !== undefined && { texSize }),
|
|
256
|
+
...(lodTris !== undefined && { lodTris }),
|
|
257
|
+
onProgress: (message) => progress.push(message),
|
|
258
|
+
});
|
|
259
|
+
return text([
|
|
260
|
+
...progress,
|
|
261
|
+
'',
|
|
262
|
+
`Character ready: ${result.bodyPath}`,
|
|
263
|
+
`LOD tris: ${result.lodTris.join(' / ')} · textures: ${result.textureSizes.join('/')}px KTX2 (${result.ktx2.modes.join('/')})`,
|
|
264
|
+
result.clip ? `Clip: ${result.clip.name} (${result.clip.frames} frames, ${result.clip.duration}s) → ${result.clip.path}` : 'No clip retargeted (pass `anim` to bring one over).',
|
|
265
|
+
].join('\n'));
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
269
|
+
return errText([...progress, '', `import_character failed: ${detail}`].join('\n'));
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
// ---- Catalog discovery (read-only; publishing is admin-only) ----------------
|
|
273
|
+
const catalogApiUrl = () => (0, helix_cli_1.loadCredentials)()?.apiUrl ?? helix_cli_1.DEFAULT_API_URL;
|
|
274
|
+
const formatPackage = (p) => {
|
|
275
|
+
const sys = p.targetSystem ? ` [system: ${p.targetSystem.id}${p.targetSystem.range ? `@${p.targetSystem.range}` : ''}]` : '';
|
|
276
|
+
return `- ${p.slug}@${p.latestVersion ?? '?'} — ${p.title}${sys}`;
|
|
277
|
+
};
|
|
278
|
+
server.registerTool('list_systems', {
|
|
279
|
+
description: 'List the runtime systems published on HELIX Instant (e.g. humanoid-character). A system is a versioned framework that hosts abilities; a world pins one. Returns slug@version + title.',
|
|
280
|
+
inputSchema: {},
|
|
281
|
+
}, async () => {
|
|
282
|
+
try {
|
|
283
|
+
const res = await (0, helix_cli_1.listPackages)(catalogApiUrl(), 'system');
|
|
284
|
+
if (res.data.length === 0)
|
|
285
|
+
return text('No systems published yet.');
|
|
286
|
+
return text(`${res.data.map(formatPackage).join('\n')}\n\nTo build a world on one of these, call get_started({ kind: "character" }); list_abilities shows what plugs in.`);
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
return errText(err instanceof helix_cli_1.ApiError ? err.render() : `Failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
server.registerTool('list_abilities', {
|
|
293
|
+
description: 'List the abilities published on HELIX Instant (e.g. fly, swim). Abilities plug into a system; optionally filter by the host system id. Returns slug@version + title + target system.',
|
|
294
|
+
inputSchema: { system: zod_1.z.string().optional().describe('Only abilities targeting this system id (e.g. humanoid-character)') },
|
|
295
|
+
}, async ({ system }) => {
|
|
296
|
+
try {
|
|
297
|
+
const res = await (0, helix_cli_1.listPackages)(catalogApiUrl(), 'ability', system);
|
|
298
|
+
if (res.data.length === 0)
|
|
299
|
+
return text('No abilities published yet.');
|
|
300
|
+
return text(res.data.map(formatPackage).join('\n'));
|
|
301
|
+
}
|
|
302
|
+
catch (err) {
|
|
303
|
+
return errText(err instanceof helix_cli_1.ApiError ? err.render() : `Failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
server.registerTool('get_package_manifest', {
|
|
307
|
+
description: 'Fetch the full manifest for a published system/ability/asset-pack — the contract to read before pinning OR configuring it. For a SYSTEM, the payload carries `config` (the complete tunable surface) + `capabilities`. For an ABILITY, ability.json with its configSchema. Always includes the code + asset CDN base URLs. Defaults to the latest version. Read this instead of guessing config keys.',
|
|
308
|
+
inputSchema: {
|
|
309
|
+
slug: zod_1.z.string().describe('Package slug (e.g. fly, humanoid-character)'),
|
|
310
|
+
version: zod_1.z.string().optional().describe('Semver version; defaults to the latest published version'),
|
|
311
|
+
},
|
|
312
|
+
}, async ({ slug, version }) => {
|
|
313
|
+
try {
|
|
314
|
+
const manifest = await (0, helix_cli_1.getPackageManifest)(catalogApiUrl(), slug, version);
|
|
315
|
+
return text(`${JSON.stringify(manifest, null, 2)}\n\nTo use this: pin it in your world's helix.json (under "systems" or "abilities") and run \`helix install\`. Full recipe: get_started({ kind: "character" }).`);
|
|
316
|
+
}
|
|
317
|
+
catch (err) {
|
|
318
|
+
return errText(err instanceof helix_cli_1.ApiError ? err.render() : `Failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
server.registerTool('check_for_updates', {
|
|
322
|
+
description: `Check whether the HELIX @helix toolchain is current: compares the installed CLI / MCP / SDK / manifest against the latest published on npm and returns the exact update command for any that are behind. Pass the world/ability project dir to also check its pinned deps (e.g. ${SDK_PKG}).`,
|
|
323
|
+
inputSchema: {
|
|
324
|
+
projectDir: zod_1.z.string().optional().describe('Absolute path to a world/ability project, to also check its pinned @helix dependencies'),
|
|
325
|
+
},
|
|
326
|
+
}, async ({ projectDir }) => {
|
|
327
|
+
try {
|
|
328
|
+
const rows = await (0, helix_cli_1.checkForUpdates)({
|
|
329
|
+
projectDir: projectDir ? (0, node_path_1.resolve)(projectDir) : undefined,
|
|
330
|
+
installed: { '@hypersoniclabs/helix-mcp': VERSION },
|
|
331
|
+
});
|
|
332
|
+
const lines = rows.map((r) => {
|
|
333
|
+
const installed = r.installed ?? '—';
|
|
334
|
+
if (r.status === 'update-available')
|
|
335
|
+
return `⬆ ${r.name}: ${installed} → ${r.latest} — ${r.updateHint}`;
|
|
336
|
+
if (r.status === 'current')
|
|
337
|
+
return `✔ ${r.name}: ${installed} (current)`;
|
|
338
|
+
return `• ${r.name}: latest ${r.latest ?? '?'} (installed version not detected here) — ${r.updateHint}`;
|
|
339
|
+
});
|
|
340
|
+
const stale = rows.filter((r) => r.status === 'update-available').length;
|
|
341
|
+
const header = `HELIX toolchain — environment: ${helix_cli_1.HELIX_ENV} (${helix_cli_1.HELIX_SCOPE}) · API ${helix_cli_1.DEFAULT_API_URL} · website ${helix_cli_1.DEFAULT_WEB_URL}`;
|
|
342
|
+
return text([header, `${stale} update${stale === 1 ? '' : 's'} available:`, ...lines].join('\n'));
|
|
343
|
+
}
|
|
344
|
+
catch (err) {
|
|
345
|
+
return errText(`Update check failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
// ---- Boot -------------------------------------------------------------------
|
|
349
|
+
async function main() {
|
|
350
|
+
await server.connect(new stdio_js_1.StdioServerTransport());
|
|
351
|
+
}
|
|
352
|
+
void main();
|
|
353
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|