← WebMCP Directory

theater.needle.tools

theater.needle.tools

live Unverified (seed import) Media & Personal 31 tools imperative implementation

A paper theatre driven by the AI agent in your browser: it decides the story with you, stages ready-cut props on three depth planes, directs camera and music — and you can rearrange the set while it…

First seen 2026-11-05 · Last seen 2026-11-05 · Source: webmcp.com

Answer 0 · Act 31 · Transact 0 · Score: Not yet scored

Tool inspector

stage_script

act imperative

Play a scene: who does what, and what they say, in order. Hand over the WHOLE scene in one call — you cannot animate by calling a tool per frame, and you do not need to. The page plays it and this returns at once with the timings, so in voice mode you can narrate over the top. One thing happens at a time: a beat starts when the last one ends, and there is no timing to work out. The scene KEEPS its script, so show_play can run it again as part of the whole show — pass rehearse:false to write it without playing it now. Use narration on beats for short storyteller passages. They are saved and timed with the play; the theatre does not speak them yet, so narrate them live when connected. Moves: walk, jump, shake, surprised, scared, nod, bow, turn, enter, exit. "walk" and "jump" leave the layer where they end: give them "at" to say WHERE on the canvas to end up (the coordinates piece_list and stage_describe report), or "by" to say HOW FAR to travel. "at" is almost always the one you want. There is no "to" — it meant a distance, read like a destination, and walked characters clean off the paper. Everything else finishes exactly where it started. A beat's "take" picks another cast member up — it rides along through every later move until a "drop" lets it fall. "with": true makes a beat run AT THE SAME TIME as the one before it, so two characters can move or speak together. "walk" and "jump" travel to any canvas point — a hero can cross the whole world, scene to scene, if the story sends them. An "effect" throws paper over a beat: sparkles, poof, confetti, hearts, rain, anger, smoke, explosion.

Page: /

Input schema

PropertyTypeRequiredDescription
stage string no Which scene. Omit for the one being shown.
rehearse boolean no Play it now as well as saving it. Default true.
beats array yes What happens, in order.
Raw JSON schema
{
  "type": "object",
  "properties": {
    "stage": {
      "type": "string",
      "description": "Which scene. Omit for the one being shown."
    },
    "rehearse": {
      "type": "boolean",
      "description": "Play it now as well as saving it. Default true."
    },
    "beats": {
      "type": "array",
      "description": "What happens, in order.",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Who this beat is about."
          },
          "do": {
            "type": "string",
            "description": "What they do: walk, jump, shake, surprised, scared, nod, bow, turn, enter, exit — or a hand-recorded move as \"clip:<name>\". A clip marked \"(travels)\" was recorded as a journey: it really moves them across the paper and leaves them there, no \"to\" needed. The rest gesture in place. Recorded so far: clip:left-right-anxious (travels), clip:crazy (travels), clip:say-hello-3 (travels), clip:say-hello-2 (travels), clip:say-hello (travels), clip:swing-from-left-right-an (travels), clip:running-in-a-circle (travels), clip:shake-up-down (travels), clip:shake-left-right (travels), clip:talk-3 (travels), clip:talk-2 (travels), clip:run-down (travels), clip:run-right (travels), clip:run-left (travels), clip:run-up (travels), clip:sad-no, clip:agree-yes, clip:shake-head, clip:talk, clip:swing-fly-softly, clip:shake-long, clip:surprise-up, clip:shake, clip:crawl-downwards, clip:swirl, clip:agent-flying-soft, clip:agent-flying, clip:hover-vertical, clip:fly-soft, clip:walk-right, clip:walk-left, clip:walk-downwards, clip:walk-upwards, clip:angry-talk-right, clip:surprised-backoff, clip:thinking-walking, clip:very-happy, clip:surprised, clip:walk, clip:thinking, clip:happy, clip:wave-animation."
          },
          "say": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ],
            "description": "A line, in a bubble above them — or an ARRAY of lines: the same speaker delivers them one after another, a fresh bubble each, and the beat's move plays under the first. Several short bubbles read far better than one long one."
          },
          "sound": {
            "type": "string",
            "enum": [
              "alarm-comic-1",
              "alarm-comic-2",
              "alarm-comic-3",
              "angry-stomping-1",
              "angry-stomping-2",
              "angry-stomping-3",
              "anticipation-hushed-1",
              "anticipation-hushed-2",
              "anticipation-hushed-3",
              "argument",
              "awe-1",
              "awe-2",
              "awe-3",
              "awe-4",
              "awe-5",
              "betrayal-1",
              "betrayal-2",
              "betrayal-3",
              "big-beast-1",
              "big-beast-2",
              "big-beast-3",
              "bird-chirp",
              "blacksmith-strike",
              "boredom-1",
              "boredom-2",
              "boredom-3",
              "bow-courtly-1",
              "bow-courtly-2",
              "bow-courtly-3",
              "cat-meow",
              "choir-wonder-1",
              "choir-wonder-2",
              "choir-wonder-3",
              "climb-up",
              "clock-time-1",
              "clock-time-2",
              "cry-vocal",
              "danger-glockenspiel",
              "disappointed-banjo-1",
              "disappointed-banjo-2",
              "disappointed-banjo-3",
              "dog-bark-1",
              "dog-bark-2",
              "drop-in-1",
              "drop-in-2",
              "drop-in-3",
              "enter-bright-1",
              "enter-bright-2",
              "enter-bright-3",
              "explosion-comic-1",
              "explosion-comic-2",
              "explosion-comic-3",
              "fall-clumsy-1",
              "fall-clumsy-2",
              "fall-clumsy-3",
              "flash-bright-1",
              "flash-bright-2",
              "flash-bright-3",
              "flash-bright-4",
              "flash-bright-5",
              "flash-bright-6",
              "fly-soar-1",
              "fly-soar-2",
              "forgive-1",
              "forgive-2",
              "frog-croak-1",
              "frog-croak-2",
              "frog-croak-3",
              "frog-croak-4",
              "frog-croak-5",
              "greeting-1",
              "greeting-2",
              "greeting-3",
              "greeting-4",
              "greeting-5",
              "grow-in-1",
              "grow-in-2",
              "grow-in-3",
              "guitar-nightwatch-1",
              "guitar-nightwatch-2",
              "guitar-nightwatch-3",
              "gulp-eat-1",
              "gulp-eat-2",
              "halt-comic",
              "herald-fanfare",
              "jump-springy-1",
              "jump-springy-2",
              "kiss-sweet",
              "lie-told",
              "light-and-airy-1",
              "light-and-airy-2",
              "lonely",
              "longing-1",
              "longing-2",
              "longing-3",
              "market-haggle",
              "menace-near-1",
              "menace-near-2",
              "minstrel-air-1",
              "minstrel-air-2",
              "mischief-1",
              "mischief-2",
              "musicbox-down-1",
              "musicbox-down-2",
              "musicbox-down-3",
              "musicbox-wind-1",
              "musicbox-wind-2",
              "musicbox-wind-3",
              "owl-hoot",
              "panic-1",
              "panic-2",
              "panic-3",
              "pride-small-1",
              "pride-small-2",
              "pride-small-3",
              "ray-zap",
              "relief-resolve-1",
              "relief-resolve-2",
              "relief-resolve-3",
              "rise-up-1",
              "rise-up-2",
              "rise-up-3",
              "robot-chirp-1",
              "robot-chirp-2",
              "shame-1",
              "shame-2",
              "shame-3",
              "shimmer-dream-1",
              "shimmer-dream-2",
              "shimmer-dream-3",
              "shimmer-dream-4",
              "shimmer-dream-5",
              "shrink-down-1",
              "shrink-down-2",
              "singing-bowl-1",
              "singing-bowl-2",
              "sleepy-lullaby-1",
              "sleepy-lullaby-2",
              "sleepy-waltz-1",
              "sleepy-waltz-2",
              "sleepy-waltz-3",
              "sneak-muted-1",
              "sneak-muted-2",
              "sorrowful-cello-1",
              "sorrowful-cello-2",
              "sorrowful-cello-3",
              "spin-in-1",
              "spin-in-2",
              "spin-in-3",
              "splash-1",
              "splash-2",
              "splash-3",
              "spotlight-hushed-1",
              "spotlight-hushed-2",
              "spotlight-hushed-3",
              "stage-shake-1",
              "stage-shake-2",
              "stage-shake-3",
              "street-bustle-1",
              "street-bustle-2",
              "striving-climb-1",
              "striving-climb-2",
              "striving-climb-3",
              "surf-chase-1",
              "surf-chase-2",
              "surprise-staccato-1",
              "surprise-staccato-2",
              "surprise-ukulele-1",
              "surprise-ukulele-2",
              "surprise-ukulele-3",
              "suspense-crescendo-1",
              "suspense-crescendo-2",
              "suspense-crescendo-3",
              "suspense-stalking-1",
              "suspense-stalking-2",
              "suspense-stalking-3",
              "suspense-stalking-4",
              "suspicion-1",
              "suspicion-2",
              "think-pondering-1",
              "think-pondering-2",
              "think-pondering-3",
              "treasure-sparkle-1",
              "treasure-sparkle-2",
              "treasure-sparkle-3",
              "villain-fuzz-1",
              "villain-fuzz-2",
              "villain-fuzz-3",
              "wake-up-1",
              "wake-up-2",
              "wake-up-3",
              "animal-call-1",
              "animal-call-2",
              "animal-call-3",
              "applause-1",
              "applause-2",
              "applause-3",
              "applause-4",
              "bell",
              "boing",
              "boing-long",
              "crowd-murmur",
              "curtain-open-1",
              "curtain-open-2",
              "curtain-open-3",
              "curtain-sweep-1",
              "curtain-sweep-2",
              "door-creak-1",
              "door-creak-2",
              "drop",
              "footsteps-1",
              "footsteps-2",
              "footsteps-3",
              "footsteps-4",
              "gasp-1",
              "gasp-2",
              "gasp-3",
              "hinge-creak-1",
              "hinge-creak-2",
              "knock-dull",
              "laugh-cute",
              "magic-transformation-1",
              "magic-transformation-2",
              "magic-transformation-3",
              "paper-shuffle-1",
              "paper-shuffle-2",
              "paper-shuffle-3",
              "phew",
              "plop",
              "potion-bubble-1",
              "potion-bubble-2",
              "potion-bubble-3",
              "prop-clatter-1",
              "prop-clatter-2",
              "prop-clatter-3",
              "snore-comic-1",
              "snore-comic-2",
              "spit",
              "swoosh-small",
              "sword-clash-1",
              "sword-clash-2",
              "sword-clash-3",
              "sword-draw-1",
              "sword-draw-2",
              "thud",
              "thunder-soft-1",
              "thunder-soft-2",
              "thunder-soft-3",
              "vanish-poof-1",
              "vanish-poof-2",
              "vanish-poof-3",
              "vanish-poof-4",
              "whoosh",
              "wind-gust-1",
              "wind-gust-2",
              "wind-gust-3"
            ],
            "description": "A sting fired as the beat starts. Rides along with a move rather than taking its own time. Call show_sounds for what each is."
          },
          "at": {
            "type": "object",
            "description": "Where a walk or jump ENDS UP, in canvas coordinates — the same numbers piece_list and stage_describe report. Measured against where the walker is standing at that point in the scene, so two walks in a row both land where you said. This is a FLAT stage seen from the front, so crossing it means changing x — left and right. There is no into-the-distance to walk into; y moves somebody up or down the picture, which is a jump or a climb, not a journey.",
            "properties": {
              "x": {
                "type": "number"
              },
              "y": {
                "type": "number"
              }
            }
          },
          "by": {
            "type": "object",
            "description": "How far a walk or jump travels from where it starts, in canvas units — a distance, not a place. For \"two steps back\". Use \"at\" whenever you know where they should end up. Ignored when \"at\" is given.",
            "properties": {
              "x": {
                "type": "number"
              },
              "y": {
                "type": "number"
              }
            }
          },
          "camera": {
            "type": "object",
            "description": "Move the view to frame pieces. Use on:'all' for the whole cast at the start and end of a scene. A single id can put everyone else offscreen; use it only for a brief close-up, then return to on:'all' or a group. The move takes the beat's whole \"duration\": 600ms = fast cut, 3000ms = drift, 8000ms = slow zoom. Use slow moves often, not only cuts. Add \"with\": true to move the camera WHILE the previous beat plays, e.g. a slow push-in during a line: {id, say: \"...\"} then {camera: {on: [id], tight: 1.3}, with: true, duration: 6000}. To travel from one place to another, frame piece A, then piece B. Needs no \"id\".",
            "properties": {
              "on": {
                "description": "Layer ids to frame, or \"all\" for the whole scene. Prefer \"all\" or a group when several characters matter.",
                "oneOf": [
                  {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  {
                    "type": "string",
                    "enum": [
                      "all"
                    ]
                  }
                ]
              },
              "tight": {
                "type": "number",
                "description": "How much of the view they fill. 1 is snug (default), 0.6 leaves air around them, 1.4 is a close-up that crops other characters. Prefer 0.6–0.85 for a group."
              },
              "easing": {
                "type": "string",
                "enum": [
                  "glide",
                  "linear"
                ],
                "description": "'glide' (default) slows down at the end. 'linear' moves at constant speed — use it for long slow zooms and pans."
              }
            },
            "required": [
              "on"
            ]
          },
          "effect": {
            "type": "string",
            "enum": [
              "sparkles",
              "poof",
              "confetti",
              "hearts",
              "rain",
              "anger",
              "smoke",
              "explosion"
            ],
            "description": "A canned particle effect thrown over this character as the beat runs — little paper shapes, in the style of the stage. Rides along with a move or a line; alone it takes its own moment. \"sparkles\": Little paper stars pop around them and wink out. Magic, a wish granted, a potion working, something precious revealed. \"poof\": A burst of paper dust from their middle, gone in a blink. Appearing, vanishing, a transformation landing — pair it with \"becomes\". \"confetti\": Strips of coloured paper flutter down over them. Celebration, victory, a party, the happy ending. \"hearts\": Small paper hearts rise from them and fade. Love, gratitude, delight. \"rain\": Torn blue slivers fall across them. Rain, sadness, a bad day on stage. \"anger\": Big cut-paper symbols burst over their head — a hash, an at, a star, a bang. Comic swearing: fury, a tantrum, being told off, losing an argument. Fewer and much larger than the other effects, so it reads from across the stage. \"smoke\": Soft grey paper puffs climb from them and thin out as they go. A chimney, a kettle, a snuffed candle, a train pulling away — anything still going after the thing that caused it has stopped. The slowest effect here. \"explosion\": A hard burst of red and mustard shards thrown outward, with dark smoke left drifting up behind them. A blast, a crash, a machine giving up, a spell going wrong. The loudest thing on the stage — do not use it for a surprise, use \"poof\"."
          },
          "take": {
            "type": "string",
            "description": "The id of a cast member this character picks up. It animates into their hand and then belongs to them — walks, jumps and turns carry it along — until a \"drop\". A character holding a basket, sitting on a vehicle, carrying a lantern: all this."
          },
          "drop": {
            "type": "string",
            "description": "The id of a held cast member to let go of. It falls to the ground line and stays where it lands."
          },
          "becomes": {
            "type": "string",
            "description": "Another layer id to draw in this character's place from here on — a costume change. The only way a cut-out can do something its drawing does not already do: a bird with folded wings cannot open them, but it can BECOME the drawing of a bird with open wings, standing in the same place at the same size. Ask for both on the same sheet and they will match. Lasts until the scene ends or another beat changes it again."
          },
          "with": {
            "type": "boolean",
            "description": "Run this beat AT THE SAME TIME as the one before it — B recoils while A shouts, two people speak over each other, the wolf creeps while the girl talks. Reaction is what scenes are made of; use this often."
          },
          "wait": {
            "type": "number",
            "description": "Seconds of nothing. A beat with only this in it is a pause — before an answer that is being thought about, after a line that needs to land, while somebody looks at something. Needs no \"id\". A short breath between two different speakers is added for you; this is for the ones that mean something."
          },
          "background": {
            "type": "string",
            "description": "Fade the PAPER to this hex colour as the beat starts — the weather changing mid-scene: dusk falling, a fire catching. 'paper' returns the house colour. Rides along with whatever else the beat does; alone it takes no time and needs no id. It stays until something changes it again."
          },
          "spotlight": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ],
            "description": "Put a spotlight on a layer id (or an array of ids, or 'off'). Everything else dims; the lit pieces stay fully visible and the beam follows them when they move. Can ride along with another beat; alone it lasts 1.6 seconds and needs no id. By default it ends with this beat, so later dialogue is lit normally. Use spotlightHold:true only when the light should span later beats; then send spotlight:'off' when the moment ends."
          },
          "narration": {
            "type": "string",
            "description": "A short line for the AI narrator at this moment. Saved with the beat for future voice playback; it is not character dialogue and the theatre does not speak it yet. Can stand alone without an id, or accompany a move or camera shot. Keep each passage brief."
          },
          "spotlightHold": {
            "type": "boolean",
            "description": "Keep a spotlight across later beats until spotlight:'off'. Default false: this beat only."
          },
          "range": {
            "type": "number",
            "description": "Beam size for `spotlight`, as a multiple of the piece: 1 hugs it (default), 0.7 a tight face-spot, 2.5 a wide pool."
          },
          "duration": {
            "type": "number",
            "description": "Override the beat's length, in ms."
          }
        }
      }
    }
  },
  "required": [
    "beats"
  ]
}

Similar websites

wfsim.app

wfsim.app

A Warframe calculator that simulates the fight instead of estimating it — builder, simulator, optimizer. Every formula cites its source, and the golden tests ar…

live Unverified Media & Personal
101 tools A12 / Act89 / T0 Not yet scored Seen 2026-11-05
enemies_targets_list enemies_target_new enemies_target_copy enemies_target_open enemies_target_set
Inspect tools
commonplace-webmcp.vercel.app

commonplace-webmcp.vercel.app

Commonplace is an editable social reading space built for people and their browser agents.

live Unverified Media & Personal Transact tools
89 tools A10 / Act77 / T2 Not yet scored Seen 2026-11-05
commonplace.get_page_state commonplace_get_page_state commonplace.get_reading_list commonplace_get_reading_list commonplace.get_profile
Inspect tools
pixelforge-studio.appcaster.chatgpt.site

pixelforge-studio.appcaster.chatgpt.site

A professional browser pixel-art editor for drawing, frame animation, palettes, sprite sheets, GIF export, and WebMCP automation.

live Unverified Media & Personal Transact tools
88 tools A12 / Act70 / T6 Not yet scored Seen 2026-11-05
plan_text_creation get_text_creation_status create_from_text claim_text_creation update_text_creation
Inspect tools
pixelite.taskcraft.site

pixelite.taskcraft.site

Pixelite

live Unverified Media & Personal Transact tools
83 tools A4 / Act78 / T1 Not yet scored Seen 2026-11-05
get_document_info list_layers get_active_layer get_selection_info new_document
Inspect tools

Related on Influzer