@gripforgeai/mcp 0.1.22 → 0.1.24
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.
|
@@ -55,7 +55,7 @@ export function registerArchitectureTools(register, options, schema = z) {
|
|
|
55
55
|
palette: schema.object({ stone: schema.string().regex(/^#[0-9a-f]{6}$/i).optional(), recess: schema.string().regex(/^#[0-9a-f]{6}$/i).optional(), trim: schema.string().regex(/^#[0-9a-f]{6}$/i).optional(), water: schema.string().regex(/^#[0-9a-f]{6}$/i).optional() }).strict().optional(),
|
|
56
56
|
}).strict();
|
|
57
57
|
const definitions = [
|
|
58
|
-
{ name: ARCHITECTURE_TOOL_NAMES[4], kind: 'urban', title: 'Manufacture a reusable urban building', description: 'Free, deterministic parametric architecture. plan validates a metric recipe; build queues a durable common-compute job and returns job_id to poll with gripforge_generation_read. Real window reveals, balconies, shopfronts, rooftop HVAC, photographic PBR and optional arid shutters/canopies/water tanks. Private immutable GLB plus recipe/report; reuse via Library bindings or scene instances. Nominal width/depth exclude protrusions: use returned actual bounds and preserve proportions. A solid envelope with storefront depth, not traversable interiors, a complete city or an AI replacement for gripforge_generate_building. Review in the actual game. 0 credits.', shape: { stage: schema.enum(['plan', 'build']).optional(), workspace_id: schema.string().max(100).optional(), idempotency_key: shared.idempotency_key, recipe: schema.object({ name: schema.string().min(1).max(100), style: schema.enum(['brick', 'balconies', 'limestone', 'loft', 'workshop', 'office', 'stucco']), width: schema.number().min(6).max(30).optional(), depth: schema.number().min(6).max(30).optional(), floors: schema.number().int().min(1).max(20).optional(), seed: schema.number().int().min(0).max(2147483646).optional(), shop: schema.number().int().min(0).max(7).optional(), climate: schema.enum(['temperate', 'arid']).optional(), palette: schema.object({ facade: schema.string().regex(/^#[a-fA-F0-9]{6}$/).optional(), stone: schema.string().regex(/^#[a-fA-F0-9]{6}$/).optional(), trim: schema.string().regex(/^#[a-fA-F0-9]{6}$/).optional(), roof: schema.string().regex(/^#[a-fA-F0-9]{6}$/).optional() }).strict().optional() }).strict() } },
|
|
58
|
+
{ name: ARCHITECTURE_TOOL_NAMES[4], kind: 'urban', title: 'Manufacture a reusable urban building', description: 'Free, deterministic parametric architecture. plan validates a metric recipe; build queues a durable common-compute job and returns job_id to poll with gripforge_generation_read. Real window reveals, balconies, shopfronts, rooftop HVAC, photographic PBR and optional arid shutters/canopies/water tanks. Private immutable GLB plus recipe/report; reuse via Library bindings or scene instances. Nominal width/depth exclude protrusions: use returned actual bounds and preserve proportions. A solid envelope with storefront depth, not traversable interiors, a complete city or an AI replacement for gripforge_generate_building. Review in the actual game. 0 credits.', shape: { stage: schema.enum(['plan', 'build']).optional(), workspace_id: schema.string().max(100).optional(), idempotency_key: shared.idempotency_key, recipe: schema.object({ name: schema.string().min(1).max(100), style: schema.enum(['brick', 'balconies', 'limestone', 'loft', 'workshop', 'office', 'stucco']), width: schema.number().min(6).max(30).optional(), depth: schema.number().min(6).max(30).optional(), floors: schema.number().int().min(1).max(20).optional(), seed: schema.number().int().min(0).max(2147483646).optional(), shop: schema.number().int().min(0).max(7).optional(), climate: schema.enum(['temperate', 'arid']).optional(), detail: schema.enum(['standard', 'street']).optional().describe('street: bevelled architectural trims, dielectric window glazing, deep room pockets and separate surface families.'), palette: schema.object({ facade: schema.string().regex(/^#[a-fA-F0-9]{6}$/).optional(), stone: schema.string().regex(/^#[a-fA-F0-9]{6}$/).optional(), trim: schema.string().regex(/^#[a-fA-F0-9]{6}$/).optional(), roof: schema.string().regex(/^#[a-fA-F0-9]{6}$/).optional() }).strict().optional() }).strict() } },
|
|
59
59
|
{ name: ARCHITECTURE_TOOL_NAMES[0], kind: 'schema', shape: {}, title: 'Architecture · schema', description: 'Read the reusable Meshy/Tripo building and district contract, example, limits and plan → build workflow. Separate immutable Library assets, scene instances and shared SceneDocument. No paid generation.' },
|
|
60
60
|
{ name: ARCHITECTURE_TOOL_NAMES[1], kind: 'building', shape: { ...shared, recipe: building,
|
|
61
61
|
stage: schema.enum(['plan', 'concept', 'build']).optional().describe('plan is free: exact prompts and separate image/3D quotes. concept creates reviewable workspace images. First review artistic scene, then isolated views of the SAME building, then build 3D from chosen isolated references.'),
|
|
@@ -9,11 +9,11 @@ export function registerGameCreationTools(register, options, schema = z) {
|
|
|
9
9
|
mode: schema.enum(['select', 'generate', 'default']).optional(), asset_id: schema.string().max(100).optional(),
|
|
10
10
|
operation: schema.enum(['plan', 'refine', 'concept', 'generate', 'build', 'develop']).optional(), quote_token: schema.string().max(100).optional(),
|
|
11
11
|
message: schema.string().trim().min(3).max(1500).optional(), allow_incomplete: schema.boolean().optional(),
|
|
12
|
-
source: schema.enum(['all', 'workspace', 'community']).optional(), q: schema.string().max(100).optional(),
|
|
12
|
+
other_styles: schema.boolean().optional(), source: schema.enum(['all', 'workspace', 'community']).optional(), q: schema.string().max(100).optional(),
|
|
13
13
|
};
|
|
14
14
|
register(GAME_CREATION_TOOL_NAMES[0], {
|
|
15
15
|
title: 'Prepare and resume a game',
|
|
16
|
-
description: 'The website and CLI share this saved 3D game creation workflow. Ask which engine (Unity, Godot, Unreal, Three.js) if unspecified; do not choose silently. create saves a brief without spending. quote(operation=plan) estimates AI preparation, accept(quote_token) starts its durable job ONLY after user approval of the shown price. get returns a persistent operation log, slots, studio_url and the same project to resume. Planning can select an appropriate preset OR compose real engine-compatible modules. A missing preset never means the genre needs a native engine. composition.modules pins all module versions; composition.tasks lists the custom logic still to implement. Assembly is a foundation, not a completed custom game: For an assembled web project, quote operation=develop with an optional message, review its bounded price and accept to implement content/configuration using shared MCP kits, playtest and repair in a durable worker. Continue the same conversation and project. The development result distinguishes agent-declared changes, actual checks, remaining work and unsupported runtime capabilities. Each additional pass needs its own estimate; no paid asset generation is included. Native/custom-code development still uses the CLI. After a build, get also returns creatures (the models bound so that no unit is a capsule) and audit { verdict: complete | playable_with_defects | incomplete, headline, fixed (the free fixes applied: models, standard clips, control scheme), defects [{ severity, message, fix { tool, args, credits? } }], next }: show the user the verdict and what is left, work through next (gripforge_game_audit reads it again), and never present a verdict other than complete as a finished game. quote refine with message updates the same plan after approval, preserves selected assets and reviewed work, and persists the conversation. use_reference with slot_id and an owned image asset_id supplies an uploaded concept for visual review. assets searches
|
|
16
|
+
description: 'The website and CLI share this saved 3D game creation workflow. Ask which engine (Unity, Godot, Unreal, Three.js) if unspecified; do not choose silently. create saves a brief without spending. quote(operation=plan) estimates AI preparation, accept(quote_token) starts its durable job ONLY after user approval of the shown price. get returns a persistent operation log, slots, studio_url and the same project to resume. Planning can select an appropriate preset OR compose real engine-compatible modules. A missing preset never means the genre needs a native engine. composition.modules pins all module versions; composition.tasks lists the custom logic still to implement. Assembly is a foundation, not a completed custom game: For an assembled web project, quote operation=develop with an optional message, review its bounded price and accept to implement content/configuration using shared MCP kits, playtest and repair in a durable worker. Continue the same conversation and project. The development result distinguishes agent-declared changes, actual checks, remaining work and unsupported runtime capabilities. Each additional pass needs its own estimate; no paid asset generation is included. Native/custom-code development still uses the CLI. After a build, get also returns creatures (the models bound so that no unit is a capsule) and audit { verdict: complete | playable_with_defects | incomplete, headline, fixed (the free fixes applied: models, standard clips, control scheme), defects [{ severity, message, fix { tool, args, credits? } }], next }: show the user the verdict and what is left, work through next (gripforge_game_audit reads it again), and never present a verdict other than complete as a finished game. quote refine with message updates the same plan after approval, preserves selected assets and reviewed work, and persists the conversation. use_reference with slot_id and an owned image asset_id supplies an uploaded concept for visual review. assets searches workspace/community items by actual role before invented generation details. Generic nature packs may cross world themes while keeping the rendering look. New plans consider available styles before inventing one; selection_reason explains planner choices. other_styles=true reveals alternatives with explicit mismatch/unknown compatibility for manual review; never bind a known look mismatch automatically. Prefer reuse before generation; select chooses one or sets mode=generate with a prompt. For generation: quote concept, obtain approval, accept, poll get, show the concept, approve_concept only after visual user review; quote generate, obtain approval, accept, poll and show the model in its studio. A quote with auto_select_character=true selects the missing main character by default when ready; it remains inspectable and replaceable. Other models, replacement generations and older approved jobs remain drafts: approve_asset only after visual review. Never infer visual approval from technical success. quote build then accept acquires the selected community assets and binds them to a Game Kit prototype, without generating extra assets. The main playable character is presented first. If no usable matching rigged/animated model is found, prepare its generation. A missing main character blocks assembly until an existing or generated model is selected. With explicit allow_incomplete=true on the build quote, missing secondary slots may use module defaults where available or remain empty, but a generated model awaiting review blocks assembly until explicitly approved or another asset is selected. Show missing_assets before approval; never imply that an incomplete prototype is finished. Native engine projects still need CLI delivery/import; a web project has a play_url. Revision required for edits. Cancel/retry preserve completed steps. 2D unsupported. No automatic spending, invented asset IDs, or unrelated template substitutions.',
|
|
17
17
|
inputSchema: shape, annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
18
18
|
}, async (args, extra) => {
|
|
19
19
|
const parsed = schema.object(shape).strict().safeParse(args);
|
package/dist/gamekit-tools.js
CHANGED
|
@@ -131,6 +131,19 @@ export function registerGameKitTools(register, options, schema = z) {
|
|
|
131
131
|
delete out[k];
|
|
132
132
|
return out;
|
|
133
133
|
};
|
|
134
|
+
tool('gripforge_runtime_sessions', 'Rust runtime sessions', 'List live Rust/Bevy previews for an authorized Game Kit project. Open the project Rust player in GripForge first. No server-side solo simulation.', { project_id: projectId }, { readOnly: true }, async (args, extra) => api(`gamekit-projects/${encodeURIComponent(String(args.project_id))}/runtime`, args, 'GET', extra?.signal));
|
|
135
|
+
tool('gripforge_runtime_command', 'Command Rust preview', 'Queue a versioned GripForge runtime command for the exact browser session. Use inspect, apply_patch, set_relief (off/pom/spom on configured relief surfaces), step (paused only), run_test, play, pause, reset, load_game, unload_game or get_stats. Returns received; fetch the applied receipt with gripforge_runtime_receipt. Preview changes do not persist the project. Unknown kits/components and invalid fields are refused by the Rust core.', { project_id: projectId, command: schema.record(schema.string(), schema.unknown()) }, { readOnly: false }, async (args, extra) => api(`gamekit-projects/${encodeURIComponent(String(args.project_id))}/runtime`, { ...args, action: 'command' }, 'POST', extra?.signal));
|
|
136
|
+
tool('gripforge_runtime_receipt', 'Read Rust command receipt', 'Read received/applied/rejected status for a Rust preview request, including simulation boundary and revisions.', { project_id: projectId, session_id: schema.string().max(96), request_id: schema.string().max(96) }, { readOnly: true }, async (args, extra) => api(`gamekit-projects/${encodeURIComponent(String(args.project_id))}/runtime`, args, 'GET', extra?.signal, { session_id: String(args.session_id), request_id: String(args.request_id) }));
|
|
137
|
+
// The same authenticated mailbox and preview-session capability as gameplay.
|
|
138
|
+
// Do not overload gripforge_apply_realism: that tool edits saved scene data.
|
|
139
|
+
for (const operation of ['get_render_capabilities', 'configure_render_preview', 'render_preview', 'cancel_render_preview']) {
|
|
140
|
+
tool(`gripforge_${operation}`, `Bevy neural preview: ${operation}`, 'Local optional Bevy neural snapshot, not a saved scene edit. Requires an open authorized browser runtime session. Configure off/preview; realtime_experimental is refused. Trained weights and a local rights manifest must be selected in the browser; none are downloaded. render_preview starts an asynchronous request: read the command receipt, then query get_render_capabilities for actual completion, model, effective resolution, provenance, timings and limitations. Cancellation prevents stale publication. No images are uploaded.', { project_id: projectId, session_id: schema.string().max(96), request_id: schema.string().regex(/^[-\w.]{1,96}$/), expected_revision: schema.number().int().nonnegative(),
|
|
141
|
+
...(operation === 'configure_render_preview' ? { mode: schema.enum(['off', 'preview']) } : {}) }, { readOnly: operation === 'get_render_capabilities' }, async (args, extra) => api(`gamekit-projects/${encodeURIComponent(String(args.project_id))}/runtime`, {
|
|
142
|
+
...args, action: 'command', command: { protocol_version: 1, request_id: args.request_id, session_id: args.session_id,
|
|
143
|
+
project_id: args.project_id, expected_revision: args.expected_revision, scope: 'preview', operation,
|
|
144
|
+
payload: operation === 'configure_render_preview' ? { mode: args.mode } : {} },
|
|
145
|
+
}, 'POST', extra?.signal));
|
|
146
|
+
}
|
|
134
147
|
tool('gripforge_game_web_export', 'Prepare a standalone local web game', 'Prepare a download manifest for an existing web Game Kit project in the current workspace. Reuses the same player and HUD as hosted play, compiles only installed enabled kit runtimes, and lists the game configuration, static resources and Library assets to download. Does not publish the project or change its visibility. The hosted MCP cannot write local files: use gripforge game-export <project_id> <folder> locally, then npm run dev. The CLI verifies downloads and preserves local edits on updates (--check previews conflicts; --force backs up and replaces edits only when authorized). The delivered versions remain fixed until an explicit export update. Legacy kits and unpublished source overlays cannot be exported. net.* kits still need their online services. 0 credits.', { project_id: projectId }, { readOnly: false }, (args, extra) => api(`gamekit-projects/${enc(args.project_id)}/export/web`, body(args), 'POST', extra?.signal));
|
|
135
148
|
tool('gripforge_gamekit_search', 'Search the Game Kit catalogue', 'Start here. Search the modular Game Kit catalogue (vehicle.driveable, mission.objectives, npc.wanted, …) by free text, capability, tag or engine target. Pass project_id to score kits against that project: each hit then carries state { installed, enabled, fills, reason } and kits that fill one of its missing capabilities rank first. Kits are bricks that go together: a kit handling the same thing as an installed one is a same-scene overlap (only one active in a scene), never a reason to skip it. Returns { kits, presets }; each kit carries its presentation: name, tagline (one-line hook), tags, targets and status per engine (web / godot / unity / unreal), and cover / coverUrl, the featured landscape image (WebP) to show the user when proposing kits. legacy.* kits play through their existing client. Kart Racing is native: compose world.racetrack + vehicle.driveable + race.kart; edit race_tracks through project data. world.lighting adds shared sun/fill, point lights and spots, presets, bounded light budgets and bloom; edit world_lights through project data. world.fluids adds interactive mud / blood surfaces, displaced 3D wheel ruts and footprints; edit fluid_surfaces through project data (web renderer). world.terrain adds a seeded large landscape (terrain_edits data), movement.traversal climbing / swimming / gliding with stamina, world.elements data-driven fire, water, ice, electricity and poison (element_rules, element_materials, element_climates data). Also returns packs: content packs (ready-made game content — documents and kit configs, e.g. a realistic atmosphere, a tree of life, a star system) that gripforge_gamekit_install { pack } installs into a project. Call this BEFORE gripforge_gamekit_install. 0 credits.', {
|
|
136
149
|
q: schema.string().max(200).optional().describe('Free text matched on id, name, description and tags (e.g. "drive a car", "wanted level").'),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gripforgeai/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.24",
|
|
4
4
|
"description": "The tools your AI needs to make your games. Turn prompts into production-ready game assets \u2014 animated characters with their weapons attached, seamless textures, terrain, VFX, HUDs \u2014 and playable game kits Unity, Godot, Unreal or Three.js can load.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|