ASCII Motion MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LIVE | Yes | Enable live browser sync via WebSocket. Required for visual output. Set to 'true' to enable. | true |
| PORT | No | WebSocket port for live mode (default: 9876). | 9876 |
| PROJECT_DIR | No | Project directory for file operations (default: current working directory). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_cellA | Get the character and colors at a specific canvas position |
| set_cellA | Set the character and/or colors at a specific canvas position |
| clear_cellA | Clear a cell, resetting it to empty (space with transparent background) |
| set_cells_batchA | Set multiple cells in a single operation. More efficient than calling set_cell repeatedly. |
| paste_ascii_blockB | Paste a multi-line ASCII art block onto the canvas at a specified position. Great for pasting found ASCII art. |
| fill_regionB | Fill a region with a character and colors. Can be contiguous (flood fill) or global (all matching cells). |
| resize_canvasA | Resize the canvas. Content outside the new bounds will be clipped. |
| clear_canvasA | Clear all cells on the current frame, leaving it empty |
| list_framesA | List all frames in the animation with their metadata |
| add_frameC | Add a new frame to the animation |
| delete_frameA | Delete a frame from the animation. Cannot delete the last remaining frame. |
| duplicate_frameB | Duplicate a frame, inserting the copy immediately after the original |
| go_to_frameB | Navigate to a specific frame, making it the current/active frame |
| set_frame_durationB | Set the duration of a frame in milliseconds |
| set_frame_nameB | Set or change the name of a frame |
| new_projectA | Create a new empty project, discarding any unsaved changes |
| save_projectB | Save the current project to a .asciimtn file |
| load_projectA | Load a project from a .asciimtn file |
| get_project_infoC | Get information about the current project |
| set_project_nameC | Set the project name |
| list_project_filesB | List all .asciimtn project files in the project directory |
| get_canvas_summaryA | Get a compact summary of the canvas (dimensions, fill count, bounding box). Use this first to understand the canvas before requesting more detail. |
| get_canvas_previewB | Get non-empty cells in a region. Use for inspecting specific areas. |
| get_canvas_asciiA | Get the canvas as raw ASCII text (characters only, no color info). Good for verifying visual appearance. |
| get_frame_diffA | Get the cells that differ between two frames. Useful for understanding animation changes. |
| describe_animationA | Get a high-level description of the animation: frame count, timing, and motion patterns. |
| undoB | Undo the last action |
| redoA | Redo the last undone action |
| get_history_statusA | Check if undo/redo is available and what actions can be undone/redone |
| copy_frame_and_modifyA | Duplicate a frame and apply modifications in a single operation. Efficient for creating animation sequences. |
| shift_frame_contentA | Shift all content on the current frame by an x/y offset. Useful for creating scrolling or movement animations. |
| flip_regionB | Flip/mirror content horizontally or vertically |
| copy_region_to_frameC | Copy a region of cells from one frame to another |
| interpolate_framesC | Generate intermediate frames between two keyframes. Creates smooth transitions. |
| select_rectangleC | Select a rectangular region of the canvas |
| select_by_colorA | Select cells that match specific criteria (magic wand style) |
| get_selectionB | Get the current selection bounds and contents |
| clear_selectionA | Clear the current selection (deselect) |
| apply_to_selectionC | Apply an operation to all cells in the current selection |
| delete_selection_contentB | Delete all cell content within the current selection |
| export_textA | Export the current frame or all frames as plain text (.txt). Returns ASCII art as text. |
| export_jsonA | Export the project as structured JSON data. Good for programmatic processing. |
| export_sessionA | Export the project as an .asciimtn session file (can be loaded by Ascii-Motion app). |
| export_htmlB | Export the animation as a self-contained HTML file with embedded animation player. |
| export_reactB | Export the animation as a React component (JSX or TSX). |
| export_ansiB | Export the current frame with ANSI escape codes for terminal display. |
| apply_effectC | Apply a visual effect to the current frame or selection. Effects modify colors and/or characters. |
| get_color_statsA | Get statistics about colors used in the current frame. Useful before applying color effects. |
| batch_recolorB | Replace one color with another across the entire frame or selection. |
| batch_replace_charA | Replace one character with another across the entire frame or selection. |
| get_effect_blocksA | List all procedural effect blocks across layers, groups, and global effects. Shows effect type, timing, enabled status, and keyframe count. |
| add_effect_blockA | Add a non-destructive procedural effect to a layer, group, or global effects. Available types: levels, hue-saturation, remap-colors, remap-characters, scatter, wave-warp, wiggle. |
| update_effect_blockB | Update a procedural effect block's settings, timing, or enabled state. |
| remove_effect_blockB | Remove a procedural effect block from its owner (layer, group, or global). |
| add_effect_keyframeA | Add a keyframe to a procedural effect property. Creates the property track if it doesn't exist. |
| remove_effect_keyframeB | Remove a keyframe from a procedural effect property track. |
| run_generatorC | Generate procedural animation frames. Creates new frames with animated patterns. |
| preview_generatorA | Preview a single frame from a generator without applying to the project. |
| export_inkA | Export the current frame as an Ink (React CLI) component for Node.js terminal apps. |
| export_bubbleteaA | Export the current frame as a Bubbletea (Go TUI) component. |
| export_opentuiB | Export the current frame as an OpenTUI (Python TUI) component. |
| import_imageB | Import an image file and convert it to ASCII art on the canvas. Requires optional "sharp" or "jimp" package for image processing. |
| import_videoB | Import a video file and convert each frame to ASCII art animation. Requires ffmpeg and optional image processing package. |
| import_ascii_textC | Import ASCII art from a plain text file onto the canvas. |
| list_character_palettesA | List all available character palettes for ASCII art. |
| get_character_paletteA | Get all characters from a specific palette. |
| list_color_palettesB | List all available color palettes. |
| get_color_paletteB | Get all colors from a specific palette. |
| get_active_colorsA | Get the currently active foreground and background colors. |
| set_foreground_colorB | Set the active foreground (text) color. |
| set_background_colorB | Set the active background color. |
| set_selected_characterB | Set the active character used for drawing. |
| suggest_palette_for_styleC | Get palette recommendations for a specific style. |
| refresh_state_from_browserA | Request the browser to send its current state. Use this before reading canvas data to ensure you have the latest state. Returns success if browser is connected and responded. |
| compare_framesB | Compare two frames and show what cells changed between them. Useful for understanding motion and edits in an animation. |
| get_layersA | Get all layers in the project with their metadata, content frame count, and property track info. |
| add_layerA | Add a new layer to the project. If project is in legacy frame mode, this switches it to layer mode. |
| remove_layerA | Remove a layer by ID. Cannot remove the last remaining layer. |
| duplicate_layerA | Duplicate a layer with all its content frames and property tracks. |
| set_active_layerA | Set which layer is active for drawing and editing operations. |
| rename_layerB | Rename a layer. |
| reorder_layersB | Move a layer from one z-order position to another. Index 0 = bottom layer. |
| set_layer_visibilityC | Set visibility, solo, lock, or opacity on a layer. |
| add_content_frameB | Add a new content frame (canvas data segment) to a layer at a specific timeline position. |
| remove_content_frameB | Remove a content frame from a layer. |
| add_keyframeA | Add a keyframe to a layer property track. Creates the property track if it doesn't exist. |
| remove_keyframeC | Remove a keyframe from a property track. |
| get_layer_propertiesA | Get all transform property values for a layer at the current frame, including keyframe status. |
| create_groupB | Create a layer group to organize layers together. |
| ungroup_layersA | Dissolve a layer group, keeping the layers. |
| set_frame_rateA | Set the timeline frame rate (FPS). Preserves frame count — only changes playback speed. |
| set_timeline_durationA | Set the total timeline duration in frames. |
| get_connection_statusA | Check browser connection status. Returns whether browser is connected and client count |
| get_auth_tokenA | Get the authentication token for browser connection. |
| export_imageA | Export the current frame as an image (PNG, JPG, or SVG). The browser renders the image at full quality. Requires live mode with a connected browser. |
| export_videoA | Export the animation as a video file (MP4 or WebM). The browser renders each frame and encodes the video. Requires live mode with a connected browser. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| create-animation | Create a simple animation with multiple frames |
| import-and-animate | Import an image and create an animation from it |
| generate-rain | Generate a digital rain (Matrix-style) animation |
| create-banner | Create an animated text banner or logo |
| apply-effects | Apply visual effects to existing ASCII art |
| export-for-cli | Export ASCII art for use in terminal/CLI applications |
| add-effects | Add procedural (non-destructive) effects to an animation for color adjustments, distortions, or character remapping |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| project-state | Current project state including canvas, frames, and settings. Returns a complete snapshot. |
| project-canvas | Current frame canvas data as a sparse map of cell positions to cell data. |
| project-frames | List of all animation frames with their metadata (id, name, duration, cell count). |
| project-selection | Current selection state including type and selected cells. |
| project-history | Undo/redo history status including available actions. |
| project-ascii | Plain text ASCII art preview of the current frame. |
| project-layers | Layer structure with content frames, property tracks, and groups. Only available in layer mode (v2). |
| guide-llm-best-practices | Best practices for LLMs using ASCII Motion MCP. Read before complex animation tasks. |
| guide-tool-categories | Quick reference of all available tool categories. |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/CameronFoxly/ascii-motion-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server