World Labs Fantastical Topology Visualization Skill
Version: 1.0.0
Feature: 122-worldlabs-topology-viz
Status: Active
Overview
Produces an AI-augmented, explorable 3D "world" visualization of a real network topology, built on
top of the existing spec 121 topology-diagram-mcp pipeline. World Labs' Marble API is a generative
world model — it does not accept structured/graph input and has no mechanism for precise node
placement, so this is explicitly a decorative, companion visualization, never a replacement for
the accurate topology diagram. The real, structurally-correct diagram (produced by the existing,
unmodified topology-diagram-mcp/render_structural tool) remains the authoritative artifact and is
always referenced alongside any result this skill produces.
Two distinct modes:
- Preview — free, instant, no World Labs call, repeatable with a different theme.
- Generate — spends real World Labs credits (~5 minutes per world), and only runs after an
explicit, separate user confirmation, enforced both conversationally and by the
worldlabs-marble-mcp tool itself (it will not proceed without user_confirmed=true).
Prerequisites
WLT_API_KEY in .env — your World Labs API key (platform.worldlabs.ai/api-keys), with a
funded account (platform.worldlabs.ai/billing). Required only for the generate mode — preview
needs no credential at all.
- The
worldlabs-marble-mcp server (mcp-servers/worldlabs-marble-mcp/), registered in
config/openclaw.json.
- The existing
topology-diagram-mcp server (spec 121), already registered — reused unmodified.
Topology sources
Any topology snapshot already normalized into the devices/links shape topology-diagram-mcp
accepts (CML, pyATS, or any of NetClaw's other topology-of-record integrations, or a freeform
description).
Workflow: Free Preview (User Story 1)
Zero cost, instant, repeatable with a different theme. No call to worldlabs-marble-mcp is ever
made in this workflow.
- Obtain the topology snapshot (devices/links) from whatever source the operator named (or a
freeform description), normalized into the shape
topology-diagram-mcp/render_structural
already accepts: devices: [{"hostname","role","state"}], links: [{"a","b","label"}].
- Call
topology-diagram-mcp/render_structural(snapshot_id, devices, links) — reused unmodified.
This tool has two existing failure modes that MUST both be surfaced clearly, distinctly, and
before anything else in this workflow runs (FR-012 and its Edge Cases correction):
- Empty topology (
devices is empty): the tool raises "devices list is empty — nothing to render". Report exactly that — this topology has nothing to preview. Do not attempt to
fabricate a prompt or a result.
- Too many devices (over the working-resolution density ceiling, 60 devices): the tool
raises a message naming the ceiling. Report that specific reason (e.g. "this topology has N
devices, exceeding the 60-device legibility ceiling — narrow the scope and try again"), not a
generic failure.
- A single device with zero links is NOT a failure —
render_structural already supports
it (a one-node layout), and this workflow proceeds normally.
- On success, build a
topology_model.TopologySnapshot from the same devices/links data (via
topology_model.Device/Link), and call
fantastical_prompt_builder.build_prompt(snapshot, theme=<operator-specified theme, or None for the default>).
- Present the result to the operator:
- The reference diagram (
render_structural's image_base64, or a note of where it's shown).
- The composed text prompt from step 3.
topology_model.DECORATIVE_LABEL, verbatim, every single time (FR-009) — this is a preview
of what could be generated, not a claim about what a generated world will precisely look
like (Marble is non-deterministic).
- An explicit statement that no credits were spent and no call was made to World Labs.
Workflow: Confirm and Generate (User Story 2)
This is the one part of this skill that spends real money. Only run this after Workflow: Free
Preview has already produced a reference diagram and prompt for the same topology snapshot.
- State plainly, as its own message, separate from anything else: "Generating this world will
spend World Labs credits and typically takes about 5 minutes. Proceed?" Do not combine this
with the preview step's output, and do not proceed without an explicit affirmative reply
(FR-004). This conversational check is the first of two independent layers — see step 2.
- Only once the operator has explicitly confirmed, call
worldlabs-marble-mcp/generate_world(text_prompt=<from the preview's composed prompt>, display_name=<derived from the snapshot's identity, max 64 chars>, user_confirmed=true).
Do NOT pass image_base64 (research.md R9/R10, corrected 2026-09-03 after live evidence
from six real production generations): attaching the reference diagram as an image gets pasted
flat and unchanged into the generated scene instead of being used as structural guidance, and
is also measurably less reliable (3 of 4 image-bearing attempts failed; 4 of 4 text-only
attempts succeeded on the first try). fantastical_prompt_builder.build_prompt already
describes every real device and every real link individually in the text — that is the thing
that actually carries real data into the result, not the image. The user_confirmed=true
argument is the second, code-level layer (FR-016) — generate_world itself refuses to make any
outbound call without it, so this is not optional plumbing to skip.
- Immediately after that call returns (success, failure, or a
confirmation_required rejection —
which should never happen if step 1 was actually followed, but is handled the same way if it
does), record a GAIT entry via gait_record_turn (Constitution Principle IV, FR-015): user_text
names the topology snapshot's identity/theme and that the operator confirmed; assistant_text
names the operation_id and, once known, the world_id/world_marble_url/cost.total_credits
or the failure category; artifacts is empty or references the reference diagram's identity
only — never the API key, never raw device data beyond hostname/role identity. This step is
required for every confirmed attempt, not optional, and is distinct from any end-of-session GAIT
summary.
- Report the result:
- Success: the
operation_id (tell the operator to note it — nothing server-side tracks
it, Clarifications Q1), and that status can be checked later.
confirmation_required: this means step 1/2 were skipped — report it and restart from
step 1, do not retry the call with the flag silently added.
authentication_failure: tell the operator to check WLT_API_KEY — never repeat the key
value itself.
insufficient_credits: pass through World Labs' own message (it already names the fix —
add credits or enable auto-refill).
rate_limited: tell the operator to wait and retry later — do not resubmit automatically.
generic_failure: pass through the provider's message.
- To check status later, call
worldlabs-marble-mcp/check_generation_status(operation_id).
done: false — still in progress; report that plainly.
done: true with a response — completed. Report world_marble_url (the viewer link),
assets, and cost.total_credits, plus topology_model.DECORATIVE_LABEL verbatim, every
time (FR-009) — a completed generation is exactly the case someone could mistake for an
accurate diagram, so this label matters most here.
done: true with an error — the generation itself failed after starting; report the error
plainly, and do not retry automatically.
not_found_or_expired — the operation record itself expired (they carry a roughly one-hour
expires_at). If an earlier poll's metadata included a world_id, fall back to
worldlabs-marble-mcp/get_world(world_id) instead of reporting a hard failure — the world
itself is not necessarily gone just because the operation record is. Include
DECORATIVE_LABEL here too if get_world succeeds.
Workflow: Direct Prompt Generation (bring your own prompt)
For when the operator has already written a complete, ready-to-use prompt themselves (e.g.
iterating creatively on wording) and wants it sent straight to Marble — no topology fetch, no
render_structural call, no fantastical_prompt_builder, no other skill or data source
involved at all. The operator's own words are the entire text_prompt, verbatim.
- Confirm credits/time exactly as in step 1 of Confirm and Generate above — this requirement
does not change just because the prompt is hand-written.
- Call
worldlabs-marble-mcp/generate_world(text_prompt=<the operator's prompt, verbatim>, display_name=<a short label the operator gives, or a reasonable default>, user_confirmed=true)
— no image_base64, same reasoning as above.
- Record the GAIT entry and report the result exactly as steps 3-5 of Confirm and Generate above
— those steps do not depend on where the prompt came from.
DECORATIVE_LABEL still applies:
a hand-written prompt with no topology data behind it at all is not a diagram substitute either.
Natural Language Commands
Free preview (no cost)
"Give me a fantastical world preview of the CML lab topology, floating-islands theme"
"Preview what this topology would look like as an underwater city, using the current pyATS testbed"
"Show me a fantastical preview of this topology: a router r1 connected to a switch sw1"
Generate (spends credits — requires confirmation)
"Yes, generate it"
"Go ahead and generate that world"
Direct prompt (bring your own prompt, spends credits — requires confirmation)
"<a full hand-written scene description>" send this straight to Marble and send me the link
"<a full hand-written scene description>" generate that, no need to pull any topology for this one
Check status
"Is the world done yet?"
"Check the status of that generation"
How this differs from every other topology visualization
Unlike threejs-network-viz, blender-3d-viz, ue5-network-viz (precise, data-driven 3D scenes)
and comfyui-topology-viz (a stylized flat still image), this skill's output is a generative,
non-deterministic 3D world whose geometry is not driven by the topology's actual structure — only
its theme is. It is closer in spirit to concept art than to a diagram. Every result this skill
produces says so explicitly and points back to the accurate diagram it was generated from (FR-009).
1---
2name: worldlabs-topology-viz
3description: "Turn a real network topology into a free, no-cost themed prompt preview, and optionally (after explicit confirmation) generate an explorable, AI-generated 3D 'world' via World Labs Marble — a decorative companion visualization, never a substitute for the accurate topology diagram it is derived from. Use when the operator asks for a fantastical, explorable, or AI-generated 3D world/scene of a network topology."
4license: Apache-2.0
5user-invocable: true
6metadata:
7 openclaw:
8 requires:
9 env: ["WLT_API_KEY"]
10---
11
12# World Labs Fantastical Topology Visualization Skill
13
14**Version**: 1.0.0
15**Feature**: 122-worldlabs-topology-viz
16**Status**: Active
17
18## Overview
19
20Produces an AI-augmented, explorable 3D "world" visualization of a real network topology, built on
21top of the existing spec 121 `topology-diagram-mcp` pipeline. World Labs' Marble API is a generative
22world model — it does not accept structured/graph input and has no mechanism for precise node
23placement, so this is explicitly a **decorative, companion visualization**, never a replacement for
24the accurate topology diagram. The real, structurally-correct diagram (produced by the existing,
25unmodified `topology-diagram-mcp/render_structural` tool) remains the authoritative artifact and is
26always referenced alongside any result this skill produces.
27
28Two distinct modes:
29
301. **Preview** — free, instant, no World Labs call, repeatable with a different theme.
312. **Generate** — spends real World Labs credits (~5 minutes per world), and only runs after an
32 explicit, separate user confirmation, enforced both conversationally and by the
33 `worldlabs-marble-mcp` tool itself (it will not proceed without `user_confirmed=true`).
34
35## Prerequisites
36
37- **`WLT_API_KEY`** in `.env` — your World Labs API key (`platform.worldlabs.ai/api-keys`), with a
38 funded account (`platform.worldlabs.ai/billing`). Required only for the generate mode — preview
39 needs no credential at all.
40- The `worldlabs-marble-mcp` server (`mcp-servers/worldlabs-marble-mcp/`), registered in
41 `config/openclaw.json`.
42- The existing `topology-diagram-mcp` server (spec 121), already registered — reused unmodified.
43
44### Topology sources
45
46Any topology snapshot already normalized into the devices/links shape `topology-diagram-mcp`
47accepts (CML, pyATS, or any of NetClaw's other topology-of-record integrations, or a freeform
48description).
49
50## Workflow: Free Preview (User Story 1)
51
52Zero cost, instant, repeatable with a different theme. **No call to `worldlabs-marble-mcp` is ever
53made in this workflow.**
54
551. Obtain the topology snapshot (devices/links) from whatever source the operator named (or a
56 freeform description), normalized into the shape `topology-diagram-mcp/render_structural`
57 already accepts: `devices: [{"hostname","role","state"}]`, `links: [{"a","b","label"}]`.
582. Call `topology-diagram-mcp/render_structural(snapshot_id, devices, links)` — reused unmodified.
59 This tool has two existing failure modes that MUST both be surfaced clearly, distinctly, and
60 *before* anything else in this workflow runs (FR-012 and its Edge Cases correction):
61 - **Empty topology** (`devices` is empty): the tool raises `"devices list is empty — nothing to
62 render"`. Report exactly that — this topology has nothing to preview. Do not attempt to
63 fabricate a prompt or a result.
64 - **Too many devices** (over the working-resolution density ceiling, 60 devices): the tool
65 raises a message naming the ceiling. Report that specific reason (e.g. "this topology has N
66 devices, exceeding the 60-device legibility ceiling — narrow the scope and try again"), not a
67 generic failure.
68 - A **single device with zero links** is NOT a failure — `render_structural` already supports
69 it (a one-node layout), and this workflow proceeds normally.
703. On success, build a `topology_model.TopologySnapshot` from the same `devices`/`links` data (via
71 `topology_model.Device`/`Link`), and call
72 `fantastical_prompt_builder.build_prompt(snapshot, theme=<operator-specified theme, or None for
73 the default>)`.
744. Present the result to the operator:
75 - The reference diagram (`render_structural`'s `image_base64`, or a note of where it's shown).
76 - The composed text prompt from step 3.
77 - `topology_model.DECORATIVE_LABEL`, verbatim, every single time (FR-009) — this is a preview
78 of what *could* be generated, not a claim about what a generated world will precisely look
79 like (Marble is non-deterministic).
80 - An explicit statement that no credits were spent and no call was made to World Labs.
81
82## Workflow: Confirm and Generate (User Story 2)
83
84**This is the one part of this skill that spends real money.** Only run this after Workflow: Free
85Preview has already produced a reference diagram and prompt for the same topology snapshot.
86
871. State plainly, as its own message, separate from anything else: *"Generating this world will
88 spend World Labs credits and typically takes about 5 minutes. Proceed?"* Do not combine this
89 with the preview step's output, and do not proceed without an explicit affirmative reply
90 (FR-004). This conversational check is the first of two independent layers — see step 2.
912. Only once the operator has explicitly confirmed, call
92 `worldlabs-marble-mcp/generate_world(text_prompt=<from the preview's composed prompt>,
93 display_name=<derived from the snapshot's identity, max 64 chars>, user_confirmed=true)`.
94 **Do NOT pass `image_base64`** (research.md R9/R10, corrected 2026-09-03 after live evidence
95 from six real production generations): attaching the reference diagram as an image gets pasted
96 flat and unchanged into the generated scene instead of being used as structural guidance, and
97 is also measurably less reliable (3 of 4 image-bearing attempts failed; 4 of 4 text-only
98 attempts succeeded on the first try). `fantastical_prompt_builder.build_prompt` already
99 describes every real device and every real link individually in the text — that is the thing
100 that actually carries real data into the result, not the image. The `user_confirmed=true`
101 argument is the second, code-level layer (FR-016) — `generate_world` itself refuses to make any
102 outbound call without it, so this is not optional plumbing to skip.
1033. Immediately after that call returns (success, failure, or a `confirmation_required` rejection —
104 which should never happen if step 1 was actually followed, but is handled the same way if it
105 does), record a GAIT entry via `gait_record_turn` (Constitution Principle IV, FR-015): `user_text`
106 names the topology snapshot's identity/theme and that the operator confirmed; `assistant_text`
107 names the `operation_id` and, once known, the `world_id`/`world_marble_url`/`cost.total_credits`
108 or the failure category; `artifacts` is empty or references the reference diagram's identity
109 only — never the API key, never raw device data beyond hostname/role identity. This step is
110 required for every confirmed attempt, not optional, and is distinct from any end-of-session GAIT
111 summary.
1124. Report the result:
113 - **Success**: the `operation_id` (tell the operator to note it — nothing server-side tracks
114 it, Clarifications Q1), and that status can be checked later.
115 - **`confirmation_required`**: this means step 1/2 were skipped — report it and restart from
116 step 1, do not retry the call with the flag silently added.
117 - **`authentication_failure`**: tell the operator to check `WLT_API_KEY` — never repeat the key
118 value itself.
119 - **`insufficient_credits`**: pass through World Labs' own message (it already names the fix —
120 add credits or enable auto-refill).
121 - **`rate_limited`**: tell the operator to wait and retry later — do not resubmit automatically.
122 - **`generic_failure`**: pass through the provider's message.
1235. To check status later, call `worldlabs-marble-mcp/check_generation_status(operation_id)`.
124 - `done: false` — still in progress; report that plainly.
125 - `done: true` with a `response` — completed. Report `world_marble_url` (the viewer link),
126 `assets`, and `cost.total_credits`, **plus `topology_model.DECORATIVE_LABEL` verbatim, every
127 time** (FR-009) — a completed generation is exactly the case someone could mistake for an
128 accurate diagram, so this label matters most here.
129 - `done: true` with an `error` — the generation itself failed after starting; report the error
130 plainly, and do not retry automatically.
131 - `not_found_or_expired` — the operation record itself expired (they carry a roughly one-hour
132 `expires_at`). If an earlier poll's `metadata` included a `world_id`, fall back to
133 `worldlabs-marble-mcp/get_world(world_id)` instead of reporting a hard failure — the world
134 itself is not necessarily gone just because the operation record is. Include
135 `DECORATIVE_LABEL` here too if `get_world` succeeds.
136
137## Workflow: Direct Prompt Generation (bring your own prompt)
138
139For when the operator has already written a complete, ready-to-use prompt themselves (e.g.
140iterating creatively on wording) and wants it sent straight to Marble — **no topology fetch, no
141`render_structural` call, no `fantastical_prompt_builder`, no other skill or data source
142involved at all.** The operator's own words are the entire `text_prompt`, verbatim.
143
1441. Confirm credits/time exactly as in step 1 of Confirm and Generate above — this requirement
145 does not change just because the prompt is hand-written.
1462. Call `worldlabs-marble-mcp/generate_world(text_prompt=<the operator's prompt, verbatim>,
147 display_name=<a short label the operator gives, or a reasonable default>, user_confirmed=true)`
148 — no `image_base64`, same reasoning as above.
1493. Record the GAIT entry and report the result exactly as steps 3-5 of Confirm and Generate above
150 — those steps do not depend on where the prompt came from. `DECORATIVE_LABEL` still applies:
151 a hand-written prompt with no topology data behind it at all is not a diagram substitute either.
152
153## Natural Language Commands
154
155### Free preview (no cost)
156
157```
158"Give me a fantastical world preview of the CML lab topology, floating-islands theme"
159"Preview what this topology would look like as an underwater city, using the current pyATS testbed"
160"Show me a fantastical preview of this topology: a router r1 connected to a switch sw1"
161```
162
163### Generate (spends credits — requires confirmation)
164
165```
166"Yes, generate it"
167"Go ahead and generate that world"
168```
169
170### Direct prompt (bring your own prompt, spends credits — requires confirmation)
171
172```
173"<a full hand-written scene description>" send this straight to Marble and send me the link
174"<a full hand-written scene description>" generate that, no need to pull any topology for this one
175```
176
177### Check status
178
179```
180"Is the world done yet?"
181"Check the status of that generation"
182```
183
184## How this differs from every other topology visualization
185
186Unlike `threejs-network-viz`, `blender-3d-viz`, `ue5-network-viz` (precise, data-driven 3D scenes)
187and `comfyui-topology-viz` (a stylized flat still image), this skill's output is a generative,
188non-deterministic 3D *world* whose geometry is not driven by the topology's actual structure — only
189its *theme* is. It is closer in spirit to concept art than to a diagram. Every result this skill
190produces says so explicitly and points back to the accurate diagram it was generated from (FR-009).