PinePaper MCP Tools Specification
This document defines the MCP tools for PinePaper integration. These tools enable AI agents to create animated graphics and generate training data.
⚠️ These are MCP-client tools, not the in-editor console API
The
pinepaper_*tools below run through an MCP client (Claude Desktop, Cursor, the Claude API, …). They are not available in the editor’s AI / Code console — pasting one there yieldsundefined.In the AI / Code console use the client API (identical capability, different names): the console injects the
PinePaperinstance + Paper.js globals. e.g.pinepaper_create_item({ itemType, position, properties })→PinePaper.create(itemType, { x, y, ...properties });pinepaper_animate({ itemId, animationType, speed })→PinePaper.animate(item, { animationType, speed }). See Best Practices → “Two ways to drive PinePaper” for the full mapping.
The tool surface (generated — this is the authoritative list)
137 tools, generated from js/ontology/mcp-tool-manifest.json
(snapshot of mcp-server/src/tools/definitions.ts, synced 2026-08-16).
Read this table before the sections below. Many operations that once had
their own tool are now an action on a consolidated one — for example
create_skeleton is pinepaper_rigging { action: "create_skeleton" }, not
pinepaper_create_skeleton. Sections documenting a name that is no longer a
tool are marked in place; their PARAMETERS are usually still accurate, only
the entry point moved.
Regenerate with node scripts/build-tools-spec-index.mjs after running
scripts/sync-mcp-manifest.mjs.
| tool | actions |
|---|---|
pinepaper_add_filter |
— |
pinepaper_add_ports |
— |
pinepaper_add_relation |
— |
pinepaper_agent_analyze |
— |
pinepaper_agent_batch_execute |
set_canvas_size, set_background, execute_generator, create, modify, delete, group, animate, keyframe_animate, relation, apply_mask, apply_effect, play_timeline |
pinepaper_agent_end_job |
— |
pinepaper_agent_export |
— |
pinepaper_agent_reset |
— |
pinepaper_agent_start_job |
— |
pinepaper_analyze_design |
— |
pinepaper_animate |
— |
pinepaper_animate_letter_collage |
— |
pinepaper_apply_animated_mask |
— |
pinepaper_apply_custom_mask |
— |
pinepaper_apply_effect |
— |
pinepaper_apply_template |
— |
pinepaper_arrange |
front, back, forward, backward |
pinepaper_artboard |
list_presets, set, set_constraints |
pinepaper_audio_beats |
analyze, animate_to_beat |
pinepaper_auto_layout |
— |
pinepaper_background |
set, clear, get |
pinepaper_batch_create |
— |
pinepaper_batch_modify |
— |
pinepaper_brand_kit |
plan, apply |
pinepaper_browser_connect |
— |
pinepaper_browser_disconnect |
— |
pinepaper_browser_screenshot |
— |
pinepaper_browser_status |
— |
pinepaper_camera |
zoom, pan, move_to, reset, stop, state, fit_view |
pinepaper_camera_animate |
— |
pinepaper_camera_director |
auto, shots |
pinepaper_capture_frames |
— |
pinepaper_chroma_key |
— |
pinepaper_clear_canvas |
— |
pinepaper_comment |
add, list, resolve, delete |
pinepaper_component |
define, list, instantiate, set_override, sync, update_from_instance, detach |
pinepaper_compose |
list_patterns, list_treatments, apply, set_treatment |
pinepaper_connect |
— |
pinepaper_connect_ports |
— |
pinepaper_construction_sequence |
build, play, clear, list |
pinepaper_create_chart |
create, update, reconfigure, remove |
pinepaper_create_diagonal_stripes |
— |
pinepaper_create_diagram_shape |
— |
pinepaper_create_glossy_sphere |
— |
pinepaper_create_grid |
— |
pinepaper_create_item |
— |
pinepaper_create_letter_collage |
— |
pinepaper_create_scene |
— |
pinepaper_crop_image |
— |
pinepaper_cutout_style |
apply, list |
pinepaper_deform |
apply, trigger, remove |
pinepaper_delete_item |
— |
pinepaper_detect_objects |
— |
pinepaper_diagnostic_report |
— |
pinepaper_diagram_mode |
activate, deactivate, toggle |
pinepaper_equation_path |
— |
pinepaper_event |
create, pulse |
pinepaper_execute_custom_code |
— |
pinepaper_execute_generator |
— |
pinepaper_export_scene |
— |
pinepaper_export_svg |
— |
pinepaper_export_training_data |
— |
pinepaper_export_widget |
— |
pinepaper_export_widget_html |
— |
pinepaper_extract_object |
— |
pinepaper_font |
show_studio, set_name, get_required_chars, get_status, create_glyph, create_space, remove_glyph, set_metrics, export, load_into_document, export_data, import_data, clear, remove_overlap, correct_direction, cleanup_path |
pinepaper_game |
pathfind, create_tilemap |
pinepaper_geometry |
— |
pinepaper_get_animatable_properties |
— |
pinepaper_get_available_easings |
— |
pinepaper_get_canvas_ontology |
— |
pinepaper_get_canvas_size |
— |
pinepaper_get_diagram_shapes |
— |
pinepaper_get_items |
— |
pinepaper_get_mask_animations |
— |
pinepaper_get_mask_types |
— |
pinepaper_get_performance_metrics |
— |
pinepaper_get_relation_stats |
— |
pinepaper_globe |
enable, rotate_to, spin, world_tour, stop_tour, pin_item, tour_item |
pinepaper_group |
group, ungroup, break_apart |
pinepaper_history |
undo, redo, get_state |
pinepaper_image_filter |
apply, chain |
pinepaper_import_asset |
— |
pinepaper_import_image |
— |
pinepaper_import_layered_character |
— |
pinepaper_import_mermaid |
— |
pinepaper_import_motion_capture |
— |
pinepaper_import_svg |
— |
pinepaper_instantiate_ontology |
— |
pinepaper_interaction |
add_behavior, remove_behavior, trigger_action, get_state |
pinepaper_keyframe_animate |
— |
pinepaper_lasso |
activate, apply |
pinepaper_lint_scene |
— |
pinepaper_list_generators |
— |
pinepaper_magic |
animate, remix |
pinepaper_manage_scenes |
save, load, list, delete, rename, duplicate, reorder, info, export, import |
pinepaper_map |
load, pan, zoom, export_config, import_custom |
pinepaper_map_animation |
animate_regions, animate_wave, stop, get_animated |
pinepaper_map_data |
export_csv, import_csv, export_geojson, export_original_geojson, source_info |
pinepaper_map_regions |
highlight, unhighlight, apply_colors, add_marker, add_labels, get_at_point, select, deselect, get_highlighted |
pinepaper_measurement |
set_rulers, set_grid, get_dimensions, set_snap |
pinepaper_media |
upload_video, upload_audio, list, remove, set_playback_rate, set_clip, set_time_remap, speed_ramp, match_cut, apply_track_matte, stop_live_matte |
pinepaper_modify_item |
— |
pinepaper_p5_draw |
— |
pinepaper_physics |
init, add_body, remove_body, apply_force, apply_impulse, set_velocity, get_state, create_ground, create_joint |
pinepaper_play_timeline |
play, pause, stop, seek |
pinepaper_precomp |
create, add, remove |
pinepaper_provenance |
get, lineage, dependents, record |
pinepaper_query |
get_by_id, hit_test, is_empty |
pinepaper_query_ontology |
— |
pinepaper_query_relations |
— |
pinepaper_refresh_page |
— |
pinepaper_register_custom_relation |
— |
pinepaper_register_item |
— |
pinepaper_remove_connector |
— |
pinepaper_remove_mask |
— |
pinepaper_remove_relation |
— |
pinepaper_rigging |
create_skeleton, add_bone, attach_item, create_ik_chain, add_pose_keyframe, set_target_path, save_pose, save_shape_key, import_bvh, retarget_bvh, import_spine |
pinepaper_scene_diff |
history, version |
pinepaper_scene_playback |
create_chain, play, pause, resume, stop, toggle_loop, jump |
pinepaper_search_assets |
— |
pinepaper_selection |
select, select_all, deselect_all, get, delete_selected |
pinepaper_set_background_color |
— |
pinepaper_set_canvas_size |
— |
pinepaper_set_toolkit |
— |
pinepaper_shatter_image |
— |
pinepaper_sprite_sheet |
generate, play, export |
pinepaper_template_params |
get, apply |
pinepaper_text_effect |
apply, list |
pinepaper_text_style |
apply_style, set_font_axes, list_styles |
pinepaper_tool_guide |
— |
pinepaper_transform |
fit, nudge, flip, reorder |
pinepaper_update_connector |
— |
pinepaper_validate |
— |
pinepaper_validate_design |
— |
pinepaper_validate_scene |
— |
pinepaper_world3d |
create, describe, configure, add_actor, remove_actor, list_actors, set_actor_pose, set_camera, add_object, remove_object, remove_world |
Tool Categories
- Canvas Tools - Set and get canvas dimensions (REQUIRED before creating items)
- Item Tools - Create, modify, delete canvas items
- Diagram Tools - Create flowcharts, UML diagrams, and network diagrams
- Relation Tools - Define behavior relationships (key for animation)
- Animation Tools - Apply and control animations
- Mask Tools - Apply clipping masks and animated reveal effects
- Generator Tools - Create procedural backgrounds
- Map Tools - Geographic visualizations (world maps, US states, choropleth)
- Font Tools - Create custom hand-drawn fonts with glyph management
- Text Design Tools - Create stylized text (Letter Collage with tile, magazine, gradient styles)
- Effect Tools - Apply visual effects (sparkle, blast)
- Query Tools - Find and inspect items
- Export Tools - Export graphics, training data, widget JSON, and standalone HTML
- Rigging Tools - Skeletal animation with bones, FK/IK solvers, and poses (v0.4)
- Blending Tools - Per-item and per-group compositing presets and transitions (v0.4)
- Image Filter Tools - GPU-accelerated image filters (grayscale, HSL, posterize, etc.)
- Lasso Tools - Freehand lasso selection for image region extraction
- Cutout Style Tools - Apply visual style presets to image cutouts
- View Tools - Zoom, pan, and fit canvas view
- Selection Tools - Select, deselect, and manage item selection
- Transform Tools - Nudge, flip, and reorder items in stacking order
- Background Tools - Set background color, pattern, or procedural generator
- History Tools - Undo, redo, and manage edit history
- Advanced Query Tools - Query items by name, type, or custom matcher
- Precomp Tools - Create and manage nested compositions
- Playback Tools - Control keyframe timeline playback
- 3D Projection Tools - Create and configure 3D objects with projection, camera, and lighting
- Deformation Tools - Apply vertex-level geometric deformation presets (fold, twist, wave, etc.)
- Sprite Sheet Tools - Generate, play, and export sprite sheet atlases from rigged skeletons
- Shape Key Tools - Save, load, and animate per-item blend shapes for facial animation (v0.4.3)
- Procedural Animation Tools - One-call breathing, idle, walk, and jump animations (v0.4.3)
- Bone Physics Tools - Verlet physics simulation on bones with impulses and colliders (v0.4.3)
- Physics World Tools - Rigid body physics for canvas items via Planck.js (v0.4.3)
- Character Controller Tools - Composable character movement and test mode (v0.4.3)
- Scene Sequencer Tools - Timeline-based multi-character action choreography (v0.4.3)
- Advanced Rigging Tools - Guided rig builder, bone management, path skinning, secondary motion (v0.4.3)
- Scene Tools - Scene baking, part system, and animation suggestions (v0.4.3)
- Image & Detection Tools - Place images, on-device object detection, region extraction, and relational compositing on detected objects
Canvas Tools
IMPORTANT: AI agents MUST set the canvas size before creating items. The canvas defines the output dimensions and items should be positioned within these bounds.
pinepaper_get_canvas_size
Get the current canvas dimensions.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"width": 800,
"height": 600,
"preset": "default"
}
pinepaper_set_canvas_size
Set the canvas output dimensions. Agents SHOULD call this before creating items to ensure proper positioning.
Input Schema:
{
"type": "object",
"properties": {
"preset": {
"type": "string",
"enum": [
"youtube-thumbnail", "youtube-short", "tiktok",
"instagram-story", "instagram-post", "instagram-landscape", "instagram-portrait",
"facebook-post", "facebook-cover", "facebook-story",
"twitter-post", "twitter-header",
"linkedin-post", "linkedin-banner",
"pinterest-pin",
"presentation-16x9", "presentation-4x3",
"hd-720p", "full-hd-1080p",
"default"
],
"description": "Predefined canvas size preset"
},
"width": {
"type": "number",
"description": "Custom canvas width in pixels (use with height for custom size)",
"minimum": 100,
"maximum": 7680
},
"height": {
"type": "number",
"description": "Custom canvas height in pixels (use with width for custom size)",
"minimum": 100,
"maximum": 4320
}
},
"oneOf": [
{"required": ["preset"]},
{"required": ["width", "height"]}
]
}
Preset Dimensions:
| Preset | Dimensions | Use Case |
|---|---|---|
youtube-thumbnail |
1280×720 | YouTube video thumbnails |
youtube-short |
1080×1920 | YouTube Shorts |
tiktok |
1080×1920 | TikTok videos |
instagram-story |
1080×1920 | Instagram Stories & Reels |
instagram-post |
1080×1080 | Square Instagram posts |
instagram-landscape |
1080×566 | Landscape Instagram posts |
instagram-portrait |
1080×1350 | Portrait Instagram posts |
facebook-post |
1200×630 | Facebook feed posts |
facebook-cover |
820×312 | Facebook cover photos |
facebook-story |
1080×1920 | Facebook Stories |
twitter-post |
1200×675 | Twitter/X images |
twitter-header |
1500×500 | Twitter/X profile headers |
linkedin-post |
1200×627 | LinkedIn posts |
linkedin-banner |
1584×396 | LinkedIn banners |
pinterest-pin |
1000×1500 | Pinterest pins |
presentation-16x9 |
1920×1080 | 16:9 presentations |
presentation-4x3 |
1024×768 | 4:3 presentations |
hd-720p |
1280×720 | HD video |
full-hd-1080p |
1920×1080 | Full HD video |
default |
800×600 | Default canvas |
Output:
{
"success": true,
"width": 1080,
"height": 1080,
"preset": "instagram-post"
}
Item Tools
pinepaper_create_item
Create an item on the canvas.
Input Schema:
{
"type": "object",
"properties": {
"itemType": {
"type": "string",
"enum": ["text", "circle", "star", "rectangle", "triangle", "polygon", "ellipse", "path", "line", "arc", "image", "event"],
"description": "Type of item to create. 'image' requires `properties.dataURL` (or `src`). 'event' is a pp:Event channel — see pinepaper_create_event for a convenience wrapper."
},
"position": {
"type": "object",
"properties": {
"x": { "type": "number" },
"y": { "type": "number" }
},
"description": "Position on canvas"
},
"properties": {
"type": "object",
"description": "Type-specific properties"
},
"data": {
"type": "object",
"description": "Item data flags for selection and behavior control",
"properties": {
"selectable": { "type": "boolean", "description": "Whether item can be selected (default: true for text layer items)" },
"isDraggable": { "type": "boolean", "description": "Whether item can be dragged (default: true for text layer items)" },
"isDecorative": { "type": "boolean", "description": "Mark as decorative/non-interactive (skipped by selection)" }
}
},
"animationType": {
"type": "string",
"description": "Animation type to apply on creation (e.g., 'pulse', 'bounce', 'keyframe')"
},
"animationSpeed": {
"type": "number",
"description": "Animation speed multiplier (for simple animations)"
},
"keyframes": {
"type": "array",
"description": "Keyframe array for inline keyframe animation (requires animationType: 'keyframe')",
"items": {
"type": "object",
"properties": {
"time": { "type": "number", "description": "Time in seconds" },
"properties": { "type": "object", "description": "Animatable properties (x, y, scale, opacity, rotation, fillColor, etc.)" },
"easing": { "type": "string", "description": "Easing function: linear, easeIn, easeOut, easeInOut, bounce, elastic" }
}
}
}
},
"required": ["itemType"]
}
Type-Specific Properties:
| Type | Properties |
|---|---|
text |
content, fontSize, fontFamily, color |
circle |
radius, color, strokeColor, strokeWidth |
star |
radius1, radius2, color |
rectangle |
width, height, color |
polygon |
sides, radius, color |
path |
segments or pathData, strokeColor, strokeWidth, closed, smooth |
line |
from, to, strokeColor, strokeWidth |
arc |
from, through, to, strokeColor |
Data Flags for Selection Control:
| Flag | Type | Description |
|---|---|---|
selectable |
boolean | Allow item to be selected (even in background layer). Default: true for text layer items |
isDraggable |
boolean | Allow item to be dragged when selected. Default: true for text layer items |
isDecorative |
boolean | Mark as non-interactive decoration (never selectable). Useful for orbit paths, guidelines, etc. |
Layer and Selection Priority:
- Items in
textItemGroup(text layer) are always selectable by default - Items in
patternGroup(background) are NOT selectable unless marked withselectable: true - Items with
isDecorative: trueare never selectable (overrides all) - Items with
selectable: truecan be selected even if in background layer
Output:
{
"success": true,
"itemId": "item_1",
"type": "circle",
"position": { "x": 400, "y": 300 }
}
pinepaper_create_event
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Create a pp:Event item — an addressable pulse channel for the event-channel relation surface. Convenience wrapper over pinepaper_create_item with itemType: 'event'. Use when building interactive state machines, timed effects, or any flow where producers (clicks, keys, enter/exit transitions) pulse a named channel and reactions listen.
Input Schema:
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Human-readable channel name (also shown on the event's badge in the editor)"
},
"payloadType": {
"type": "string",
"enum": ["Pulse", "Numeric", "String", "Boolean"],
"default": "Pulse",
"description": "Declared payload shape — 'Pulse' is the no-value default; the others are advisory for downstream consumers"
},
"position": {
"type": "object",
"properties": {
"x": { "type": "number" },
"y": { "type": "number" }
},
"description": "Position of the event badge in the editor (events have no visual at render time)"
}
},
"required": ["name"]
}
Output:
{
"success": true,
"eventId": "item_7",
"name": "tab_1_clicked"
}
Usage pattern — interactive tab:
// Create the event channel
const evt = pinepaper_create_event({ name: 'tab_a_clicked' });
// Wire a click producer + a setActive reaction
pinepaper_add_relation({
sourceId: 'tab_a_button', targetId: evt.eventId,
relationType: 'on_click_fire'
});
pinepaper_add_relation({
sourceId: evt.eventId, targetId: 'tab_a_button',
relationType: 'on_event_set_active'
});
// The A11yShadowTree pattern matcher detects this shape +
// exclusive_group + on_enter_set_visibility as a tablist, and
// emits the right WAI-ARIA roles + keyboard nav automatically.
pinepaper_modify_item
Modify an existing item.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Registry ID of the item"
},
"properties": {
"type": "object",
"description": "Properties to update",
"properties": {
"x": { "type": "number", "description": "X position in pixels" },
"y": { "type": "number", "description": "Y position in pixels" },
"width": { "type": "number", "description": "Width in pixels (absolute sizing)" },
"height": { "type": "number", "description": "Height in pixels (absolute sizing)" },
"scale": { "type": "number", "description": "Uniform scale (1.0 = 100%)" },
"scaleX": { "type": "number", "description": "Horizontal scale" },
"scaleY": { "type": "number", "description": "Vertical scale" },
"rotation": { "type": "number", "description": "Rotation in degrees" },
"opacity": { "type": "number", "description": "Opacity (0-1)" },
"color": { "type": "string", "description": "Fill color" },
"strokeColor": { "type": "string", "description": "Stroke color" },
"strokeWidth": { "type": "number", "description": "Stroke width in pixels" },
"fontSize": { "type": "number", "description": "Font size (text items only)" },
"content": { "type": "string", "description": "Text content (text items only)" },
"animationType": { "type": "string", "description": "Animation type" },
"animationSpeed": { "type": "number", "description": "Animation speed multiplier" },
"palette": { "type": "string", "description": "On a letter-collage group: swap every letter's tile + text fills to the named palette (e.g. 'wordle', 'spring', 'sunset'). In-place — ids, animations, relations, and effects attached to the collage or its letters survive." },
"collageStyle": { "type": "string", "description": "On a letter-collage group: swap visual style ('tile', 'magazine', 'paperCut', 'fold', 'gradient', 'image'). Geometry rebuilds but every registry id is preserved via graft — external references, animations, and relations remain valid. Combine with `palette` in one call to apply both." },
"bgColor": { "type": "string", "description": "On a single letter group (child of a collage): tile/background fill color. Matched on data.char to identify letter groups." },
"textColor": { "type": "string", "description": "On a single letter group: text (PointText) fill color." }
}
},
"data": {
"type": "object",
"description": "Update item data flags",
"properties": {
"selectable": { "type": "boolean" },
"isDraggable": { "type": "boolean" },
"isDecorative": { "type": "boolean" }
}
}
},
"required": ["itemId", "properties"]
}
Sizing: width/height vs scale:
| Property | Type | Description |
|---|---|---|
width |
pixels | Set exact width in pixels (absolute, predictable) |
height |
pixels | Set exact height in pixels (absolute, predictable) |
scale |
ratio | Multiply current size (relative, compounds on repeated use) |
Recommendation: Use width/height for precise sizing. Use scale only for proportional adjustments.
Letter-collage editing (non-destructive):
Four collage-aware props route through specialised in-place handlers — item registry ids, keyframe animations, attached relations (part_of, staggered_with, animates, …), effects, deformations, masks, and user-dragged positions are all preserved by construction. See text-typography.md for the full story.
| Prop | Target | Behaviour |
|---|---|---|
palette |
collage group (data.isCollage) |
Walks existing letters, rewrites tile + text fills. No geometry change. |
collageStyle |
collage group | Rebuilds per-letter geometry in the new style, then grafts the fresh Paper.js items back into the old registry slots. Same ids, new geometry. |
palette + collageStyle |
collage group | Combined in one call — fresh create uses both. |
bgColor / textColor |
letter group (data.char) |
Updates one letter’s tile + text fill. |
pinepaper_delete_item
Delete an item from the canvas.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Registry ID of the item to delete"
}
},
"required": ["itemId"]
}
Diagram Tools
Tools for creating flowcharts, UML diagrams, network diagrams, and connecting any visual elements with smart arrows.
Key Capabilities:
- Flowcharts & UML - Standard diagram shapes (process, decision, terminal, etc.)
- Network Diagrams - Server, cloud, and infrastructure symbols
- Visual Sequences - Connect any items (images, SVGs, shapes) with stylish arrows
- Smart Connectors - Auto-routing with orthogonal, curved, or direct paths
- Arrow Styles - Multiple head styles (classic, stealth, sharp, open, diamond, circle)
- Animated Flow - Bolt effect shows connection direction
Works With Any Item: Diagram connectors aren’t limited to diagram shapes. Connect any canvas items:
- Images and imported SVGs
- Text elements
- Custom paths and shapes
- Generator-created elements
This enables creative visual storytelling, infographics, and animated sequences.
pinepaper_create_diagram_shape
Create a diagram shape (flowchart, UML, network, or basic shape).
Input Schema:
{
"type": "object",
"properties": {
"shapeType": {
"type": "string",
"enum": [
"process", "decision", "terminal", "data", "document", "database", "preparation",
"uml-class", "uml-usecase", "uml-actor",
"cloud", "server",
"rectangle", "circle", "triangle", "star"
],
"description": "Type of diagram shape to create"
},
"position": {
"type": "object",
"properties": {
"x": { "type": "number" },
"y": { "type": "number" }
},
"description": "Position on canvas"
},
"width": {
"type": "number",
"description": "Shape width in pixels (optional, uses default for shape type)"
},
"height": {
"type": "number",
"description": "Shape height in pixels (optional, uses default for shape type)"
},
"label": {
"type": "string",
"description": "Text label to display inside the shape"
},
"style": {
"type": "object",
"properties": {
"fillColor": { "type": "string", "description": "Fill color (hex, rgb, or named)" },
"strokeColor": { "type": "string", "description": "Border/stroke color" },
"strokeWidth": { "type": "number", "description": "Border width in pixels" }
}
}
},
"required": ["shapeType"]
}
Shape Types by Category:
| Category | Shapes | Description |
|---|---|---|
| Flowchart | process, decision, terminal, data, document, database, preparation |
Standard flowchart symbols |
| UML | uml-class, uml-usecase, uml-actor |
UML diagram elements |
| Network | cloud, server |
Network architecture symbols |
| Basic | rectangle, circle, triangle, star |
Basic geometric shapes |
Default Sizes:
| Shape | Default Size |
|---|---|
process |
120 x 60 |
decision |
100 x 100 |
terminal |
120 x 50 |
data |
120 x 60 |
document |
120 x 70 |
database |
80 x 100 |
uml-class |
150 x 120 |
cloud |
140 x 90 |
server |
60 x 80 |
Output:
{
"success": true,
"itemId": "item_1",
"shapeType": "process",
"position": { "x": 400, "y": 300 }
}
pinepaper_connect
Connect two items with a smart connector.
Input Schema:
{
"type": "object",
"properties": {
"sourceItemId": {
"type": "string",
"description": "Registry ID of the source item"
},
"targetItemId": {
"type": "string",
"description": "Registry ID of the target item"
},
"routing": {
"type": "string",
"enum": ["direct", "orthogonal", "curved"],
"default": "orthogonal",
"description": "Path routing style"
},
"lineColor": {
"type": "string",
"description": "Connector line color"
},
"lineWidth": {
"type": "number",
"description": "Line width in pixels"
},
"lineStyle": {
"type": "string",
"enum": ["solid", "dashed", "dotted"],
"default": "solid"
},
"headStyle": {
"type": "string",
"enum": ["classic", "stealth", "sharp", "open", "diamond", "circle", "none"],
"default": "classic",
"description": "Arrowhead style at target"
},
"tailStyle": {
"type": "string",
"enum": ["classic", "stealth", "sharp", "open", "diamond", "circle", "none"],
"default": "none",
"description": "Arrowhead style at source"
},
"label": {
"type": "string",
"description": "Label text to display on the connector"
},
"curvature": {
"type": "number",
"minimum": 0.1,
"maximum": 1.0,
"default": 0.5,
"description": "Curve intensity for curved routing"
},
"boltEnabled": {
"type": "boolean",
"default": true,
"description": "Enable animated bolt effect along connector"
},
"boltColor": {
"type": "string",
"default": "#fbbf24",
"description": "Bolt animation color"
}
},
"required": ["sourceItemId", "targetItemId"]
}
Output:
{
"success": true,
"connectorId": "connector_1",
"sourceItemId": "item_1",
"targetItemId": "item_2",
"routing": "orthogonal"
}
pinepaper_connect_ports
Connect specific ports on items for precise connector placement.
Input Schema:
{
"type": "object",
"properties": {
"sourceItemId": {
"type": "string"
},
"sourcePort": {
"type": "string",
"enum": ["top", "bottom", "left", "right", "top-left", "top-right", "bottom-left", "bottom-right", "center", "start", "end"],
"description": "Port position on source item"
},
"targetItemId": {
"type": "string"
},
"targetPort": {
"type": "string",
"enum": ["top", "bottom", "left", "right", "top-left", "top-right", "bottom-left", "bottom-right", "center", "start", "end"],
"description": "Port position on target item"
},
"config": {
"type": "object",
"description": "Connector configuration (same as pinepaper_connect)"
}
},
"required": ["sourceItemId", "sourcePort", "targetItemId", "targetPort"]
}
pinepaper_add_ports
Add connection ports to an item.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Registry ID of the item"
},
"portType": {
"type": "string",
"enum": ["standard", "line", "path", "custom"],
"default": "standard",
"description": "Port configuration type"
},
"ports": {
"type": "array",
"description": "Custom port definitions (for portType='custom')",
"items": {
"type": "object",
"properties": {
"position": {
"type": "string",
"enum": ["top", "bottom", "left", "right", "top-left", "top-right", "bottom-left", "bottom-right", "center"]
},
"type": {
"type": "string",
"enum": ["input", "output", "both"],
"default": "both",
"description": "Port connection direction"
}
}
}
},
"count": {
"type": "number",
"description": "Number of ports (for portType='path')"
}
},
"required": ["itemId"]
}
Port Types:
| Type | Description | Ports Created |
|---|---|---|
standard |
4-way configuration (default) | top, bottom, left, right |
line |
For paths/lines | start, end |
path |
Distributed along closed path | Evenly spaced points |
custom |
User-defined ports | As specified in ports array |
pinepaper_auto_layout
Apply automatic layout algorithm to arrange diagram items.
Input Schema:
{
"type": "object",
"properties": {
"layoutType": {
"type": "string",
"enum": ["hierarchical", "force-directed", "tree", "radial", "grid"],
"description": "Layout algorithm to apply"
},
"itemIds": {
"type": "array",
"items": { "type": "string" },
"description": "Items to include (default: all items with ports)"
},
"options": {
"type": "object",
"properties": {
"direction": {
"type": "string",
"enum": ["TB", "BT", "LR", "RL"],
"default": "TB",
"description": "Flow direction (hierarchical/tree)"
},
"levelSpacing": {
"type": "number",
"default": 100,
"description": "Vertical spacing between levels"
},
"nodeSpacing": {
"type": "number",
"default": 80,
"description": "Horizontal spacing between nodes"
},
"iterations": {
"type": "number",
"default": 100,
"description": "Iterations for force-directed layout"
},
"attraction": {
"type": "number",
"default": 0.01,
"description": "Attraction force (force-directed)"
},
"repulsion": {
"type": "number",
"default": 1000,
"description": "Repulsion force (force-directed)"
},
"columns": {
"type": "number",
"description": "Number of columns (grid layout)"
},
"cellWidth": {
"type": "number",
"default": 150,
"description": "Cell width (grid layout)"
},
"cellHeight": {
"type": "number",
"default": 100,
"description": "Cell height (grid layout)"
},
"centerX": {
"type": "number",
"description": "Center X position (radial layout)"
},
"centerY": {
"type": "number",
"description": "Center Y position (radial layout)"
},
"startRadius": {
"type": "number",
"default": 100,
"description": "Starting radius (radial layout)"
},
"radiusStep": {
"type": "number",
"default": 80,
"description": "Radius increment per level (radial layout)"
}
}
}
},
"required": ["layoutType"]
}
Layout Types:
| Layout | Description | Best For |
|---|---|---|
hierarchical |
Layered top-to-bottom or left-to-right | Flowcharts, org charts |
force-directed |
Physics-based node positioning | Network diagrams |
tree |
Parent-child hierarchical layout | Family trees, file structures |
radial |
Concentric circles from center | Mind maps, radial hierarchies |
grid |
Regular grid arrangement | Inventory, galleries |
Output:
{
"success": true,
"layoutType": "hierarchical",
"itemsLayouted": 5,
"bounds": {
"x": 100,
"y": 50,
"width": 400,
"height": 500
}
}
pinepaper_get_diagram_shapes
Get available diagram shapes.
Input Schema:
{
"type": "object",
"properties": {
"category": {
"type": "string",
"enum": ["flowchart", "uml", "network", "basic"],
"description": "Filter by category (optional)"
}
}
}
Output:
{
"shapes": [
{
"id": "process",
"name": "Process",
"category": "flowchart",
"description": "Rectangle with rounded corners",
"defaultSize": { "width": 120, "height": 60 }
},
{
"id": "decision",
"name": "Decision",
"category": "flowchart",
"description": "Diamond shape for conditions",
"defaultSize": { "width": 100, "height": 100 }
}
]
}
pinepaper_update_connector
Update an existing connector’s style or configuration.
Input Schema:
{
"type": "object",
"properties": {
"connectorId": {
"type": "string",
"description": "Connector ID to update"
},
"style": {
"type": "object",
"properties": {
"lineColor": { "type": "string" },
"lineWidth": { "type": "number" },
"headStyle": { "type": "string" },
"routing": { "type": "string" }
}
},
"label": {
"type": "string",
"description": "Update connector label"
},
"labelPosition": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Label position along path (0-1)"
}
},
"required": ["connectorId"]
}
pinepaper_remove_connector
Remove a connector between items.
Input Schema:
{
"type": "object",
"properties": {
"connectorId": {
"type": "string",
"description": "Connector ID to remove"
}
},
"required": ["connectorId"]
}
pinepaper_diagram_mode
Control diagram mode activation and tool selection.
Input Schema:
{
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": ["activate", "deactivate", "toggle", "setMode"],
"description": "Diagram mode action"
},
"mode": {
"type": "string",
"enum": ["select", "connect", "shape", "pan"],
"description": "Tool mode (for setMode action)"
},
"shapeType": {
"type": "string",
"description": "Shape to place (for mode='shape')"
}
},
"required": ["action"]
}
Output:
{
"success": true,
"isActive": true,
"currentMode": "connect"
}
Relation Tools
Relations are the primary mechanism for creating declarative animations.
pinepaper_add_relation
Create a behavior relationship between two items.
Input Schema:
{
"type": "object",
"properties": {
"sourceId": {
"type": "string",
"description": "Registry ID of the source item (the item that will be affected)"
},
"targetId": {
"type": "string",
"description": "Registry ID of the target item (the item being related to, can be null for self-animations)"
},
"relationType": {
"type": "string",
"enum": [
"orbits", "follows", "attached_to", "maintains_distance", "points_at", "mirrors", "parallax", "bounds_to", "animates",
"grows_from", "staggered_with", "indicates", "circumscribes", "wave_through", "camera_follows", "camera_animates", "morphs_to",
"group_morphs_to", "moves_along_path",
"on_top_of", "below", "beside", "inside", "centered_on", "aligned_with",
"bone_attached", "ik_target", "blend_reacts_to", "blend_transition",
"on_click_fire", "on_pointer_enter_fire", "on_pointer_exit_fire", "on_key_fire",
"on_event_set_property", "on_event_set_property_from_template",
"on_event_set_visibility", "on_event_set_color",
"on_event_set_data", "on_event_increment", "on_event_toggle",
"on_event_set_active", "on_event_fire_after",
"on_event_add_relation", "on_event_remove_relation",
"exclusive_group", "menubar_group",
"on_enter_set_property", "on_enter_set_visibility", "on_enter_set_color",
"on_enter_set_data", "on_enter_increment", "on_enter_toggle",
"on_exit_set_property", "on_exit_set_visibility", "on_exit_set_color",
"on_exit_set_data", "on_exit_increment", "on_exit_toggle"
],
"description": "Type of relationship"
},
"params": {
"type": "object",
"description": "Relation-specific parameters"
}
},
"required": ["sourceId", "relationType"]
}
Core Relation Parameters:
| Relation | Parameters |
|---|---|
orbits |
radius (number), speed (number), direction (‘clockwise’/‘counterclockwise’), phase (number) |
follows |
offset ([x, y]), smoothing (0-1), delay (seconds) |
attached_to |
offset ([x, y]), inherit_rotation (boolean) |
maintains_distance |
distance (pixels), strength (0-1) |
points_at |
offset_angle (degrees), smoothing (0-1) |
mirrors |
axis (‘vertical’/‘horizontal’/‘both’), center ([x, y]) |
parallax |
depth (0-1), origin ([x, y]) |
bounds_to |
padding (pixels), bounce (boolean) |
animates |
keyframes (array), duration (seconds), loop (boolean) |
| All relations | startTime (seconds), endTime (seconds), autoRemove (boolean) — time-scoping parameters |
Manim-Inspired Animation Relations:
| Relation | Description | Parameters |
|---|---|---|
grows_from |
Item scales from zero to full size (like Manim GrowFromPoint) | origin (‘center’/‘top’/‘bottom’/‘left’/‘right’/‘topLeft’/‘topRight’/‘bottomLeft’/‘bottomRight’), duration (seconds), delay (seconds), easing |
staggered_with |
Staggered animation timing for groups (like Manim LaggedStart) | index (0-based position), stagger (delay between items in seconds), effect (‘fadeIn’/‘fadeOut’/‘growIn’/‘slideIn’/‘popIn’) |
indicates |
Temporary highlight effect (like Manim Indicate) | scale (max scale during indication), color (highlight color), duration (seconds), delay (seconds), repeat (number of times) |
circumscribes |
Draw temporary shape around target (like Manim Circumscribe) | shape (‘rectangle’/‘circle’/‘ellipse’), color (stroke color), strokeWidth, padding, duration (seconds), fadeOut (boolean) |
wave_through |
Send wave distortion through item (like Manim ApplyWave) | amplitude (pixels), frequency (cycles), direction (‘horizontal’/‘vertical’), duration (seconds), delay (seconds) |
camera_follows |
View pans to follow target (like Manim MovingCameraScene) | smoothing (0-1), offset ([x, y]), zoom (level), deadzone (pixels), bounds ({minX, maxX, minY, maxY}) |
camera_animates |
Keyframe-based camera zoom, pan, and 3D tilt animation. For orbit-style camera (revolving around a subject), add keyframes around the pivot with pathMode: 'arc' + pivot + optional arcDirection. |
keyframes (array of {time, zoom, focus, pitch, yaw, easing, pathOut, pathIn, pathMode, pivot, arcDirection, path} — focus accepts [x,y], an item id, or {item, offset} and is resolved live against the scene graph so the camera tracks items as they move; legacy center: [x,y] still honored when focus is absent; inter-keyframe path defaults to linear but can curve via pathOut/pathIn bezier handles, pathMode: 'arc' with pivot + optional `arcDirection: ‘ccw’ |
morphs_to |
Shape morphing animation (like Manim Transform). Mode is auto-picked from the source/target item type pair (segments for Path→Path, Circle→Circle, Text→Text; denoising for CompoundPath, Group, or cross-type pairs — samples 48 points along each item, animates a proxy polyline, emits a transient particle group). Source and target should be at different canvas positions — position is one of the interpolated channels. The relation drives opacity, visible, and position on both endpoints during the morph window; do not stack visibility/opacity keyframes on either. Single source-target pair (only one morphs_to per source). Pass loop: true to replay each timeline loop. |
duration (seconds), delay (seconds), easing, morphColor (boolean), morphSize (boolean), hideTarget (boolean, default true; set false to keep both items visible during the morph), removeTargetOnComplete (boolean), loop (boolean — replay on timeline loop) |
group_morphs_to |
Pair-by-index group morph. Source paper.Group’s children migrate into target paper.Group’s children’s positions. Path.Line children deform via segment endpoints (so a line whose endpoints map to two different target positions visibly bends frame by frame); other items translate via item.position. Excess children on either side fade at home positions. Looping cycles source ↔ target indefinitely. State stays in a module-local WeakMap (no hidden item.data._* cache fields). Snapshot is captured on first apply — to pick up user edits to child positions, remove and re-add the relation. Generic across any two paper.Group items: graph vertices+edges, letter collages, dashboard clusters all work with the same call shape. |
duration (seconds, each direction), hold (seconds, hold on each end before reversing), loop (boolean), easing (linear/easeIn/easeOut/easeInOut), deformLines (boolean) |
moves_along_path |
Self-relation (targetId: null). Item moves along a custom path stored in params.path. Editor UI offers a drag-to-draw capture in the Relations picker; via MCP / agent code, pass the points array explicitly. Closed paths loop; open paths clamp at the end. The easing param controls the time-to-progress curve including a non-monotonic pingpong option for back-and-forth motion without redrawing the path. |
path (array of {x,y} or [x,y] tuples — required), speed (number — 1 ≈ 150 px/s), closed (boolean), phase (number 0–1), easing (linear/easeIn/easeOut/easeInOut/sine/bounce/pingpong) |
Structural layout relations (S12-E1):
Place a dependent item relative to a target’s bounds (stacking / adjacency / containment / alignment). The dependent needs no coordinates and rides the target when it moves. Deterministic (pure bounds arithmetic). Convenience methods: moveAbove, moveBelow, moveLeftOf, moveRightOf.
| Relation | Description | Parameters |
|---|---|---|
on_top_of |
Source bottom edge sits on target top edge (e.g. a cocktail on a bar) | gap (px between edges), align (‘left’/‘center’/‘right’), overhang (signed px) |
below |
Source top edge sits on target bottom edge (mirror of on_top_of) | gap, align (‘left’/‘center’/‘right’), overhang |
beside |
Source flanks the target horizontally | side (‘left’/‘right’), gap, align (‘top’/‘center’/‘bottom’) |
inside |
Source placed fully inside target bounds (places, vs contained_in_place which clamps) |
anchor (‘center’/‘top-left’/‘top’/‘top-right’/‘left’/‘right’/‘bottom-left’/‘bottom’/‘bottom-right’), padding (px) |
centered_on |
Source center = target center + offset (concentric when offset is 0 — use for concentric rings) | offsetX, offsetY |
aligned_with |
Aligns one axis of the source center to the target; the other axis stays free (partial write) | axis (‘x’/‘y’, required), offset |
Two structural relations writing the same axis on one source conflict (last-writer-wins) → the validator emits a
STRUCTURAL_CONFLICTwarning.aligned_withon a disjoint axis is legal.
Rigging Relations (v0.4):
| Relation | Description | Parameters |
|---|---|---|
bone_attached |
Item follows a bone’s world transform (priority -10, runs before standard relations) | skeletonId (string), boneId (string), offset ([x, y]), inheritRotation (boolean), attachPoint (0=joint, 1=tip) |
ik_target |
Item acts as IK solver target pulling a bone chain (priority -20) | skeletonId (string), chainId (string), strength (0-1, FK/IK blend) |
Blending Relations (v0.4):
| Relation | Description | Parameters |
|---|---|---|
blend_reacts_to |
Proximity-based blend mode/opacity changes | proximityRadius (pixels), activeMode (blend mode), inactiveMode (blend mode), activeOpacity (0-1), inactiveOpacity (0-1), smoothing (0-1) |
blend_transition |
Automatic time-based blend mode cycling | modes (string[]), opacities (number[]), cycleDuration (seconds), easing |
Event-Channel Relations (v0.5.3) — interactive state machines:
Edge-triggered relations that compose into state machines, toggles, timed effects, and WAI-ARIA-compliant accessibility patterns. The same graph drives visual behavior and accessibility — see Event-Channel Relations docs for the full architecture.
Producers — interaction → event pulse:
| Relation | Description | Parameters |
|---|---|---|
on_click_fire |
Source clicked → pulse target pp:Event |
payload? (any) |
on_pointer_enter_fire |
Pointer enters source bounds → pulse target | payload? |
on_pointer_exit_fire |
Pointer leaves source bounds → pulse target | payload? |
on_key_fire |
Key pressed → pulse target | key (string, required), modifiers? ({ctrl?, shift?, alt?, meta?}), global? (boolean — fire regardless of focus), preventDefault? (default true), payload? |
Reactions — event pulse → side effect on target item:
| Relation | Description | Parameters |
|---|---|---|
on_event_set_property |
Set target[property] = value |
property (string), value (any) |
on_event_set_property_from_template |
Set target[property] to a template-interpolated string. {key} tokens resolve from target.data[key] (default) or target[key] (with source: 'item'). Closes the derived-text gap — pair with on_event_increment on the same channel to bind a visible counter label to the underlying data field. |
property (string), template (string with {key} tokens), source? (‘data’ | ‘item’) |
on_event_set_visibility |
Set target.visible |
visible? (default true) |
on_event_set_color |
Set fillColor or strokeColor |
color (string), which? (‘fill’ default | ‘stroke’) |
on_event_set_data |
Set target.data[property] = value |
property, value |
on_event_increment |
Numeric increment on target.data[property] |
property, by? (default 1) |
on_event_toggle |
Flip target.visible or target.data[property] |
property? (default ‘visible’) |
on_event_set_active |
Mutex activation (deactivates exclusive_group siblings) |
(none — uses target’s group membership) |
on_event_fire_after |
Schedule delayed pulse of another event | delay (ms), timeline? (‘wall’ default | ‘canvas’ for timeline-synced) |
on_event_add_relation |
Meta: graph adds a relation on target | type (relation name), target?, params? |
on_event_remove_relation |
Meta: graph removes a relation on target | type, target? |
Mutex + lifecycle:
| Relation | Description | Parameters |
|---|---|---|
exclusive_group |
Two items share a slot — at most one active at a time. Pairwise edges form the group. | groupName (string) |
menubar_group |
Two items share a horizontal nav cluster (toolbar / app menu bar). Pure grouping — no mutex, no _isActive state. |
groupName (string) |
on_enter_* |
Edge-triggered side effect when source becomes the active member of its exclusive_group. Variants mirror on_event_* (set_property / set_visibility / set_color / set_data / increment / toggle). |
Same as the on_event_* equivalent |
on_exit_* |
Edge-triggered side effect when source stops being the active member. | Same as on_event_* |
A11y auto-detection: the matcher walks the relation graph and promotes three canonical shapes:
- Tablist —
exclusive_group+on_enter_set_visibility(vertical/horizontal arrow keys + auto-activation on focus) - Accordion —
on_click_fire+on_event_toggle(visible)on ≥2 disclosure pairs withoutexclusive_group(Arrow Up/Down between headers, multiple panels can be open) - Menubar —
menubar_groupon ≥2 items (horizontal Arrow Left/Right + Home/End + Enter/Space; arrow keys move focus WITHOUT activating, per WAI-ARIA APG)
Promoted items get the right role="...", ARIA attributes, roving tabindex, and keyboard handlers in PinePaper’s accessibility shadow DOM — no aria-* attributes ever appear in your scene description.
Output:
{
"success": true,
"sourceId": "item_1",
"targetId": "item_2",
"relationType": "orbits"
}
pinepaper_replace_relation
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Atomically replace a relation (remove + add with fresh params). Unlike pinepaper_add_relation which merges params, this fully replaces them.
Input Schema:
Same as pinepaper_add_relation.
Output:
{
"success": true,
"sourceId": "item_1",
"targetId": "item_2",
"relationType": "orbits"
}
pinepaper_remove_relation
Remove a relationship between items.
Input Schema:
{
"type": "object",
"properties": {
"sourceId": {
"type": "string"
},
"targetId": {
"type": "string"
},
"relationType": {
"type": "string",
"description": "Optional: specific relation type to remove"
}
},
"required": ["sourceId", "targetId"]
}
pinepaper_query_relations
Query relationships for an item.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Item to query relations for"
},
"relationType": {
"type": "string",
"description": "Optional: filter by relation type"
},
"direction": {
"type": "string",
"enum": ["outgoing", "incoming"],
"description": "outgoing = from item, incoming = to item"
}
},
"required": ["itemId"]
}
Output:
{
"relations": [
{
"sourceId": "item_1",
"targetId": "item_2",
"relationType": "orbits",
"params": { "radius": 100, "speed": 0.5 }
}
]
}
Animation Tools
pinepaper_animate
Apply a simple animation to an item.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string"
},
"animationType": {
"type": "string",
"enum": ["pulse", "rotate", "bounce", "fade", "wobble", "slide", "typewriter", "shake", "swing", "jelly", "glow"]
},
"speed": {
"type": "number",
"description": "Animation speed multiplier (default: 1.0)"
}
},
"required": ["itemId", "animationType"]
}
pinepaper_keyframe_animate
Apply keyframe-based animation.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string"
},
"keyframes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"time": { "type": "number", "description": "Time in seconds" },
"properties": { "type": "object", "description": "Property values at this keyframe" },
"easing": { "type": "string", "enum": ["linear", "easeIn", "easeOut", "easeInOut", "bounce", "elastic"] }
}
}
},
"duration": {
"type": "number",
"description": "Total animation duration in seconds"
},
"loop": {
"type": "boolean"
},
"timeOffset": {
"type": "number",
"description": "Offset in seconds — delays this item's keyframe start relative to global timeline"
},
"relationBehavior": {
"type": "string",
"enum": ["override", "keyframeFirst"],
"description": "How relations interact with keyframes. 'keyframeFirst' pauses relations during playback."
}
},
"required": ["itemId", "keyframes"]
}
Keyframe Properties:
| Property | Type | Description |
|---|---|---|
position |
[x, y] | Item position |
x, y |
number | Individual coordinates |
width |
number | Width in pixels (absolute sizing) |
height |
number | Height in pixels (absolute sizing) |
scale |
number | Uniform scale |
scaleX, scaleY |
number | Separate axis scaling |
rotation |
number | Rotation in degrees |
opacity |
number | Transparency (0-1) |
fillColor |
string | Fill color |
strokeColor |
string | Stroke color |
fontSize |
number | Text size |
pinepaper_play_timeline
Control keyframe playback.
Input Schema:
{
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": ["play", "stop", "seek"]
},
"duration": {
"type": "number",
"description": "Duration for play action"
},
"loop": {
"type": "boolean"
},
"time": {
"type": "number",
"description": "Time to seek to"
}
},
"required": ["action"]
}
Camera Tools
Animate camera zoom and pan for cinematic effects.
pinepaper_camera_animate
Animate camera with a keyframe-based zoom, pan, and 3D tilt sequence. Keyframes can include pitch and yaw for cinematic 3D perspective via PinePaper’s equirectangular projection pipeline. For an orbit-style camera (revolving around a subject), add 4-8 keyframes around the pivot with pathMode: 'arc' + pivot + optional arcDirection: 'ccw'|'cw' on each segment.
Input Schema:
{
"type": "object",
"properties": {
"keyframes": {
"type": "array",
"description": "Array of camera keyframes",
"items": {
"type": "object",
"properties": {
"time": { "type": "number", "description": "Time in seconds" },
"zoom": { "type": "number", "description": "Zoom level (1=normal, 2=2x zoom in)" },
"center": { "type": "array", "items": { "type": "number" }, "description": "View center [x, y]" },
"pitch": { "type": "number", "description": "Camera tilt in degrees (0=flat, positive=tilt forward). Uses 3D projection" },
"yaw": { "type": "number", "description": "Camera rotation in degrees. Uses 3D projection" },
"easing": { "type": "string", "enum": ["linear", "easeIn", "easeOut", "easeInOut", "bounce", "elastic"] }
}
}
},
"pitch": {
"type": "number",
"default": 0,
"description": "Global camera tilt in degrees. Applied when not using per-keyframe pitch"
},
"yaw": {
"type": "number",
"default": 0,
"description": "Global camera rotation in degrees. Applied when not using per-keyframe yaw"
},
"fov": {
"type": "number",
"default": 60,
"description": "Field of view in degrees for 3D perspective projection"
},
"duration": {
"type": "number",
"description": "Total animation duration in seconds"
},
"loop": {
"type": "boolean",
"description": "Loop the animation"
},
"delay": {
"type": "number",
"description": "Delay before animation starts"
}
},
"required": ["duration"]
}
Example - Cinematic zoom with 3D tilt:
{
"duration": 6,
"loop": true,
"keyframes": [
{ "time": 0, "zoom": 1, "center": [400, 300], "pitch": 0, "yaw": 0 },
{ "time": 2, "zoom": 2.5, "center": [200, 350], "pitch": 15, "yaw": -8, "easing": "easeInOut" },
{ "time": 4, "zoom": 2.5, "center": [200, 350], "pitch": 15, "yaw": -8 },
{ "time": 6, "zoom": 1, "center": [400, 300], "pitch": 0, "yaw": 0, "easing": "easeInOut" }
]
}
Example - “Fly-to” with two keyframes (equivalent to the legacy fly_to mode):
{
"duration": 1.5,
"keyframes": [
{ "time": 0, "zoom": 1, "center": [400, 300], "pitch": 0, "easing": "easeInOut" },
{ "time": 1.5, "zoom": 3, "center": [200, 350], "pitch": 12 }
]
}
Output:
{
"success": true,
"isAnimating": true
}
Notes:
- Pitch/yaw use CSS
perspective+rotateX/rotateYfor GPU-accelerated 3D compositing - Routes through PinePaper’s own equirectangular 3D projection pipeline (not Three.js)
- Pitch 0° = flat canvas, 90° = top-down view
- When pitch/yaw return to 0, the 3D transform is removed (pure 2D)
pinepaper_camera_direct (spec — story “director”)
High-level alternative to pinepaper_camera_animate: author a shot list and
the engine compiles it to camera_animates keyframes per render target so the
framing is WYSIWYG between editor preview and any export size (it computes
zoom = viewW / worldWindow for the active target — an agent emitting raw zoom
cannot do this without knowing the editor view width). Pass autoDirect: true
(no shots) to generate one shot per top-level item in reading order.
Input Schema:
{
"type": "object",
"properties": {
"shots": {
"type": "array",
"description": "Ordered shot list. Omit with autoDirect:true to auto-generate.",
"items": {
"type": "object",
"properties": {
"subjects": { "description": "'everything' or an array of item ids (union-framed)" },
"framing": { "description": "'tight' | 'medium' | 'wide' | number (0,1] fill fraction" },
"hold": { "type": "number", "description": "Dwell seconds" },
"moveIn": { "type": "string", "enum": ["pan", "push-in", "pull-back", "whip", "cut"] },
"ease": { "type": "string", "enum": ["smooth", "linear", "settle", "snap"] },
"kenBurns": { "type": "boolean", "description": "Slow push + pan during the hold" }
}
}
},
"autoDirect": { "type": "boolean", "description": "Generate shots geometrically (reading order)" },
"order": { "type": "string", "enum": ["reading", "creation", "reverse"], "default": "reading" },
"establishing": { "type": "boolean", "description": "Bookend with a wide establishing + closing shot" },
"loop": { "type": "boolean", "default": false }
}
}
Maps to PinePaper.applyDirectorShots(shots, opts) / PinePaper.autoDirectStory(opts).
Stores intent on camera_animates.params._director; exportStoryVideo recompiles
it for the export target. Non-destructive (only the undoable camera relation).
pinepaper_camera_zoom
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Simple zoom animation.
Input Schema:
{
"type": "object",
"properties": {
"direction": {
"type": "string",
"enum": ["in", "out"],
"description": "Zoom direction"
},
"level": {
"type": "number",
"description": "Target zoom level (default: 2 for in, 0.5 for out)"
},
"duration": {
"type": "number",
"description": "Animation duration in seconds (default: 0.5)"
}
},
"required": ["direction"]
}
Output:
{
"success": true,
"fromZoom": 1,
"toZoom": 2
}
pinepaper_camera_pan
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Pan camera in a direction or to specific coordinates.
Input Schema:
{
"type": "object",
"properties": {
"direction": {
"type": "string",
"enum": ["left", "right", "up", "down"],
"description": "Pan direction (use with amount)"
},
"amount": {
"type": "number",
"description": "Pixels to pan (default: 100)"
},
"x": {
"type": "number",
"description": "Target X coordinate (use with y for panTo)"
},
"y": {
"type": "number",
"description": "Target Y coordinate (use with x for panTo)"
},
"duration": {
"type": "number",
"description": "Animation duration in seconds (default: 0.5)"
}
}
}
Examples:
// Pan left 200 pixels
{ "direction": "left", "amount": 200 }
// Pan to specific coordinates
{ "x": 200, "y": 200, "duration": 1 }
Output:
{
"success": true,
"fromCenter": [400, 300],
"toCenter": [200, 200]
}
pinepaper_camera_move_to
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Combined zoom and pan to a specific location.
Input Schema:
{
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "Target X coordinate"
},
"y": {
"type": "number",
"description": "Target Y coordinate"
},
"zoom": {
"type": "number",
"description": "Target zoom level"
},
"duration": {
"type": "number",
"description": "Animation duration in seconds (default: 0.5)"
}
},
"required": ["x", "y", "zoom"]
}
Output:
{
"success": true,
"toCenter": [200, 200],
"toZoom": 2
}
pinepaper_camera_reset
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Reset camera to default state (center of canvas, zoom 1).
Input Schema:
{
"type": "object",
"properties": {
"duration": {
"type": "number",
"description": "Animation duration in seconds (default: 0.5)"
}
}
}
Output:
{
"success": true,
"toCenter": [400, 300],
"toZoom": 1
}
pinepaper_camera_stop
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Stop current camera animation.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"wasAnimating": true
}
pinepaper_camera_state
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Get current camera state.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"zoom": 1.5,
"center": [400, 300],
"isAnimating": false
}
Mask Tools
Apply clipping masks and animated reveal effects to items.
pinepaper_apply_animated_mask
Apply an animated mask reveal to an item. Supports three usage modes for maximum flexibility.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Registry ID of the item to mask"
},
"preset": {
"type": "string",
"enum": ["wipeLeft", "wipeRight", "wipeUp", "wipeDown", "iris", "irisOut", "star", "heart", "curtainHorizontal", "curtainVertical", "cinematic", "diagonalWipe", "revealUp", "revealDown"],
"description": "Animation preset name (Mode 1 & 3)"
},
"maskType": {
"type": "string",
"enum": ["rectangle", "circle", "ellipse", "star", "triangle", "hexagon", "heart", "rounded"],
"description": "Mask shape type (Mode 2 - full control)"
},
"keyframes": {
"type": "array",
"description": "Custom keyframes array (Mode 2 & 3)",
"items": {
"type": "object",
"properties": {
"time": { "type": "number", "description": "Normalized time (0-1)" },
"properties": {
"type": "object",
"description": "Mask properties at this keyframe",
"properties": {
"x": { "type": "number" },
"y": { "type": "number" },
"width": { "type": "number" },
"height": { "type": "number" },
"radius": { "type": "number" },
"scale": { "type": "number" },
"rotation": { "type": "number" },
"opacity": { "type": "number" }
}
},
"easing": {
"type": "string",
"enum": ["linear", "easeIn", "easeOut", "easeInOut", "bounce", "elastic"]
}
},
"required": ["time", "properties"]
}
},
"options": {
"type": "object",
"description": "Animation options (Mode 1)",
"properties": {
"startTime": { "type": "number", "description": "Start time in seconds", "default": 0 },
"duration": { "type": "number", "description": "Duration in seconds", "default": 0.8 },
"easing": { "type": "string", "enum": ["linear", "easeIn", "easeOut", "easeInOut", "bounce"], "default": "easeOut" },
"reversed": { "type": "boolean", "description": "Reverse animation (hide instead of reveal)", "default": false },
"loop": { "type": "boolean", "description": "Loop the animation", "default": false }
}
},
"maskOptions": {
"type": "object",
"description": "Mask shape options (for star, etc.)",
"properties": {
"points": { "type": "number", "description": "Number of points (star mask)" },
"innerRadius": { "type": "number", "description": "Inner radius ratio (star mask)" }
}
}
},
"required": ["itemId"]
}
Usage Modes:
| Mode | Description | Required Fields |
|---|---|---|
| 1. Preset | Use animation preset with options | preset, options |
| 2. Full Control | Define exact keyframes | maskType, keyframes |
| 3. Hybrid | Preset with keyframe override | preset, keyframes |
Animation Presets:
| Preset | Effect | Mask Type |
|---|---|---|
wipeLeft |
Reveals from left to right | Rectangle |
wipeRight |
Reveals from right to left | Rectangle |
wipeUp |
Reveals from bottom to top | Rectangle |
wipeDown |
Reveals from top to bottom | Rectangle |
iris |
Circle expands from center | Circle |
irisOut |
Circle shrinks to center | Circle |
star |
Star shape scales up | Star |
heart |
Heart shape scales up | Heart |
curtainHorizontal |
Opens from center horizontally | Rectangle pair |
curtainVertical |
Opens from center vertically | Rectangle pair |
cinematic |
Letterbox bars animate | Rectangle pair |
diagonalWipe |
Angled reveal from corner | Rectangle |
revealUp |
Text slides up within mask | Rectangle |
revealDown |
Text slides down within mask | Rectangle |
Examples:
Mode 1 - Preset with options:
{
"itemId": "item_1",
"preset": "wipeLeft",
"options": {
"startTime": 0,
"duration": 0.5,
"easing": "easeOut"
}
}
Mode 2 - Full keyframe control:
{
"itemId": "item_1",
"maskType": "rectangle",
"keyframes": [
{ "time": 0, "properties": { "x": 200, "y": 250, "width": 0, "height": 100 }, "easing": "linear" },
{ "time": 0.25, "properties": { "x": 200, "y": 250, "width": 50, "height": 100 }, "easing": "easeIn" },
{ "time": 0.75, "properties": { "x": 200, "y": 250, "width": 150, "height": 100 }, "easing": "easeOut" },
{ "time": 1, "properties": { "x": 200, "y": 250, "width": 200, "height": 100 } }
]
}
Mode 3 - Preset with keyframe override:
{
"itemId": "item_1",
"preset": "iris",
"keyframes": [
{ "time": 0, "properties": { "scale": 0.01 }, "easing": "linear" },
{ "time": 0.3, "properties": { "scale": 0.3 }, "easing": "easeIn" },
{ "time": 0.6, "properties": { "scale": 0.7 }, "easing": "easeOut" },
{ "time": 1, "properties": { "scale": 1 }, "easing": "bounce" }
]
}
Output:
{
"success": true,
"itemId": "item_1",
"maskType": "rectangle",
"animated": true,
"keyframeCount": 4
}
pinepaper_apply_custom_mask
Direct helper for applying custom keyframe-based masks.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Registry ID of the item to mask"
},
"maskType": {
"type": "string",
"enum": ["rectangle", "circle", "ellipse", "star", "triangle", "hexagon", "heart", "rounded"],
"description": "Mask shape type"
},
"keyframes": {
"type": "array",
"description": "Keyframes defining the animation",
"items": {
"type": "object",
"properties": {
"time": { "type": "number" },
"properties": { "type": "object" },
"easing": { "type": "string" }
}
}
},
"maskOptions": {
"type": "object",
"description": "Mask shape options",
"properties": {
"points": { "type": "number" },
"innerRadius": { "type": "number" }
}
}
},
"required": ["itemId", "maskType", "keyframes"]
}
Example:
{
"itemId": "item_1",
"maskType": "star",
"keyframes": [
{ "time": 0, "properties": { "scale": 0 }, "easing": "linear" },
{ "time": 0.5, "properties": { "scale": 0.5 }, "easing": "easeIn" },
{ "time": 1, "properties": { "scale": 1 }, "easing": "easeOut" }
],
"maskOptions": { "points": 6, "innerRadius": 0.4 }
}
pinepaper_remove_mask
Remove mask from an item, restoring original.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Registry ID of the masked item"
}
},
"required": ["itemId"]
}
pinepaper_get_animatable_properties
Get animatable properties for each mask type. Useful for building custom keyframe animations.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"rectangle": {
"properties": ["x", "y", "width", "height", "rotation", "opacity"],
"description": "Rectangular mask with position and size"
},
"circle": {
"properties": ["x", "y", "radius", "scale", "opacity"],
"description": "Circular mask with center and radius"
},
"ellipse": {
"properties": ["x", "y", "radiusX", "radiusY", "rotation", "scale", "opacity"],
"description": "Elliptical mask with separate radii"
},
"star": {
"properties": ["x", "y", "radius", "scale", "rotation", "opacity"],
"description": "Star mask with configurable points"
},
"heart": {
"properties": ["x", "y", "scale", "rotation", "opacity"],
"description": "Heart-shaped mask"
}
}
pinepaper_get_available_easings
Get list of available easing functions for mask animations.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"easings": ["linear", "easeIn", "easeOut", "easeInOut", "bounce", "elastic"],
"descriptions": {
"linear": "Constant speed",
"easeIn": "Slow start, fast end",
"easeOut": "Fast start, slow end",
"easeInOut": "Slow start and end",
"bounce": "Bouncing effect at end",
"elastic": "Spring-like overshoot"
}
}
pinepaper_get_mask_types
Get available mask types.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"maskTypes": ["rectangle", "circle", "ellipse", "star", "triangle", "hexagon", "heart", "rounded", "custom"]
}
pinepaper_get_mask_animations
Get available mask animation presets.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"animations": [
"wipeLeft", "wipeRight", "wipeUp", "wipeDown",
"iris", "irisOut",
"star", "heart",
"curtainHorizontal", "curtainVertical", "cinematic",
"diagonalWipe",
"revealUp", "revealDown"
]
}
Generator Tools
pinepaper_execute_generator
Execute a background generator.
Input Schema:
{
"type": "object",
"properties": {
"generatorName": {
"type": "string",
"enum": ["drawSunburst", "drawSunsetScene", "drawGrid", "drawStackedCircles", "drawCircuit", "drawWaves", "drawPattern", "drawSolarSystem", "drawDayNightCycle"]
},
"params": {
"type": "object",
"description": "Generator-specific parameters"
}
},
"required": ["generatorName"]
}
Generator Parameters:
| Generator | Key Parameters |
|---|---|
drawSunburst |
rayCount, colors (array), bgColor |
drawSunsetScene |
skyColors (array), cloudCount |
drawGrid |
gridType (‘lines’/‘dots’/‘squares’), spacing, lineColor, bgColor |
drawStackedCircles |
count, colors, distribution (‘poisson’/‘golden’/‘random’) |
drawWaves |
waveCount, colors |
drawSolarSystem |
sunSize, sunColor, showOrbits, orbitColor, speedMultiplier, showLabels, bgColor |
drawDayNightCycle |
cycleEnabled, cycleDuration, startPhase, showSun, sunSize, showMoon, moonSize, showStars, starCount, showClouds, cloudCount |
Solar System Generator Details:
The drawSolarSystem generator creates an interactive solar system with:
- All 8 planets with real orbital eccentricity (elliptical orbits)
- Kepler’s laws for realistic orbital motion (faster at perihelion, slower at aphelion)
- Sun and planets are selectable and draggable
- Moving the Sun moves the entire system (planets and orbits follow)
- Orbit paths are decorative (non-selectable)
Planet Data Flags:
- Planets have
data.selectable = trueanddata.isDraggable = true - Orbits have
data.isDecorative = true(not selectable) - Sun has
data.isSun = true, planets havedata.isPlanet = true
pinepaper_list_generators
Get available generators and their parameter schemas.
Output:
{
"generators": [
{
"name": "drawSunburst",
"displayName": "Sunburst",
"category": "patterns",
"params": {
"rayCount": { "type": "number", "default": 16 },
"colors": { "type": "array", "default": ["#FF6B6B", "#4ECDC4"] }
}
}
]
}
Map Tools
Create data-driven geographic visualizations with interactive maps.
pinepaper_load_map
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Load a geographic map onto the canvas with specified projection and styling.
Input Schema:
{
"type": "object",
"properties": {
"mapId": {
"type": "string",
"enum": ["world", "worldHighRes", "usa"],
"description": "Map to load (world=110m, worldHighRes=50m professional quality, usa=US states)"
},
"projection": {
"type": "string",
"enum": ["mercator", "equalEarth", "naturalEarth", "orthographic", "albers", "stereographic"],
"default": "naturalEarth",
"description": "Map projection type"
},
"quality": {
"type": "string",
"enum": ["fast", "balanced", "professional"],
"default": "balanced",
"description": "Rendering quality (professional=no simplification, best for multi-polygon countries)"
},
"fillColor": {
"type": "string",
"default": "#e5e7eb",
"description": "Default fill color for regions"
},
"strokeColor": {
"type": "string",
"default": "#9ca3af",
"description": "Border/stroke color"
},
"strokeWidth": {
"type": "number",
"default": 0.5,
"description": "Border width in pixels"
},
"scale": {
"type": "number",
"description": "Scale multiplier"
},
"center": {
"type": "array",
"items": { "type": "number" },
"description": "Center coordinates [longitude, latitude]"
},
"rotate": {
"type": "array",
"items": { "type": "number" },
"description": "Rotation angles [x, y, z]"
},
"enableHover": {
"type": "boolean",
"default": false,
"description": "Enable hover effects on regions"
},
"enableClick": {
"type": "boolean",
"default": false,
"description": "Enable click events on regions"
},
"hoverFill": {
"type": "string",
"description": "Fill color on hover"
},
"hoverStroke": {
"type": "string",
"description": "Stroke color on hover"
}
},
"required": ["mapId"]
}
Output:
{
"success": true,
"mapId": "worldHighRes",
"regionCount": 177,
"bounds": { "x": 50, "y": 100, "width": 700, "height": 400 }
}
pinepaper_highlight_regions
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Highlight specific regions on a loaded map.
Input Schema:
{
"type": "object",
"properties": {
"regionIds": {
"type": "array",
"items": { "type": "string" },
"description": "Array of region IDs to highlight"
},
"fillColor": {
"type": "string",
"default": "#22c55e",
"description": "Highlight fill color"
},
"strokeColor": {
"type": "string",
"description": "Highlight stroke color"
},
"strokeWidth": {
"type": "number",
"description": "Highlight stroke width"
},
"animate": {
"type": "boolean",
"default": false,
"description": "Animate the highlight transition"
}
},
"required": ["regionIds"]
}
Region ID Formats:
| Map | ID Format | Examples |
|---|---|---|
world, worldHighRes |
Full country names | “United States of America”, “France”, “Japan”, “Russian Federation” |
usa |
State codes | “CA”, “TX”, “NY”, “FL” |
Output:
{
"success": true,
"highlighted": ["United States of America", "Canada", "Mexico"],
"notFound": []
}
pinepaper_unhighlight_regions
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Remove highlights from specific regions.
Input Schema:
{
"type": "object",
"properties": {
"regionIds": {
"type": "array",
"items": { "type": "string" },
"description": "Array of region IDs to unhighlight (omit for all)"
}
}
}
pinepaper_apply_data_colors
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply data-driven coloring to map regions (choropleth visualization).
Input Schema:
{
"type": "object",
"properties": {
"data": {
"type": "object",
"description": "Object mapping region IDs to numeric values",
"additionalProperties": { "type": "number" }
},
"colorScale": {
"type": "string",
"enum": ["blues", "greens", "reds", "oranges", "purples", "heat", "viridis"],
"default": "blues",
"description": "Color scale to use"
},
"minValue": {
"type": "number",
"description": "Minimum value for color scale (auto-detected if omitted)"
},
"maxValue": {
"type": "number",
"description": "Maximum value for color scale (auto-detected if omitted)"
},
"showLegend": {
"type": "boolean",
"default": true,
"description": "Show color legend"
},
"legendPosition": {
"type": "string",
"enum": ["top-left", "top-right", "bottom-left", "bottom-right"],
"default": "bottom-right",
"description": "Legend position"
},
"legendTitle": {
"type": "string",
"description": "Legend title text"
}
},
"required": ["data"]
}
Example:
{
"data": {
"California": 39538223,
"Texas": 29145505,
"Florida": 21538187,
"New York": 20201249
},
"colorScale": "blues",
"showLegend": true,
"legendTitle": "Population"
}
Output:
{
"success": true,
"regionsColored": 4,
"valueRange": { "min": 20201249, "max": 39538223 }
}
pinepaper_add_marker
⚠️ Not a tool. This operation is
pinepaper_map_regions { action: "add_marker" }. The parameters below still apply; the entry point moved.
Add a marker to the map at specified coordinates.
Input Schema:
{
"type": "object",
"properties": {
"lat": {
"type": "number",
"description": "Latitude (-90 to 90)"
},
"lon": {
"type": "number",
"description": "Longitude (-180 to 180)"
},
"label": {
"type": "string",
"description": "Marker label text"
},
"color": {
"type": "string",
"default": "#ef4444",
"description": "Marker color"
},
"size": {
"type": "number",
"default": 8,
"description": "Marker size in pixels"
},
"pulse": {
"type": "boolean",
"default": false,
"description": "Enable pulse animation"
},
"icon": {
"type": "string",
"enum": ["circle", "pin", "star", "diamond"],
"default": "circle",
"description": "Marker icon shape"
}
},
"required": ["lat", "lon"]
}
Output:
{
"success": true,
"markerId": "marker_1",
"position": { "x": 234, "y": 156 }
}
pinepaper_add_map_labels
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Add labels to map regions.
Input Schema:
{
"type": "object",
"properties": {
"regions": {
"type": "array",
"items": { "type": "string" },
"description": "Specific regions to label (omit for all visible)"
},
"labelType": {
"type": "string",
"enum": ["name", "code", "value"],
"default": "name",
"description": "What to display as label"
},
"fontSize": {
"type": "number",
"default": 10,
"description": "Font size in pixels"
},
"fontColor": {
"type": "string",
"default": "#374151",
"description": "Label text color"
},
"fontFamily": {
"type": "string",
"default": "Inter, sans-serif",
"description": "Font family"
},
"showBackground": {
"type": "boolean",
"default": false,
"description": "Show background behind labels"
}
}
}
pinepaper_pan_map
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Pan the map view to specific coordinates.
Input Schema:
{
"type": "object",
"properties": {
"lat": {
"type": "number",
"description": "Target latitude"
},
"lon": {
"type": "number",
"description": "Target longitude"
},
"animate": {
"type": "boolean",
"default": true,
"description": "Animate the pan"
},
"duration": {
"type": "number",
"default": 0.5,
"description": "Animation duration in seconds"
}
},
"required": ["lat", "lon"]
}
pinepaper_zoom_map
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Set the map zoom level.
Input Schema:
{
"type": "object",
"properties": {
"level": {
"type": "number",
"minimum": 0.5,
"maximum": 10,
"description": "Zoom level (1 = default)"
},
"center": {
"type": "array",
"items": { "type": "number" },
"description": "Zoom center [lon, lat] (optional)"
},
"animate": {
"type": "boolean",
"default": true
}
},
"required": ["level"]
}
pinepaper_export_map
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Export the current map configuration for saving/loading.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"mapId": "worldHighRes",
"projection": "naturalEarth",
"quality": "professional",
"highlightedRegions": ["United States of America", "Canada"],
"dataColors": { "California": "#3b82f6" },
"markers": [
{ "lat": 37.77, "lon": -122.42, "label": "San Francisco" }
],
"viewState": {
"center": [0, 0],
"zoom": 1
}
}
pinepaper_get_region_at_point
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Get the region at a specific canvas point (for hit testing).
Input Schema:
{
"type": "object",
"properties": {
"x": { "type": "number" },
"y": { "type": "number" }
},
"required": ["x", "y"]
}
Output:
{
"found": true,
"regionId": "California",
"properties": {
"name": "California",
"code": "CA",
"population": 39538223
}
}
pinepaper_animate_map_regions
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Animate specific map regions with timeline-integrated keyframe color animations.
Input Schema:
{
"type": "object",
"properties": {
"duration": {
"type": "number",
"description": "Total animation duration in seconds",
"default": 5
},
"loop": {
"type": "boolean",
"description": "Loop the animation",
"default": true
},
"regions": {
"type": "object",
"description": "Object mapping region IDs to arrays of keyframes",
"additionalProperties": {
"type": "array",
"items": {
"type": "object",
"properties": {
"time": { "type": "number", "description": "Time in seconds" },
"fillColor": { "type": "string", "description": "Fill color at this keyframe" },
"strokeColor": { "type": "string", "description": "Stroke color at this keyframe" },
"opacity": { "type": "number", "description": "Opacity at this keyframe (0-1)" }
},
"required": ["time", "fillColor"]
}
}
}
},
"required": ["regions"]
}
Example:
{
"duration": 8,
"loop": true,
"regions": {
"USA": [
{ "time": 0, "fillColor": "#ef4444" },
{ "time": 4, "fillColor": "#22c55e" },
{ "time": 8, "fillColor": "#ef4444" }
],
"France": [
{ "time": 0, "fillColor": "#3b82f6" },
{ "time": 8, "fillColor": "#fbbf24" }
]
}
}
Output:
{
"success": true,
"animatedRegions": ["USA", "France"],
"duration": 8,
"errors": []
}
pinepaper_animate_map_wave
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Create a wave animation across all map regions based on geographic position.
Input Schema:
{
"type": "object",
"properties": {
"duration": {
"type": "number",
"description": "Total wave duration in seconds",
"default": 10
},
"loop": {
"type": "boolean",
"description": "Loop the animation",
"default": true
},
"colors": {
"type": "array",
"items": { "type": "string" },
"description": "Array of colors for the wave",
"default": ["#ef4444", "#fbbf24", "#22c55e", "#3b82f6"]
},
"waveDirection": {
"type": "string",
"enum": ["horizontal", "vertical", "radial"],
"description": "Direction of the wave effect",
"default": "horizontal"
}
}
}
Output:
{
"success": true,
"animatedRegions": ["USA", "Canada", "Mexico", "..."],
"totalRegions": 177
}
pinepaper_stop_map_animations
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Stop all or specific map region animations.
Input Schema:
{
"type": "object",
"properties": {
"regions": {
"type": "array",
"items": { "type": "string" },
"description": "Specific region IDs to stop (omit for all)"
},
"resetColors": {
"type": "boolean",
"description": "Reset regions to default colors",
"default": true
}
}
}
pinepaper_get_animated_map_regions
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Get list of currently animated map regions with their animation data.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"animatedRegions": [
{
"regionId": "USA",
"keyframes": [
{ "time": 0, "fillColor": "#ef4444" },
{ "time": 5, "fillColor": "#22c55e" }
],
"duration": 5,
"loop": true
}
],
"count": 1
}
pinepaper_export_map_region_csv
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Export map region data as CSV including colors, highlight, and selection status.
Input Schema:
{
"type": "object",
"properties": {
"includeHighlighted": {
"type": "boolean",
"description": "Include highlight status column",
"default": true
},
"includeSelected": {
"type": "boolean",
"description": "Include selection status column",
"default": true
},
"includeColors": {
"type": "boolean",
"description": "Include fill/stroke color columns",
"default": true
},
"download": {
"type": "boolean",
"description": "Auto-download the CSV file",
"default": false
},
"filename": {
"type": "string",
"description": "Filename for download",
"default": "map-regions.csv"
}
}
}
Output:
{
"success": true,
"csv": "regionId,name,highlighted,selected,fillColor,strokeColor\nUSA,United States of America,1,0,#22c55e,#16a34a\n...",
"regionCount": 177
}
pinepaper_import_map_region_csv
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Import CSV data to update map region states (colors, highlight, selection).
Input Schema:
{
"type": "object",
"properties": {
"csvText": {
"type": "string",
"description": "CSV text content to import"
},
"applyColors": {
"type": "boolean",
"description": "Apply fill/stroke colors from CSV",
"default": true
},
"applyHighlight": {
"type": "boolean",
"description": "Update highlight status from CSV",
"default": true
},
"applySelection": {
"type": "boolean",
"description": "Update selection status from CSV",
"default": true
}
},
"required": ["csvText"]
}
Output:
{
"success": true,
"updatedRegions": 50,
"notFound": ["INVALID_ID"],
"errors": []
}
pinepaper_select_map_regions
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Programmatically select map regions.
Input Schema:
{
"type": "object",
"properties": {
"regionIds": {
"type": "array",
"items": { "type": "string" },
"description": "Array of region IDs to select"
}
},
"required": ["regionIds"]
}
pinepaper_deselect_map_regions
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Programmatically deselect map regions.
Input Schema:
{
"type": "object",
"properties": {
"regionIds": {
"type": "array",
"items": { "type": "string" },
"description": "Array of region IDs to deselect (omit for all)"
}
}
}
pinepaper_get_highlighted_map_regions
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Get list of currently highlighted map regions.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"highlighted": ["USA", "Canada", "France"],
"count": 3
}
pinepaper_export_map_geojson
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Export the current map as GeoJSON (with current colors/modifications).
Input Schema:
{
"type": "object",
"properties": {
"includeStyles": {
"type": "boolean",
"description": "Include fill/stroke colors as properties",
"default": true
},
"includeMetadata": {
"type": "boolean",
"description": "Include region names and IDs",
"default": true
},
"selectedOnly": {
"type": "boolean",
"description": "Only export selected regions",
"default": false
},
"download": {
"type": "boolean",
"description": "Auto-download the file",
"default": false
},
"filename": {
"type": "string",
"description": "Filename for download",
"default": "map-export.geojson"
}
}
}
Output:
{
"success": true,
"geoJson": { "type": "FeatureCollection", "features": [...] },
"regionCount": 177
}
pinepaper_export_original_map_geojson
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Export the original source GeoJSON (unmodified boundaries). This returns the exact data that was used to load the map, allowing users to edit boundaries externally and re-import.
Input Schema:
{
"type": "object",
"properties": {
"download": {
"type": "boolean",
"description": "Auto-download the file",
"default": false
},
"filename": {
"type": "string",
"description": "Filename for download",
"default": "map-source.geojson"
}
}
}
Output:
{
"success": true,
"geoJson": { "type": "FeatureCollection", "features": [...] },
"source": "world",
"regionCount": 177
}
pinepaper_get_map_source_info
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Get information about the currently loaded map source.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"source": "world",
"projection": "naturalEarth",
"quality": "standard",
"regionCount": 177,
"hasOriginalGeoJSON": true,
"isCustomImport": false
}
Map Events
The map system emits events that can be listened to via triggers:
| Event | Description | Data |
|---|---|---|
map:regionClick |
Region was clicked | { regionId, properties, position } |
map:regionHover |
Mouse entered region | { regionId, properties } |
map:regionLeave |
Mouse left region | { regionId } |
map:markerClick |
Marker was clicked | { markerId, lat, lon, label } |
Example Trigger:
{
"itemId": "map_1",
"event": "map:regionClick",
"actions": [
{ "type": "show", "targetItemId": "info_panel" },
{ "type": "update_property", "targetItemId": "region_name", "property": "content", "value": "$event.regionId" }
]
}
Font Tools
Create custom hand-drawn fonts by drawing glyphs on a dedicated canvas. Font Studio converts Paper.js paths to OpenType glyphs.
pinepaper_font_show_studio
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Open the Font Studio UI for interactive font creation.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"message": "Font Studio opened"
}
pinepaper_font_set_name
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Set the font name.
Input Schema:
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Font family name (e.g., 'MyHandwriting')"
}
},
"required": ["name"]
}
Output:
{
"success": true,
"fontName": "MyHandwriting"
}
pinepaper_font_get_required_chars
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Get the list of characters needed for a complete font.
Input Schema:
{
"type": "object",
"properties": {
"set": {
"type": "string",
"enum": ["minimum", "standard"],
"default": "minimum",
"description": "minimum: A-Z, a-z, 0-9, space (63 chars). standard: adds punctuation (90+ chars)"
}
}
}
Output:
{
"characters": ["A", "B", "C", "..."],
"count": 63,
"set": "minimum"
}
pinepaper_font_get_status
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Get font completion status.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"fontName": "MyHandwriting",
"total": 63,
"completed": 26,
"pending": 37,
"percentage": 41,
"completedChars": ["A", "B", "C", "..."],
"pendingChars": ["a", "b", "c", "..."],
"isComplete": false
}
pinepaper_font_create_glyph
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Create a glyph from a Paper.js path. Used programmatically when drawing paths for characters.
Input Schema:
{
"type": "object",
"properties": {
"character": {
"type": "string",
"description": "Single character (e.g., 'A', 'a', '1', ' ')"
},
"pathId": {
"type": "string",
"description": "Registry ID of the Paper.js path to use as glyph shape"
}
},
"required": ["character", "pathId"]
}
Output:
{
"success": true,
"character": "A",
"glyphName": "A",
"advanceWidth": 450
}
pinepaper_font_create_space
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Create the space glyph (no visible shape, just advance width).
Input Schema:
{
"type": "object",
"properties": {
"width": {
"type": "number",
"default": 250,
"description": "Space width in font units"
}
}
}
Output:
{
"success": true,
"character": " ",
"advanceWidth": 250
}
pinepaper_font_remove_glyph
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Remove a glyph from the font.
Input Schema:
{
"type": "object",
"properties": {
"character": {
"type": "string",
"description": "Character to remove"
}
},
"required": ["character"]
}
Output:
{
"success": true,
"removed": "A"
}
pinepaper_font_set_metrics
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Set font metrics (advanced).
Input Schema:
{
"type": "object",
"properties": {
"unitsPerEm": {
"type": "number",
"default": 1000,
"description": "Coordinate grid size"
},
"ascender": {
"type": "number",
"default": 800,
"description": "Height above baseline"
},
"descender": {
"type": "number",
"default": -200,
"description": "Depth below baseline (negative)"
},
"xHeight": {
"type": "number",
"default": 500,
"description": "Lowercase letter height"
},
"capHeight": {
"type": "number",
"default": 700,
"description": "Capital letter height"
}
}
}
Output:
{
"success": true,
"metrics": {
"unitsPerEm": 1000,
"ascender": 800,
"descender": -200,
"xHeight": 500,
"capHeight": 700
}
}
pinepaper_font_export
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Export the font as OTF file.
Input Schema:
{
"type": "object",
"properties": {
"download": {
"type": "boolean",
"default": true,
"description": "Trigger browser download"
}
}
}
Output:
{
"success": true,
"fontName": "MyHandwriting",
"format": "otf",
"downloaded": true,
"glyphCount": 63
}
pinepaper_font_load_into_document
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Load the custom font into the document for immediate use in PinePaper.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"fontName": "MyHandwriting",
"message": "Font 'MyHandwriting' loaded and ready to use"
}
pinepaper_font_export_data
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Export font data as JSON for saving progress.
Input Schema:
{
"type": "object",
"properties": {
"download": {
"type": "boolean",
"default": true,
"description": "Trigger browser download"
}
}
}
Output:
{
"success": true,
"data": {
"version": "1.0",
"fontName": "MyHandwriting",
"metrics": { "..." },
"glyphs": { "..." }
},
"downloaded": true
}
pinepaper_font_import_data
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Import font data from previously saved JSON.
Input Schema:
{
"type": "object",
"properties": {
"data": {
"type": "object",
"description": "Font data object from pinepaper_font_export_data"
}
},
"required": ["data"]
}
Output:
{
"success": true,
"fontName": "MyHandwriting",
"glyphCount": 26
}
pinepaper_font_clear
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Clear all glyphs and reset the font.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"message": "Font cleared"
}
pinepaper_font_remove_overlap
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Remove overlapping areas from a path (like FontForge’s RemoveOverlap). Merges multiple overlapping paths into a single clean outline.
Input Schema:
{
"type": "object",
"properties": {
"pathId": {
"type": "string",
"description": "Registry ID of the Paper.js path to process"
}
},
"required": ["pathId"]
}
Output:
{
"success": true,
"pathId": "item_42",
"message": "Overlaps removed from path"
}
pinepaper_font_correct_direction
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Correct path winding direction for proper fill rendering (like FontForge’s CorrectDirection). Ensures outer contours are clockwise and inner holes are counter-clockwise.
Input Schema:
{
"type": "object",
"properties": {
"pathId": {
"type": "string",
"description": "Registry ID of the Paper.js path to process"
}
},
"required": ["pathId"]
}
Output:
{
"success": true,
"pathId": "item_42",
"message": "Path direction corrected"
}
pinepaper_font_cleanup_path
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply all path cleanup operations in the correct order: removeOverlap → correctDirection → smooth.
Input Schema:
{
"type": "object",
"properties": {
"pathId": {
"type": "string",
"description": "Registry ID of the Paper.js path to process"
},
"removeOverlap": {
"type": "boolean",
"default": true,
"description": "Merge overlapping strokes"
},
"correctDirection": {
"type": "boolean",
"default": true,
"description": "Fix winding direction for fills"
},
"smooth": {
"type": "boolean",
"default": true,
"description": "Apply path smoothing"
},
"smoothTolerance": {
"type": "number",
"default": 2.5,
"description": "Smoothing tolerance (higher = more simplification)"
}
},
"required": ["pathId"]
}
Output:
{
"success": true,
"pathId": "item_42",
"operations": ["removeOverlap", "correctDirection", "smooth"],
"message": "Path cleanup complete"
}
Font Studio Typography Guide
When using Font Studio interactively, guide lines help with consistent glyph drawing:
| Guide Line | Color | Description |
|---|---|---|
| Cap Height | Red (#ff6b6b) | Top of capital letters (H, T, A) |
| x-Height | Cyan (#4ecdc4) | Top of lowercase letters (a, e, x) |
| Baseline | Green (#95e1d3) | Where letters “sit” |
| Descender | Purple (#dda0dd) | Below baseline for g, p, y, j |
Best Practices:
- Keep stroke width consistent across all characters
- Uppercase letters should touch the cap height line
- Lowercase (except b, d, f, h, k, l, t) stay within x-height
- Letters g, j, p, q, y extend below baseline to descender
Query Tools
pinepaper_get_items
Get all or filtered items.
Input Schema:
{
"type": "object",
"properties": {
"filter": {
"type": "object",
"properties": {
"type": { "type": "string", "description": "Filter by item type" },
"source": { "type": "string", "enum": ["user", "generator", "import"] },
"hasAnimation": { "type": "boolean" },
"hasRelation": { "type": "boolean" }
}
}
}
}
Output:
{
"items": [
{
"id": "item_1",
"type": "circle",
"position": { "x": 400, "y": 300 },
"hasAnimation": true,
"relations": ["orbits"]
}
],
"count": 1
}
pinepaper_get_relation_stats
Get statistics about active relations.
Output:
{
"activeItems": 5,
"ruleCount": 8,
"associationsByType": {
"orbits": 2,
"follows": 3,
"attached_to": 1
}
}
Export Tools
pinepaper_export_svg
Export the scene as animated SVG.
Output:
{
"success": true,
"svgString": "<svg>...</svg>",
"hasAnimations": true
}
pinepaper_export_training_data
Export relations as training data for LLM fine-tuning.
Output:
{
"trainingData": [
{
"instruction": "moon orbits earth at radius 100",
"code": "app.addRelation('item_1', 'item_2', 'orbits', {\"radius\":100})",
"relation": "orbits",
"params": { "radius": 100 }
}
],
"count": 5
}
pinepaper_export_scene
Export the complete scene state.
Output:
{
"items": [...],
"relations": [...],
"decorative": [...],
"backgroundColor": "#1e293b"
}
pinepaper_export_widget
Export scene as embeddable widget JSON format using the pp:PinePaper ontology. The output contains scene data that can be loaded by PineWidget.js or embedded in any website.
Input Schema:
{
"type": "object",
"properties": {
"includeInteractions": {
"type": "boolean",
"default": true,
"description": "Include interaction triggers in export"
},
"minify": {
"type": "boolean",
"default": false,
"description": "Minify JSON output"
}
}
}
Output:
{
"success": true,
"data": {
"ontology": "pp:PinePaper",
"ontologyVersion": "0.4.3",
"version": "1.0",
"width": 1080,
"height": 1080,
"background": "#1e293b",
"items": [],
"relations": [],
"metadata": {
"itemCount": 5,
"relationCount": 3,
"hasAnimations": true,
"ontologyTokens": 55
}
},
"embedCode": "<div id=\"my-widget\">...</div><script>...</script>"
}
pinepaper_export_widget_html
Export scene as a standalone self-contained HTML file. The output includes only the runtime code needed for this specific scene — item renderers, relation handlers, and features are tree-shaken based on actual scene content. Zero external dependencies, no CDN links, no API calls. Opens directly in any browser.
Input Schema:
{
"type": "object",
"properties": {
"title": {
"type": "string",
"default": "PinePaper Widget",
"description": "HTML page title"
}
}
}
Output:
{
"success": true,
"html": "<!DOCTYPE html><html>...</html>",
"analysis": {
"itemTypes": ["circle", "text"],
"relationTypes": ["orbits", "follows"],
"hasSimpleAnimations": true,
"hasKeyframeAnimations": false,
"hasMasks": false,
"hasCameraRelation": false
},
"estimatedSize": 12400
}
Notes:
- Output HTML is self-contained — no
<script src>tags, nofetch()calls - Scene data is inlined as JSON within the HTML
- Supports transparent backgrounds for overlay use cases
- Canvas is responsive and scales to container size
- All pp:PinePaper ontology relation types are supported
Effect Tools
pinepaper_apply_effect
Apply a visual effect to an item.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string"
},
"effectType": {
"type": "string",
"enum": ["sparkle", "blast"]
},
"params": {
"type": "object",
"properties": {
"color": { "type": "string" },
"speed": { "type": "number" },
"size": { "type": "number" }
}
}
},
"required": ["itemId", "effectType"]
}
Text Design Tools
pinepaper_create_letter_collage
Create stylized text with per-letter customization. Perfect for word games, ransom notes, gradient text, and creative typography.
Input Schema:
{
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "The text to stylize"
},
"style": {
"type": "string",
"enum": ["tile", "magazine", "paperCut", "fold", "gradient", "image"],
"default": "tile",
"description": "Style type for the letter collage"
},
"palette": {
"type": "string",
"description": "Color palette name (e.g., 'wordle', 'candy', 'neon', 'ocean')"
},
"position": {
"type": "object",
"properties": {
"x": { "type": "number" },
"y": { "type": "number" }
},
"description": "Position on canvas (defaults to center)"
},
"fontSize": {
"type": "number",
"default": 48,
"description": "Base font size in pixels"
},
"fontFamily": {
"type": "string",
"default": "Inter, sans-serif",
"description": "Font family to use"
},
"spacing": {
"type": "number",
"default": 1.1,
"description": "Letter spacing multiplier"
},
"gradientPalette": {
"type": "string",
"description": "Gradient palette name (for style='gradient')"
},
"gradientDirection": {
"type": "string",
"enum": ["vertical", "horizontal", "diagonal", "radial"],
"default": "vertical",
"description": "Gradient direction (for style='gradient')"
},
"cornerRadius": {
"type": "number",
"default": 4,
"description": "Corner radius for tile backgrounds"
},
"shadowEnabled": {
"type": "boolean",
"default": true,
"description": "Enable drop shadows"
}
},
"required": ["text"]
}
Style Types:
| Style | Description | Best For |
|---|---|---|
tile |
Wordle/Scrabble colored backgrounds | Word games, educational |
magazine |
Mixed fonts/colors like cutouts | Ransom notes, collage art |
paperCut |
Shadow/depth like cut paper | Craft aesthetics |
fold |
Origami-style folded letters | Paper crafts |
gradient |
Each letter with gradient fill | Modern, vibrant text |
image |
Letters filled with image | Photo effects |
Available Tile Palettes:
| Category | Palettes |
|---|---|
| Game | wordle, scrabble |
| Vibrant | candy, neon, rainbow |
| Soft | pastel, cotton |
| Natural | earth, ocean, forest, sunset |
| Professional | corporate, minimal, slate |
| Seasonal | christmas, halloween, spring |
| Magazine | magazine, newspaper, vintage |
| Paper Craft | paperCraft, origami, craftPaper |
Available Gradient Palettes: rainbow, sunset, ocean, fire, gold, rose, ice, cyberpunk, neonGlow, purplePink
Output:
{
"success": true,
"collageId": "collage_1",
"itemId": "item_5",
"text": "HELLO",
"style": "tile",
"letterCount": 5
}
pinepaper_animate_letter_collage
Apply animation to all letters in a collage with staggered timing.
Input Schema:
{
"type": "object",
"properties": {
"collageId": {
"type": "string",
"description": "Collage ID from create_letter_collage"
},
"animationType": {
"type": "string",
"enum": ["pulse", "bounce", "fade", "wobble", "rotate"],
"description": "Animation type to apply"
},
"staggerDelay": {
"type": "number",
"default": 0.1,
"description": "Delay between each letter's animation start (seconds)"
},
"animationSpeed": {
"type": "number",
"default": 1,
"description": "Animation speed multiplier"
}
},
"required": ["collageId", "animationType"]
}
Agent Flow Mode Tools
Agent mode is enforced by default (v1.5.0+). The browser auto-connects on first tool call with optimized settings for automation.
pinepaper_agent_start_job
Start a new agent job/session for optimized batch workflows.
Input Schema:
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Optional job name for tracking"
},
"screenshotPolicy": {
"type": "string",
"enum": ["on_complete", "on_error", "never", "on_request"],
"description": "When to take screenshots (default: on_complete)"
},
"canvasPreset": {
"type": "string",
"enum": ["instagram", "instagram-story", "tiktok", "youtube", "youtube-thumbnail", "twitter", "linkedin", "web", "print-a4", "print-letter"],
"description": "Set canvas size to platform preset"
},
"clearCanvas": {
"type": "boolean",
"description": "Clear canvas when starting job (default: true)"
}
}
}
pinepaper_agent_end_job
End the current agent job and get summary with export recommendations.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"jobId": "job_12345",
"duration": 5432,
"itemsCreated": ["item_1", "item_2", "item_3"],
"relationsCreated": ["rel_1"],
"screenshot": "base64...",
"recommendations": {
"formats": ["mp4", "gif"],
"platforms": ["instagram", "tiktok"],
"hasAnimations": true
}
}
pinepaper_agent_reset
Fast canvas reset without browser refresh (~200ms vs ~3000ms for page refresh).
Input Schema:
{
"type": "object",
"properties": {
"canvasPreset": {
"type": "string",
"enum": ["instagram", "instagram-story", "tiktok", "youtube", "youtube-thumbnail", "twitter", "linkedin", "web", "print-a4", "print-letter"],
"description": "Set canvas size after reset"
},
"backgroundColor": {
"type": "string",
"description": "Set background color after reset"
},
"preserveBackground": {
"type": "boolean",
"description": "Keep existing background"
}
}
}
pinepaper_agent_batch_execute
Execute multiple operations in a single browser call. Dramatically faster than individual tool calls.
Performance:
- 10 individual creates: ~1450ms (10 browser round trips)
- Batch execute 10 creates: ~300ms (1 browser round trip)
Input Schema:
{
"type": "object",
"properties": {
"operations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": ["create", "modify", "animate", "relation", "delete"]
},
"itemType": {"type": "string"},
"itemId": {"type": "string"},
"position": {"type": "object"},
"properties": {"type": "object"},
"animationType": {"type": "string"},
"animationOptions": {"type": "object"},
"sourceId": {"type": "string"},
"targetId": {"type": "string"},
"relationType": {"type": "string"},
"relationOptions": {"type": "object"}
},
"required": ["type"]
}
},
"atomic": {
"type": "boolean",
"description": "All succeed or all fail (default: true)"
}
},
"required": ["operations"]
}
Variable References:
Use $0, $1, etc. to reference items created in earlier operations:
{
"operations": [
{"type": "create", "itemType": "circle", "position": {"x": 400, "y": 300}, "properties": {"radius": 50}},
{"type": "animate", "itemId": "$0", "animationType": "pulse"}
]
}
pinepaper_agent_export
Smart export with automatic format detection and platform optimization.
Input Schema:
{
"type": "object",
"properties": {
"platform": {
"type": "string",
"enum": ["instagram", "instagram-story", "tiktok", "youtube", "youtube-thumbnail", "twitter", "linkedin", "web", "print-a4", "print-letter"],
"description": "Target platform (auto-selects optimal format)"
},
"format": {
"type": "string",
"enum": ["png", "svg", "mp4", "webm", "gif", "pdf"],
"description": "Override format selection"
},
"quality": {
"type": "string",
"enum": ["low", "medium", "high", "maximum"],
"description": "Export quality (default: high)"
},
"duration": {
"type": "number",
"description": "Animation duration in seconds (default: 5)"
},
"fps": {
"type": "number",
"description": "Frames per second for video (default: 30)"
}
}
}
Platform Optimal Formats:
| Platform | Dimensions | Static | Animated |
|---|---|---|---|
| 1080x1080 | PNG | MP4 | |
| instagram-story | 1080x1920 | PNG | MP4 |
| tiktok | 1080x1920 | PNG | MP4@60fps |
| youtube | 1920x1080 | PNG | MP4 |
| 1200x675 | PNG | GIF | |
| 1200x627 | PNG | GIF | |
| web | flexible | SVG | SVG |
| print-a4 | 2480x3508 |
pinepaper_agent_analyze
Analyze canvas content for export recommendations.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"hasAnimations": true,
"animationTypes": ["pulse", "orbits"],
"colorComplexity": "gradient",
"itemCount": 5,
"canvasSize": {"width": 1080, "height": 1080},
"hasRelations": true,
"relationTypes": ["orbits"],
"hasGradients": true,
"hasShadows": false,
"hasText": true,
"hasImages": false,
"recommendations": {
"formats": ["mp4", "gif"],
"platforms": ["instagram", "tiktok"],
"reason": "Content has animations - video formats recommended"
}
}
Paper.js Direct Access
pinepaper_register_item
Register a Paper.js item created externally.
Input Schema:
{
"type": "object",
"properties": {
"itemJson": {
"type": "object",
"description": "Paper.js item JSON (from item.exportJSON())"
},
"itemType": {
"type": "string",
"description": "Type name for registry"
},
"properties": {
"type": "object",
"description": "Custom properties to store"
}
},
"required": ["itemJson", "itemType"]
}
Error Handling
All tools return errors in a consistent format:
{
"success": false,
"error": {
"code": "ITEM_NOT_FOUND",
"message": "Item with ID 'item_99' not found",
"details": {}
}
}
Error Codes:
| Code | Description |
|---|---|
ITEM_NOT_FOUND |
Item ID doesn’t exist |
INVALID_RELATION |
Unknown relation type |
INVALID_PARAMS |
Missing or invalid parameters |
GENERATOR_NOT_FOUND |
Unknown generator name |
EXPORT_FAILED |
Export operation failed |
Rigging Tools (v0.4)
Skeletal animation with bones, FK/IK solvers, poses, and character presets.
pinepaper_create_skeleton
⚠️ Not a tool. This operation is
pinepaper_rigging { action: "create_skeleton" }. The parameters below still apply; the entry point moved.
Create a new skeleton for character rigging.
Input Schema:
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Skeleton name"
},
"rootPosition": {
"type": "object",
"properties": {
"x": { "type": "number" },
"y": { "type": "number" }
},
"description": "World position of skeleton root (default: canvas center)"
}
},
"required": ["name"]
}
Output:
{
"success": true,
"skeletonId": "skeleton_1"
}
pinepaper_add_bone
⚠️ Not a tool. This operation is
pinepaper_rigging { action: "add_bone" }. The parameters below still apply; the entry point moved.
Add a bone to an existing skeleton.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to add bone to"
},
"name": {
"type": "string",
"description": "Bone name (e.g., 'upperArm_L')"
},
"parentBoneId": {
"type": "string",
"description": "Parent bone ID (null for root bone)"
},
"length": {
"type": "number",
"description": "Bone length in pixels",
"default": 80
},
"angle": {
"type": "number",
"description": "Local rotation angle in radians",
"default": 0
},
"constraint": {
"type": "object",
"properties": {
"minAngle": { "type": "number", "description": "Minimum angle in radians" },
"maxAngle": { "type": "number", "description": "Maximum angle in radians" },
"fixed": { "type": "boolean", "description": "Lock joint rotation" }
},
"description": "Joint angle constraints"
}
},
"required": ["skeletonId", "name"]
}
Output:
{
"success": true,
"boneId": "bone_1"
}
pinepaper_attach_item_to_bone
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Attach a canvas item to a bone so it follows bone transforms.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": { "type": "string" },
"boneId": { "type": "string" },
"itemId": {
"type": "string",
"description": "Item registry ID to attach"
},
"attachPoint": {
"type": "number",
"description": "Position along bone: 0=joint, 0.5=middle, 1=tip",
"default": 0.5
},
"offset": {
"type": "array",
"items": { "type": "number" },
"description": "Local offset from attach point [x, y]",
"default": [0, 0]
},
"inheritRotation": {
"type": "boolean",
"description": "Whether item rotates with bone",
"default": true
}
},
"required": ["skeletonId", "boneId", "itemId"]
}
Output:
{
"success": true,
"skeletonId": "skeleton_1",
"boneId": "bone_3",
"itemId": "item_5"
}
pinepaper_set_bone_angle
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Set the local rotation angle of a bone (respects joint constraints).
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": { "type": "string" },
"boneId": { "type": "string" },
"angle": {
"type": "number",
"description": "Angle in radians"
}
},
"required": ["skeletonId", "boneId", "angle"]
}
pinepaper_create_ik_chain
⚠️ Not a tool. This operation is
pinepaper_rigging { action: "create_ik_chain" }. The parameters below still apply; the entry point moved.
Create an Inverse Kinematics chain for drag-based posing.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": { "type": "string" },
"name": { "type": "string" },
"boneIds": {
"type": "array",
"items": { "type": "string" },
"description": "Ordered bone IDs from root to effector (minimum 2)",
"minItems": 2
},
"strength": {
"type": "number",
"description": "IK influence: 0=FK only, 1=full IK",
"default": 1,
"minimum": 0,
"maximum": 1
},
"iterations": {
"type": "number",
"description": "FABRIK solver iterations",
"default": 10
},
"tolerance": {
"type": "number",
"description": "Convergence tolerance in pixels",
"default": 0.5
}
},
"required": ["skeletonId", "boneIds"]
}
Output:
{
"success": true,
"chainId": "ikchain_1"
}
pinepaper_set_ik_target
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Set the IK target item for a chain. The solver will pull the bone chain toward this item’s position.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": { "type": "string" },
"chainId": { "type": "string" },
"targetItemId": {
"type": "string",
"description": "Item registry ID to use as IK target (draggable handle)"
}
},
"required": ["skeletonId", "chainId", "targetItemId"]
}
pinepaper_apply_rig_preset
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply a pre-built character rig preset to a skeleton.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": { "type": "string" },
"preset": {
"type": "string",
"enum": ["humanoid", "quadruped", "spider", "simple_arm", "snake", "chain"],
"description": "Character rig preset name"
}
},
"required": ["skeletonId", "preset"]
}
Preset Details:
| Preset | Bones | IK Chains | Description |
|---|---|---|---|
humanoid |
16 | 4 | Spine + head + arms(L/R) + legs(L/R) |
quadruped |
13 | 4 | Horizontal spine + 4 legs + tail |
spider |
19 | 8 | Body + head + 8 legs |
simple_arm |
3 | 1 | Upper arm + lower arm + hand |
snake |
10 | 1 | Spine chain for serpentine motion |
chain |
5 | 1 | Generic pendulum/rope |
Output:
{
"success": true,
"skeletonId": "skeleton_1",
"boneMap": {
"hip": "bone_1",
"spine": "bone_2",
"chest": "bone_3"
},
"chainIds": ["ikchain_1", "ikchain_2"]
}
pinepaper_save_pose
⚠️ Not a tool. This operation is
pinepaper_rigging { action: "save_pose" }. The parameters below still apply; the entry point moved.
Save current bone angles as a named pose for later recall or animation.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": { "type": "string" },
"name": {
"type": "string",
"description": "Pose name (e.g., 'idle', 'walk_frame1')"
}
},
"required": ["skeletonId", "name"]
}
Output:
{
"success": true,
"poseId": "pose_1"
}
pinepaper_load_pose
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Load a saved pose onto its skeleton.
Input Schema:
{
"type": "object",
"properties": {
"poseId": { "type": "string" }
},
"required": ["poseId"]
}
pinepaper_interpolate_poses
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Blend between two poses. Useful for keyframe animation of character rigs.
Input Schema:
{
"type": "object",
"properties": {
"poseIdA": { "type": "string" },
"poseIdB": { "type": "string" },
"t": {
"type": "number",
"description": "Interpolation factor: 0=pose A, 1=pose B",
"minimum": 0,
"maximum": 1
},
"apply": {
"type": "boolean",
"description": "Apply interpolated angles to skeleton immediately",
"default": true
}
},
"required": ["poseIdA", "poseIdB", "t"]
}
Output:
{
"success": true,
"boneAngles": {
"bone_1": 0.35,
"bone_2": -0.15,
"bone_3": 0.22
}
}
pinepaper_create_chain_from_items
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Auto-create a skeleton by inferring bone hierarchy from a sequence of existing items.
Input Schema:
{
"type": "object",
"properties": {
"itemIds": {
"type": "array",
"items": { "type": "string" },
"description": "Ordered item IDs — bones created between consecutive items",
"minItems": 2
},
"name": { "type": "string", "description": "Skeleton name" },
"createIKChain": {
"type": "boolean",
"description": "Auto-create IK chain for the full bone sequence",
"default": false
}
},
"required": ["itemIds"]
}
Output:
{
"success": true,
"skeletonId": "skeleton_1",
"boneIds": ["bone_1", "bone_2"],
"chainId": "ikchain_1"
}
Blending Tools (v0.4)
Per-item and per-group compositing with presets, transitions, and interactive modes.
pinepaper_apply_blend_preset
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply a named blend preset (mode + opacity combo) to an item.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Item registry ID"
},
"preset": {
"type": "string",
"enum": [
"ghost", "neon", "shadow", "silhouette", "glow", "highlight",
"darkroom", "xray", "dreamy", "vintage",
"multiply", "screen", "overlay", "dodge", "burn",
"hardLight", "softLight", "difference", "exclusion"
],
"description": "Blend preset name"
}
},
"required": ["itemId", "preset"]
}
Preset Details:
| Preset | Blend Mode | Opacity | Effect |
|---|---|---|---|
ghost |
screen | 0.5 | Ghostly translucent overlay |
neon |
color-dodge | 0.85 | Bright neon glow |
shadow |
multiply | 0.7 | Dark shadow overlay |
silhouette |
darken | 1.0 | Dark silhouette cutout |
glow |
screen | 0.8 | Bright additive glow |
highlight |
lighten | 0.9 | Light highlight overlay |
darkroom |
color-burn | 0.6 | Deep color burn |
xray |
difference | 0.8 | X-ray inversion |
dreamy |
soft-light | 0.9 | Soft dreamy haze |
vintage |
overlay | 0.7 | Warm vintage overlay |
Output:
{
"success": true,
"itemId": "item_1",
"preset": "ghost",
"blendMode": "screen",
"opacity": 0.5
}
pinepaper_remove_blend_preset
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Remove blend preset and reset item to normal blending.
Input Schema:
{
"type": "object",
"properties": {
"itemId": { "type": "string" }
},
"required": ["itemId"]
}
pinepaper_transition_blend_mode
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Smoothly transition an item’s blend mode using opacity cross-fade with mode snap at midpoint.
Input Schema:
{
"type": "object",
"properties": {
"itemId": { "type": "string" },
"targetMode": {
"type": "string",
"description": "Target blend mode (e.g., 'multiply', 'screen', 'overlay')"
},
"duration": {
"type": "number",
"description": "Transition duration in seconds",
"default": 0.5
},
"easing": {
"type": "string",
"enum": ["linear", "easeIn", "easeOut", "easeInOut", "bounce", "elastic"],
"default": "easeOut"
},
"targetOpacity": {
"type": "number",
"description": "Final opacity (defaults to current)",
"minimum": 0,
"maximum": 1
}
},
"required": ["itemId", "targetMode"]
}
pinepaper_add_interactive_blend
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Add interactive blend mode cycling triggered by mouse events.
Input Schema:
{
"type": "object",
"properties": {
"itemId": { "type": "string" },
"event": {
"type": "string",
"enum": ["hover", "click"],
"description": "Trigger event type",
"default": "hover"
},
"modes": {
"type": "array",
"items": { "type": "string" },
"description": "Blend modes to cycle through",
"default": ["normal", "screen"]
},
"opacities": {
"type": "array",
"items": { "type": "number" },
"description": "Opacity for each mode",
"default": [1.0, 0.8]
}
},
"required": ["itemId"]
}
pinepaper_set_group_blend_mode
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Set blend mode for all items in a group with optional cascading opacity.
Input Schema:
{
"type": "object",
"properties": {
"groupId": {
"type": "string",
"description": "Group ID or item ID of a Paper.js Group"
},
"mode": {
"type": "string",
"description": "Blend mode to apply to all children"
},
"opacity": {
"type": "number",
"description": "Group opacity",
"minimum": 0,
"maximum": 1
},
"cascadeOpacity": {
"type": "boolean",
"description": "Multiply child opacity by group opacity",
"default": false
}
},
"required": ["groupId", "mode"]
}
pinepaper_set_opacity_reaction
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Configure automatic blend mode switching based on item opacity thresholds.
Input Schema:
{
"type": "object",
"properties": {
"itemId": { "type": "string" },
"thresholds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"opacity": {
"type": "number",
"description": "Opacity threshold (blend mode activates when item opacity <= this value)"
},
"blendMode": {
"type": "string",
"description": "Blend mode to apply at this threshold"
}
},
"required": ["opacity", "blendMode"]
},
"description": "Opacity thresholds sorted from lowest to highest"
}
},
"required": ["itemId", "thresholds"]
}
Example:
{
"itemId": "item_1",
"thresholds": [
{ "opacity": 0.2, "blendMode": "screen" },
{ "opacity": 0.5, "blendMode": "multiply" }
]
}
When item_1’s opacity drops below 0.2, blend mode switches to “screen”. Between 0.2 and 0.5, it uses “multiply”.
Image Filter Tools
GPU-accelerated image filters for raster items. Filters run on the GPU via WebGL shaders for real-time performance.
pinepaper_apply_image_filter
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply a single GPU filter to a raster item.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Item registry ID of the raster item"
},
"filterName": {
"type": "string",
"enum": [
"grayscale", "sepia", "brightness", "contrast", "saturation",
"invert", "posterize", "hsl", "colorTint", "vignette",
"edgeDetect", "blur"
],
"description": "Filter to apply"
},
"params": {
"type": "object",
"description": "Filter-specific parameters (e.g., { \"amount\": 1.5 } for brightness, { \"hue\": 30, \"saturation\": 0.5, \"lightness\": 0.1 } for hsl)"
}
},
"required": ["itemId", "filterName"]
}
Output:
{
"success": true
}
pinepaper_apply_filter_chain
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply multiple filters in a single GPU pass for efficient composited effects.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Item registry ID of the raster item"
},
"filters": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"enum": [
"grayscale", "sepia", "brightness", "contrast", "saturation",
"invert", "posterize", "hsl", "colorTint", "vignette",
"edgeDetect", "blur"
],
"description": "Filter name"
},
"params": {
"type": "object",
"description": "Filter-specific parameters"
}
},
"required": ["name"]
},
"description": "Ordered list of filters to apply in sequence"
}
},
"required": ["itemId", "filters"]
}
Output:
{
"success": true
}
Lasso Tools
Freehand lasso selection for extracting regions from raster images on the canvas.
pinepaper_lasso_activate
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Activate lasso mode on an image, enabling freehand selection drawing.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Item registry ID of the raster item to select from"
}
},
"required": ["itemId"]
}
Output:
{
"success": true,
"message": "Lasso mode activated"
}
pinepaper_lasso_apply
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply the current lasso selection to extract the selected region as a new cutout item.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"cutoutId": "item_5"
}
Cutout Style Tools
Apply visual style presets to image cutouts for creative effects.
pinepaper_apply_cutout_style
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply a visual style preset to a cutout item.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Item registry ID of the cutout item"
},
"preset": {
"type": "string",
"enum": [
"papercut", "postcard", "sticker", "poster",
"monochromeCut", "edgeSketch", "warmGlow", "coolTone"
],
"description": "Style preset to apply"
},
"options": {
"type": "object",
"description": "Optional preset-specific overrides (e.g., { \"borderWidth\": 4, \"shadowColor\": \"#000\" })"
}
},
"required": ["itemId", "preset"]
}
Output:
{
"success": true
}
pinepaper_get_cutout_styles
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
List all available cutout style presets with their descriptions.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"presets": [
{ "name": "papercut", "displayName": "Paper Cut", "description": "Rough-edge paper cutout with drop shadow" },
{ "name": "postcard", "displayName": "Postcard", "description": "Rounded corners with white border and stamp texture" },
{ "name": "sticker", "displayName": "Sticker", "description": "Thick white outline with slight tilt and shadow" },
{ "name": "poster", "displayName": "Poster", "description": "High-contrast posterized colors with halftone dots" },
{ "name": "monochromeCut", "displayName": "Monochrome Cut", "description": "Grayscale cutout with sharp edges" },
{ "name": "edgeSketch", "displayName": "Edge Sketch", "description": "Pencil-sketch outline extracted from edges" },
{ "name": "warmGlow", "displayName": "Warm Glow", "description": "Warm color tint with soft vignette" },
{ "name": "coolTone", "displayName": "Cool Tone", "description": "Cool blue-tinted desaturated look" }
]
}
View Tools
Control canvas zoom, pan, and viewport fitting.
pinepaper_zoom
⚠️ Not a tool. This operation is
pinepaper_camera { action: "zoom" }. The parameters below still apply; the entry point moved.
Zoom the canvas in or out.
Input Schema:
{
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": ["in", "out", "reset", "set"],
"description": "Zoom action"
},
"level": {
"type": "number",
"description": "Zoom level (only for action='set'). 1.0 = 100%"
}
},
"required": ["action"]
}
Output:
{
"success": true,
"zoomLevel": 1.5
}
pinepaper_pan
⚠️ Not a tool. This operation is
pinepaper_camera { action: "pan" }. The parameters below still apply; the entry point moved.
Pan the canvas view.
Input Schema:
{
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": ["by", "to"],
"description": "'by' pans by offset, 'to' pans to absolute coordinates"
},
"x": { "type": "number", "description": "X offset or coordinate" },
"y": { "type": "number", "description": "Y offset or coordinate" }
},
"required": ["action", "x", "y"]
}
Output:
{
"success": true
}
pinepaper_fit_view
⚠️ Not a tool. This operation is
pinepaper_camera { action: "fit_view" }. The parameters below still apply; the entry point moved.
Fit canvas content into the viewport.
Input Schema:
{
"type": "object",
"properties": {
"mode": {
"type": "string",
"enum": ["content", "canvas"],
"description": "'content' fits all items, 'canvas' fits the canvas bounds"
},
"padding": {
"type": "number",
"description": "Optional padding in pixels around the content"
}
}
}
Output:
{
"success": true,
"zoomLevel": 0.85
}
pinepaper_get_view_state
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Get current view state (zoom level, scroll position).
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"zoomLevel": 1.2,
"center": { "x": 400, "y": 300 },
"bounds": { "x": 0, "y": 0, "width": 800, "height": 600 }
}
Selection Tools
Manage item selection programmatically.
pinepaper_select
⚠️ Not a tool. This operation is
pinepaper_selection { action: "select" }. The parameters below still apply; the entry point moved.
Select items by ID, name, or type.
Input Schema:
{
"type": "object",
"properties": {
"itemIds": {
"type": "array",
"items": { "type": "string" },
"description": "Array of item IDs to select"
},
"mode": {
"type": "string",
"enum": ["replace", "add", "remove"],
"default": "replace",
"description": "'replace' clears existing selection, 'add' adds to it, 'remove' removes from it"
}
},
"required": ["itemIds"]
}
Output:
{
"success": true,
"selectedCount": 3
}
pinepaper_select_all
⚠️ Not a tool. This operation is
pinepaper_selection { action: "select_all" }. The parameters below still apply; the entry point moved.
Select all items on the canvas.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"selectedCount": 12
}
pinepaper_deselect_all
⚠️ Not a tool. This operation is
pinepaper_selection { action: "deselect_all" }. The parameters below still apply; the entry point moved.
Clear all selection.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true
}
pinepaper_get_selection
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Get currently selected items.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"items": [
{ "id": "item_1", "type": "text", "name": "Title" },
{ "id": "item_3", "type": "circle", "name": null }
]
}
pinepaper_delete_selected
⚠️ Not a tool. This operation is
pinepaper_selection { action: "delete_selected" }. The parameters below still apply; the entry point moved.
Delete all currently selected items.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"deletedCount": 2
}
Transform Tools
Transform items: nudge, flip, and reorder in stacking order.
pinepaper_nudge
⚠️ Not a tool. This operation is
pinepaper_transform { action: "nudge" }. The parameters below still apply; the entry point moved.
Move selected items by a pixel offset.
Input Schema:
{
"type": "object",
"properties": {
"dx": { "type": "number", "description": "Horizontal offset in pixels" },
"dy": { "type": "number", "description": "Vertical offset in pixels" }
},
"required": ["dx", "dy"]
}
Output:
{
"success": true
}
pinepaper_flip
⚠️ Not a tool. This operation is
pinepaper_transform { action: "flip" }. The parameters below still apply; the entry point moved.
Flip selected items horizontally or vertically.
Input Schema:
{
"type": "object",
"properties": {
"direction": {
"type": "string",
"enum": ["horizontal", "vertical"],
"description": "Flip direction"
}
},
"required": ["direction"]
}
Output:
{
"success": true
}
pinepaper_reorder
⚠️ Not a tool. This operation is
pinepaper_manage_scenes { action: "reorder" }. The parameters below still apply; the entry point moved.
Change stacking order of selected items.
Input Schema:
{
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": ["bringToFront", "sendToBack", "moveUp", "moveDown"],
"description": "Stacking order action"
}
},
"required": ["action"]
}
Output:
{
"success": true
}
Background Tools
Control canvas background color, pattern, or procedural generator.
pinepaper_set_background
⚠️ Not a tool. This operation is
pinepaper_agent_batch_execute { action: "set_background" }. The parameters below still apply; the entry point moved.
Set the canvas background.
Input Schema:
{
"type": "object",
"properties": {
"mode": {
"type": "string",
"enum": ["color", "pattern", "generator"],
"description": "Background mode"
},
"color": {
"type": "string",
"description": "Background color (hex). Used when mode='color'"
},
"pattern": {
"type": "string",
"description": "Pattern type name. Used when mode='pattern'"
},
"generator": {
"type": "string",
"description": "Generator name. Used when mode='generator'"
},
"generatorParams": {
"type": "object",
"description": "Generator parameters. Used when mode='generator'"
}
},
"required": ["mode"]
}
Output:
{
"success": true,
"mode": "color",
"value": "#1a1a2e"
}
pinepaper_clear_background
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Clear the canvas background to transparent.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true
}
pinepaper_get_background
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Get current background state.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"mode": "generator",
"generator": "starfield",
"params": { "starCount": 200, "twinkle": true }
}
History Tools
Manage undo/redo and edit history.
pinepaper_undo
⚠️ Not a tool. This operation is
pinepaper_history { action: "undo" }. The parameters below still apply; the entry point moved.
Undo the last action.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"canUndo": true,
"canRedo": true
}
pinepaper_redo
⚠️ Not a tool. This operation is
pinepaper_history { action: "redo" }. The parameters below still apply; the entry point moved.
Redo the last undone action.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"canUndo": true,
"canRedo": false
}
pinepaper_get_history_state
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Get current history state.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"canUndo": true,
"canRedo": false,
"historyLength": 15,
"currentIndex": 14
}
pinepaper_clear_canvas
Clear the entire canvas (all items, drawings, and background).
Input Schema:
{
"type": "object",
"properties": {
"keepBackground": {
"type": "boolean",
"default": false,
"description": "If true, preserves the background setting"
}
}
}
Output:
{
"success": true
}
Advanced Query Tools
Query items by name, type, position, or custom matchers.
pinepaper_query_items
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Query items using flexible matchers.
Input Schema:
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Filter by item name (exact or partial match)"
},
"type": {
"type": "string",
"description": "Filter by item type (e.g., 'text', 'circle', 'Raster')"
},
"withinBounds": {
"type": "object",
"properties": {
"x": { "type": "number" },
"y": { "type": "number" },
"width": { "type": "number" },
"height": { "type": "number" }
},
"description": "Filter items within a bounding rectangle"
},
"hasAnimation": {
"type": "boolean",
"description": "Filter by whether item is animated"
},
"limit": {
"type": "number",
"description": "Maximum number of results"
}
}
}
Output:
{
"success": true,
"items": [
{
"id": "item_1",
"type": "text",
"name": "Title",
"position": { "x": 400, "y": 100 },
"bounds": { "x": 320, "y": 80, "width": 160, "height": 40 }
}
],
"count": 1
}
pinepaper_get_item_by_id
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Get detailed information about a specific item.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Item registry ID"
}
},
"required": ["itemId"]
}
Output:
{
"success": true,
"item": {
"id": "item_5",
"type": "text",
"name": "Heading",
"position": { "x": 400, "y": 200 },
"bounds": { "x": 300, "y": 180, "width": 200, "height": 40 },
"rotation": 0,
"opacity": 1,
"visible": true,
"hasAnimation": true,
"hasRelations": false,
"isMasked": false
}
}
pinepaper_hit_test
⚠️ Not a tool. This operation is
pinepaper_query { action: "hit_test" }. The parameters below still apply; the entry point moved.
Find items at a specific canvas point.
Input Schema:
{
"type": "object",
"properties": {
"x": { "type": "number", "description": "X coordinate" },
"y": { "type": "number", "description": "Y coordinate" },
"all": {
"type": "boolean",
"default": false,
"description": "If true, return all items at point (not just topmost)"
},
"tolerance": {
"type": "number",
"default": 5,
"description": "Hit test tolerance in pixels"
}
},
"required": ["x", "y"]
}
Output:
{
"success": true,
"items": [
{ "id": "item_3", "type": "circle" }
]
}
pinepaper_is_empty
⚠️ Not a tool. This operation is
pinepaper_query { action: "is_empty" }. The parameters below still apply; the entry point moved.
Check if the canvas has any content.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"empty": false,
"itemCount": 8
}
Precomp Tools
Create and manage nested compositions (precomps) with independent local timelines.
pinepaper_create_precomp
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Group items into a precomp with an independent timeline.
Input Schema:
{
"type": "object",
"properties": {
"itemIds": {
"type": "array",
"items": { "type": "string" },
"description": "Array of item IDs to include in the precomp"
},
"name": {
"type": "string",
"description": "Optional name for the precomp"
},
"loop": {
"type": "boolean",
"default": true,
"description": "Whether the precomp timeline loops"
},
"duration": {
"type": "number",
"description": "Precomp timeline duration in seconds"
}
},
"required": ["itemIds"]
}
Output:
{
"success": true,
"precompId": "item_20"
}
pinepaper_add_to_precomp
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Add an item to an existing precomp.
Input Schema:
{
"type": "object",
"properties": {
"precompId": { "type": "string", "description": "Precomp item ID" },
"itemId": { "type": "string", "description": "Item to add" }
},
"required": ["precompId", "itemId"]
}
Output:
{
"success": true
}
pinepaper_remove_from_precomp
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Remove an item from a precomp.
Input Schema:
{
"type": "object",
"properties": {
"precompId": { "type": "string", "description": "Precomp item ID" },
"itemId": { "type": "string", "description": "Item to remove" }
},
"required": ["precompId", "itemId"]
}
Output:
{
"success": true
}
Playback Tools
Control keyframe timeline playback.
pinepaper_play_timeline
Start or resume keyframe timeline playback.
Input Schema:
{
"type": "object",
"properties": {
"duration": {
"type": "number",
"description": "Timeline duration in seconds. If omitted, uses existing duration."
},
"loop": {
"type": "boolean",
"default": false,
"description": "Whether to loop playback"
}
}
}
Output:
{
"success": true,
"playing": true
}
pinepaper_stop_timeline
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Stop timeline playback and reset to start.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"playing": false
}
pinepaper_pause_timeline
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Pause timeline playback at current position.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"playing": false
}
pinepaper_seek_timeline
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Seek to a specific time position.
Input Schema:
{
"type": "object",
"properties": {
"time": {
"type": "number",
"description": "Time position in seconds (0 to duration)"
}
},
"required": ["time"]
}
Output:
{
"success": true,
"currentTime": 1.5
}
3D Projection Tools
Create and manipulate 3D objects on the 2D canvas using PinePaper’s standalone 3D projection library. Objects are rendered as depth-sorted, lit polygons projected through configurable camera and projection systems.
Architecture: The 3D library (js/3d/) is zero-dependency and outputs renderer-agnostic polygon descriptors. GPU acceleration (WebGPU/WebGL2) is automatic for scenes above 150 faces.
pinepaper_create_3d_object
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Create a 3D primitive projected onto the 2D canvas with simulated lighting and depth-sorted face rendering.
Input Schema:
{
"type": "object",
"properties": {
"objectType": {
"type": "string",
"enum": ["cube", "sphere", "cylinder", "torus", "cone"],
"description": "Type of 3D primitive to create"
},
"x": {
"type": "number",
"description": "World X position (default: 0)"
},
"y": {
"type": "number",
"description": "World Y position (default: 0)"
},
"z": {
"type": "number",
"description": "World Z position (default: 0)"
},
"color": {
"type": "string",
"description": "Face color as hex string (default: '#cccccc')"
},
"size": {
"type": "number",
"description": "Cube size (cube only, default: 1)"
},
"radius": {
"type": "number",
"description": "Radius (sphere, cylinder, torus, cone; default: 0.5)"
},
"height": {
"type": "number",
"description": "Height (cylinder, cone; default: 1)"
},
"tube": {
"type": "number",
"description": "Tube radius (torus only; default: 0.2)"
},
"rotationX": {
"type": "number",
"description": "X rotation in degrees (default: 0)"
},
"rotationY": {
"type": "number",
"description": "Y rotation in degrees (default: 0)"
},
"rotationZ": {
"type": "number",
"description": "Z rotation in degrees (default: 0)"
},
"scale": {
"type": "number",
"description": "Uniform scale factor (default: 1)"
},
"animationType": {
"type": "string",
"enum": ["rotate"],
"description": "Animation type (optional)"
},
"animationSpeed": {
"type": "number",
"description": "Rotation speed multiplier (default: 1)"
}
},
"required": ["objectType"]
}
Output:
{
"success": true,
"itemId": "item_42",
"objectType": "cube",
"faces": 6,
"message": "Created 3D cube with 6 faces"
}
Face Counts by Primitive:
| Primitive | Default Faces | Key Parameters |
|---|---|---|
cube |
6 quads | size |
sphere |
~96 triangles | radius, widthSegments (12), heightSegments (8) |
cylinder |
~34 | radius, height, segments (16) |
torus |
~192 | radius, tube, radialSegments (12), tubularSegments (16) |
cone |
~17 | radius, height, segments (16) |
pinepaper_create_glossy_sphere
Create a glossy 2D sphere effect using layered radial gradients with shadow. This is a purely 2D effect (no 3D projection) that simulates a shiny sphere appearance.
Input Schema:
{
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "X position on canvas (default: center)"
},
"y": {
"type": "number",
"description": "Y position on canvas (default: center)"
},
"radius": {
"type": "number",
"description": "Sphere radius in pixels (default: 50)"
},
"color": {
"type": "string",
"description": "Base sphere color as hex (default: '#4a9eff')"
},
"lightDirection": {
"type": "string",
"enum": ["top-left", "top-right", "top", "left", "right", "bottom-left", "bottom-right"],
"description": "Direction of the light source (default: 'top-left')"
},
"glossiness": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Glossiness level from 0 to 1 (default: 0.7)"
},
"castShadow": {
"type": "boolean",
"description": "Whether to cast a shadow (default: true)"
},
"shadowBlur": {
"type": "number",
"description": "Shadow blur amount in pixels (default: 15)"
}
}
}
Output:
{
"success": true,
"itemId": "item_43",
"message": "Created glossy sphere with radius 60"
}
pinepaper_set_3d_projection
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Set the 3D scene projection type. Affects how 3D objects are rendered on the 2D canvas.
Input Schema:
{
"type": "object",
"properties": {
"projectionType": {
"type": "string",
"enum": ["perspective", "orthographic", "isometric", "cabinet", "cavalier"],
"description": "Projection type"
},
"fov": {
"type": "number",
"description": "Field of view in degrees (perspective only; default: 60)"
},
"aspect": {
"type": "number",
"description": "Aspect ratio (perspective only; default: 1)"
},
"near": {
"type": "number",
"description": "Near clipping plane (perspective/orthographic; default: 0.1 or -500)"
},
"far": {
"type": "number",
"description": "Far clipping plane (perspective/orthographic; default: 1000 or 500)"
},
"width": {
"type": "number",
"description": "View width (orthographic only; default: 400)"
},
"height": {
"type": "number",
"description": "View height (orthographic only; default: 400)"
},
"scale": {
"type": "number",
"description": "Scale factor (isometric only; default: 1)"
},
"angle": {
"type": "number",
"description": "Shear angle in degrees (cabinet/cavalier; default: 45)"
},
"depthScale": {
"type": "number",
"description": "Depth scale factor (cabinet only; default: 0.5)"
}
},
"required": ["projectionType"]
}
Output:
{
"success": true,
"projectionType": "isometric",
"message": "Set 3D projection to isometric"
}
Projection Comparison:
| Projection | Depth Reduction | Parallel Lines | Use Case |
|---|---|---|---|
perspective |
Yes (1/z) | No | Realistic visualization |
orthographic |
No | Yes | Technical drawings |
isometric |
No | Yes | Games, infographics |
cabinet |
Half (0.5) | Yes | Technical illustration |
cavalier |
No | Yes | Simple 3D diagrams |
pinepaper_set_3d_camera
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Set the 3D camera position and look-at target. Defines the viewpoint from which 3D objects are rendered.
Input Schema:
{
"type": "object",
"properties": {
"positionX": {
"type": "number",
"description": "Camera X position in world space (default: 0)"
},
"positionY": {
"type": "number",
"description": "Camera Y position in world space (default: 0)"
},
"positionZ": {
"type": "number",
"description": "Camera Z position in world space (default: 5)"
},
"targetX": {
"type": "number",
"description": "Look-at target X (default: 0)"
},
"targetY": {
"type": "number",
"description": "Look-at target Y (default: 0)"
},
"targetZ": {
"type": "number",
"description": "Look-at target Z (default: 0)"
},
"upX": {
"type": "number",
"description": "Up vector X (default: 0)"
},
"upY": {
"type": "number",
"description": "Up vector Y (default: 1)"
},
"upZ": {
"type": "number",
"description": "Up vector Z (default: 0)"
}
}
}
Output:
{
"success": true,
"position": { "x": 3, "y": 2, "z": 5 },
"target": { "x": 0, "y": 0, "z": 0 },
"message": "Camera positioned at (3, 2, 5) looking at origin"
}
28. Deformation Tools
Apply vertex-level geometric deformation presets to items. Deformation manipulates actual path geometry per frame, creating effects like eye blinks, jelly wobble, and traveling waves.
pinepaper_apply_deform
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply a looping deformation to an item.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Target item registry ID"
},
"preset": {
"type": "string",
"enum": ["fold", "squeeze", "squash", "pinch", "bulge", "twist", "ripple", "wave", "breathe", "melt", "shear", "inflate", "wobble"],
"description": "Deformation preset name"
},
"frequency": {
"type": "number",
"description": "Oscillation speed in cycles/sec (default: 1)",
"minimum": 0.1,
"maximum": 10
},
"amplitude": {
"type": "number",
"description": "Deformation strength 0-1 (default: 1)",
"minimum": 0,
"maximum": 1
},
"phase": {
"type": "string",
"enum": ["sin", "blink", "linear", "pingpong", "once", "elastic", "heartbeat", "stepped"],
"description": "Phase driver controlling when deformation cycles (default: sin)"
},
"axis": {
"type": "string",
"enum": ["horizontal", "vertical"],
"description": "Axis for fold preset (default: horizontal)"
},
"waves": {
"type": "number",
"description": "Wave count for ripple/wave presets (default: 3)"
},
"speed": {
"type": "number",
"description": "Travel speed for wave preset (default: 1)"
},
"maxDisplacement": {
"type": "number",
"description": "Max pixel displacement for ripple/wave/wobble (default: 10)"
},
"turns": {
"type": "number",
"description": "Rotation amount for twist preset (default: 0.5)"
}
},
"required": ["itemId", "preset"]
}
Output:
{
"success": true,
"message": "Applied 'fold' deformation to item_1"
}
pinepaper_remove_deform
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Remove deformation from an item, restoring original geometry.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Target item registry ID"
}
},
"required": ["itemId"]
}
pinepaper_trigger_deform
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply a one-shot deformation that plays once and auto-removes.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Target item registry ID"
},
"preset": {
"type": "string",
"enum": ["fold", "squeeze", "squash", "pinch", "bulge", "twist", "ripple", "wave", "breathe", "melt", "shear", "inflate", "wobble"],
"description": "Deformation preset name"
},
"frequency": {
"type": "number",
"description": "Playback speed (default: 1)"
},
"amplitude": {
"type": "number",
"description": "Deformation strength 0-1 (default: 1)"
}
},
"required": ["itemId", "preset"]
}
29. Sprite Sheet Tools
pinepaper_generate_sprite_sheet
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Generate a sprite sheet from a rigged skeleton’s poses. Captures each pose as a frame, packs into a texture atlas, and returns TexturePacker-compatible metadata.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to generate sprite sheet from"
},
"mode": {
"type": "string",
"enum": ["poses", "transition", "cycle", "baked"],
"description": "Generation mode: explicit poses, interpolated transition, multi-pose cycle, or baked animation"
},
"poses": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": { "type": "string" },
"poseId": { "type": "string" }
}
},
"description": "Explicit pose list (for mode=poses)"
},
"transition": {
"type": "object",
"properties": {
"poseIdA": { "type": "string" },
"poseIdB": { "type": "string" },
"frameCount": { "type": "number", "default": 8 },
"name": { "type": "string", "default": "transition" }
},
"description": "Transition config (for mode=transition)"
},
"cycle": {
"type": "object",
"properties": {
"poseIds": { "type": "array", "items": { "type": "string" } },
"framesPerTransition": { "type": "number", "default": 4 },
"name": { "type": "string", "default": "cycle" },
"loop": { "type": "boolean", "default": true }
},
"description": "Pose cycle config (for mode=cycle)"
},
"bakedAnimation": {
"type": "object",
"properties": {
"duration": { "type": "number", "default": 2 },
"fps": { "type": "number", "default": 12 },
"name": { "type": "string", "default": "animation" }
},
"description": "Baked animation config (for mode=baked)"
},
"padding": { "type": "number", "default": 1, "description": "Padding between frames in atlas" },
"framePadding": { "type": "number", "default": 4, "description": "Padding around character in each frame" },
"allowRotation": { "type": "boolean", "default": false, "description": "Allow 90-deg rotation for tighter packing" },
"maxAtlasSize": { "type": "number", "default": 4096, "description": "Maximum atlas dimension" },
"fps": { "type": "number", "default": 12, "description": "Default animation FPS" }
},
"required": ["skeletonId", "mode"]
}
Output:
{
"success": true,
"spriteSheetId": "spritesheet_1",
"atlasSize": { "w": 512, "h": 256 },
"frameCount": 12,
"animations": ["walk"],
"metadata": { "frames": {}, "animations": {}, "meta": {} }
}
pinepaper_play_sprite_sheet
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Play a sprite sheet animation on the canvas using a Paper.js Raster item.
Input Schema:
{
"type": "object",
"properties": {
"spriteSheetId": { "type": "string", "description": "ID of generated sprite sheet" },
"x": { "type": "number", "description": "Canvas X position" },
"y": { "type": "number", "description": "Canvas Y position" },
"animation": { "type": "string", "description": "Animation name to play" },
"fps": { "type": "number", "default": 12, "description": "Playback FPS" },
"loop": { "type": "boolean", "default": true },
"scale": { "type": "number", "default": 1, "description": "Render scale" },
"autoPlay": { "type": "boolean", "default": true }
},
"required": ["spriteSheetId"]
}
Output:
{
"success": true,
"playerId": "player_1",
"animation": "walk",
"playing": true
}
pinepaper_export_sprite_sheet
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Export a sprite sheet as downloadable atlas image + metadata JSON files.
Input Schema:
{
"type": "object",
"properties": {
"spriteSheetId": { "type": "string", "description": "ID of generated sprite sheet" },
"format": { "type": "string", "enum": ["png", "webp"], "default": "png" },
"includeMetadata": { "type": "boolean", "default": true, "description": "Include TexturePacker JSON file" },
"download": { "type": "boolean", "default": true, "description": "Trigger browser download" }
},
"required": ["spriteSheetId"]
}
Output:
{
"success": true,
"atlasDataUrl": "data:image/png;base64,...",
"format": "png",
"metadataIncluded": true
}
30. Shape Key Tools
Shape keys capture per-item visual state (size, opacity, color, path segments) as named blend shapes. Used for facial animation (blink, smile, frown) with weighted interpolation between rest pose and target state.
pinepaper_save_shape_key
⚠️ Not a tool. This operation is
pinepaper_rigging { action: "save_shape_key" }. The parameters below still apply; the entry point moved.
Capture the current visual state of all attached items as a named shape key (blend shape).
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to save shape key for"
},
"name": {
"type": "string",
"description": "Shape key name (e.g., 'blink', 'smile', 'openMouth')"
}
},
"required": ["skeletonId", "name"]
}
Output:
{
"success": true,
"shapeKeyId": "sk_blink_1"
}
pinepaper_load_shape_key
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply a saved shape key with weighted interpolation (0=rest pose, 1=full shape key).
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to apply shape key to"
},
"shapeKeyId": {
"type": "string",
"description": "Shape key ID to load"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"default": 1,
"description": "Blend weight (0=rest, 1=full shape key)"
}
},
"required": ["skeletonId", "shapeKeyId"]
}
Output:
{
"success": true,
"shapeKeyId": "sk_blink_1",
"weight": 0.5
}
pinepaper_remove_shape_key
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Delete a saved shape key.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton owning the shape key"
},
"shapeKeyId": {
"type": "string",
"description": "Shape key ID to remove"
}
},
"required": ["skeletonId", "shapeKeyId"]
}
Output:
{
"success": true
}
pinepaper_list_shape_keys
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
List all saved shape keys for a skeleton.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to list shape keys for"
}
},
"required": ["skeletonId"]
}
Output:
{
"success": true,
"shapeKeys": [
{ "id": "sk_blink_1", "name": "blink" },
{ "id": "sk_smile_1", "name": "smile" },
{ "id": "sk_openMouth_1", "name": "openMouth" }
]
}
pinepaper_add_shape_key_keyframe
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Add a keyframe for shape key animation on the timeline. Multiple shape keys can be active at the same time with additive blending.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to animate"
},
"time": {
"type": "number",
"description": "Keyframe time in seconds"
},
"keys": {
"type": "object",
"additionalProperties": { "type": "number" },
"description": "Shape key ID to weight map (e.g., { 'sk_blink_1': 1, 'sk_smile_1': 0.5 })"
},
"easing": {
"type": "string",
"default": "linear",
"description": "Easing function for this keyframe"
}
},
"required": ["skeletonId", "time", "keys"]
}
Output:
{
"success": true
}
pinepaper_remove_shape_key_keyframes
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Remove all shape key keyframes from a skeleton’s timeline.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to clear keyframes for"
}
},
"required": ["skeletonId"]
}
Output:
{
"success": true
}
31. Procedural Animation Tools
One-call procedural animation helpers that create pose layers for common effects. These run automatically each frame using the skeleton’s saved poses.
pinepaper_auto_breath
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply automatic breathing animation to a skeleton. Subtly rotates specified bones with a sine wave.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to animate"
},
"bones": {
"type": "array",
"items": { "type": "string" },
"description": "Bone names to affect (e.g., ['spine', 'chest'])"
},
"frequency": {
"type": "number",
"description": "Breathing cycles per second"
},
"amplitude": {
"type": "number",
"default": 0.03,
"description": "Max rotation delta in radians"
}
},
"required": ["skeletonId"]
}
Output:
{
"success": true,
"layerId": "layer_breath_1"
}
pinepaper_auto_idle
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply automatic idle sway animation to a skeleton.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to animate"
},
"bones": {
"type": "array",
"items": { "type": "string" },
"description": "Bone names to affect"
},
"frequency": {
"type": "number",
"description": "Oscillation frequency"
},
"intensity": {
"type": "number",
"default": 1,
"minimum": 0,
"maximum": 1,
"description": "Motion intensity (0-1)"
}
},
"required": ["skeletonId"]
}
Output:
{
"success": true,
"layerId": "layer_idle_1"
}
pinepaper_auto_walk
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply automatic walk cycle animation using pose interpolation. Requires saved walk poses in the skeleton’s pose library.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to animate"
},
"bones": {
"type": "array",
"items": { "type": "string" },
"description": "Bone names to affect"
},
"frequency": {
"type": "number",
"description": "Walk cycle frequency"
},
"cycleDistance": {
"type": "number",
"description": "Pixels traveled per walk cycle"
},
"poseIdMap": {
"type": "object",
"additionalProperties": { "type": "string" },
"description": "Pose name to ID map from loadPoseLibrary (e.g., { 'walk_contact_L': 'pose_1' })"
}
},
"required": ["skeletonId"]
}
Output:
{
"success": true,
"layerId": "layer_walk_1",
"callbackId": "cb_walk_1"
}
pinepaper_auto_jump
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply a physics-based jump with parabolic root arc, impact compression, and auto-cleanup.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to animate"
},
"height": {
"type": "number",
"default": 100,
"description": "Jump apex height in pixels"
},
"duration": {
"type": "number",
"default": 0.6,
"description": "Total jump duration in seconds"
},
"poseIdMap": {
"type": "object",
"additionalProperties": { "type": "string" },
"description": "Pose name to ID map for jump/land poses"
}
},
"required": ["skeletonId"]
}
Output:
{
"success": true,
"layerId": "layer_jump_1",
"callbackId": "cb_jump_1"
}
32. Bone Physics Tools
Verlet physics simulation on bones with spring motors that blend between animation targets and physics simulation. Enables ragdoll, hit reactions, jiggle/secondary motion (hair, tails, cloth), and colliders.
pinepaper_enable_physics
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Enable bone-level Verlet physics on a skeleton. Physics particles are created for each bone and spring motors pull them toward FK/IK animation targets.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to enable physics on"
},
"fromBone": {
"type": "string",
"description": "Start physics from this bone downward (null = all bones)"
},
"blendWeight": {
"type": "number",
"default": 0.3,
"minimum": 0,
"maximum": 1,
"description": "Default blend weight (0=pure animation, 1=full physics)"
},
"gravity": {
"type": "object",
"properties": {
"x": { "type": "number", "default": 0 },
"y": { "type": "number", "default": 980 }
},
"description": "Gravity vector in pixels/sec²"
},
"stiffness": {
"type": "number",
"default": 200,
"description": "Spring motor strength pulling toward animation targets"
},
"damping": {
"type": "number",
"default": 15,
"description": "Velocity damping factor"
},
"iterations": {
"type": "number",
"default": 3,
"description": "Constraint solver iterations per step"
}
},
"required": ["skeletonId"]
}
Output:
{
"success": true,
"skeletonId": "skeleton_1",
"boneCount": 15
}
pinepaper_disable_physics
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Disable Verlet physics on a skeleton, returning to pure animation control.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to disable physics on"
}
},
"required": ["skeletonId"]
}
Output:
{
"success": true
}
pinepaper_set_physics_blend_weight
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Set the blend weight between animation and physics for specific bones or all bones.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to configure"
},
"boneId": {
"type": "string",
"description": "Bone ID, or 'all' for every bone"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Blend weight (0=animation, 1=full physics)"
}
},
"required": ["skeletonId", "boneId", "weight"]
}
Output:
{
"success": true
}
pinepaper_apply_physics_impulse
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply an instantaneous force impulse to a bone (for hit reactions, explosions, etc.).
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton containing the bone"
},
"boneId": {
"type": "string",
"description": "Bone to receive the impulse"
},
"impulse": {
"type": "object",
"properties": {
"x": { "type": "number", "description": "Horizontal force in pixels/sec" },
"y": { "type": "number", "description": "Vertical force in pixels/sec" }
},
"required": ["x", "y"],
"description": "Force vector"
}
},
"required": ["skeletonId", "boneId", "impulse"]
}
Output:
{
"success": true
}
pinepaper_set_jiggle
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Configure per-bone jiggle for secondary motion (hair, tails, accessories). Jiggle creates independent spring-damper oscillation.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton containing the bone"
},
"boneId": {
"type": "string",
"description": "Bone to add jiggle to"
},
"stiffness": {
"type": "number",
"default": 5,
"description": "Spring stiffness"
},
"damping": {
"type": "number",
"default": 0.8,
"description": "Damping factor (0-1)"
},
"gravity": {
"type": "number",
"default": 980,
"description": "Gravity influence in pixels/sec²"
}
},
"required": ["skeletonId", "boneId"]
}
Output:
{
"success": true
}
pinepaper_add_physics_collider
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Add a collision object for bone physics (ground plane, circle, or rect obstacle).
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to add collider for"
},
"collider": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": ["ground", "circle", "rect"],
"description": "Collider shape type"
},
"y": { "type": "number", "description": "Y position (for ground plane)" },
"x": { "type": "number", "description": "X position (for circle/rect)" },
"radius": { "type": "number", "description": "Radius (for circle)" },
"width": { "type": "number", "description": "Width (for rect)" },
"height": { "type": "number", "description": "Height (for rect)" }
},
"required": ["type"]
}
},
"required": ["skeletonId", "collider"]
}
Output:
{
"success": true,
"colliderIndex": 0
}
33. Physics World Tools
Rigid body physics for canvas items using Planck.js (Box2D). Simulates gravity, collision, friction, and restitution. Static bodies are immovable, dynamic bodies respond to forces, kinematic bodies follow animation and push dynamic bodies.
pinepaper_init_physics_world
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Initialize the physics world. Must be called before adding bodies.
Input Schema:
{
"type": "object",
"properties": {
"gravity": {
"type": "object",
"properties": {
"x": { "type": "number", "default": 0 },
"y": { "type": "number", "default": 980 }
},
"description": "Gravity vector in pixels/sec²"
}
}
}
Output:
{
"success": true
}
pinepaper_add_physics_body
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Add a physics body to a canvas item. The item will be simulated by the physics engine.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Canvas item registry ID"
},
"type": {
"type": "string",
"enum": ["static", "dynamic", "kinematic"],
"default": "dynamic",
"description": "Body type: static (immovable), dynamic (full physics), kinematic (animation-driven, pushes dynamic)"
},
"mass": { "type": "number", "default": 1, "description": "Body mass" },
"friction": { "type": "number", "default": 0.3, "description": "Surface friction (0-1)" },
"restitution": { "type": "number", "default": 0.3, "description": "Bounciness (0-1)" },
"density": { "type": "number", "default": 1, "description": "Body density" },
"fixedRotation": { "type": "boolean", "default": false, "description": "Prevent rotation" },
"shape": {
"type": "string",
"enum": ["auto", "circle", "rect"],
"default": "auto",
"description": "Collision shape (auto detects from item geometry)"
}
},
"required": ["itemId"]
}
Output:
{
"success": true,
"itemId": "item_1",
"type": "dynamic"
}
pinepaper_remove_physics_body
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Remove a physics body from a canvas item.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Canvas item registry ID"
}
},
"required": ["itemId"]
}
Output:
{
"success": true
}
pinepaper_create_physics_ground
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Create a static ground plane for physics objects to land on.
Input Schema:
{
"type": "object",
"properties": {
"y": {
"type": "number",
"description": "Y position of the ground plane in pixels"
},
"width": {
"type": "number",
"default": 2000,
"description": "Ground plane width in pixels"
}
},
"required": ["y"]
}
Output:
{
"success": true,
"groundId": "ground_1"
}
pinepaper_create_physics_joint
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Create a joint connecting two physics bodies.
Input Schema:
{
"type": "object",
"properties": {
"itemIdA": {
"type": "string",
"description": "First body's item ID"
},
"itemIdB": {
"type": "string",
"description": "Second body's item ID"
},
"type": {
"type": "string",
"enum": ["revolute", "distance", "weld", "prismatic"],
"default": "revolute",
"description": "Joint type"
},
"anchor": {
"type": "object",
"properties": {
"x": { "type": "number" },
"y": { "type": "number" }
},
"description": "Anchor point in canvas pixels"
},
"enableMotor": { "type": "boolean", "default": false },
"motorSpeed": { "type": "number", "default": 0 },
"maxMotorTorque": { "type": "number", "default": 100 },
"lowerAngle": { "type": "number", "description": "Lower angle limit in radians" },
"upperAngle": { "type": "number", "description": "Upper angle limit in radians" }
},
"required": ["itemIdA", "itemIdB"]
}
Output:
{
"success": true,
"jointType": "revolute"
}
pinepaper_apply_physics_force
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Apply a continuous force to a physics body (persists until removed or countered).
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Canvas item registry ID"
},
"force": {
"type": "object",
"properties": {
"x": { "type": "number", "description": "Horizontal force in pixels/sec²" },
"y": { "type": "number", "description": "Vertical force in pixels/sec²" }
},
"required": ["x", "y"]
}
},
"required": ["itemId", "force"]
}
Output:
{
"success": true
}
pinepaper_get_physics_body_state
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Get the current physics state of an item (position, velocity, angle).
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Canvas item registry ID"
}
},
"required": ["itemId"]
}
Output:
{
"success": true,
"x": 400,
"y": 300,
"angle": 0.15,
"vx": 50,
"vy": -120,
"type": "dynamic"
}
34. Character Controller Tools
Composable movement functions for rigged characters. Input-agnostic — can be triggered by AI, timeline, physics, or keyboard. Test mode enables arrow key control for interactive verification.
pinepaper_start_character_test
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Start keyboard-driven character test mode. Arrow keys control walk, up = jump, down = crouch.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to control"
},
"walkSpeed": {
"type": "number",
"default": 120,
"description": "Walk speed in pixels/second"
},
"jumpHeight": {
"type": "number",
"default": 100,
"description": "Jump height in pixels"
}
},
"required": ["skeletonId"]
}
Output:
{
"success": true,
"skeletonId": "skeleton_1",
"controls": "Arrow keys: Left/Right=walk, Up=jump, Down=crouch"
}
pinepaper_stop_character_test
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Stop keyboard-driven character test mode.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true
}
pinepaper_move_character_left
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Move a character to the left using walk animation.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to move"
},
"speed": {
"type": "number",
"default": 120,
"description": "Movement speed in pixels/second"
},
"delta": {
"type": "number",
"default": 0.0167,
"description": "Time step in seconds (default: 1/60)"
}
},
"required": ["skeletonId"]
}
Output:
{
"success": true,
"state": "walking",
"facingRight": false
}
pinepaper_move_character_right
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Move a character to the right using walk animation.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to move"
},
"speed": {
"type": "number",
"default": 120,
"description": "Movement speed in pixels/second"
},
"delta": {
"type": "number",
"default": 0.0167,
"description": "Time step in seconds (default: 1/60)"
}
},
"required": ["skeletonId"]
}
Output:
{
"success": true,
"state": "walking",
"facingRight": true
}
pinepaper_character_jump
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Make a character jump with parabolic arc and landing squash.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to jump"
},
"height": {
"type": "number",
"default": 100,
"description": "Jump apex height in pixels"
},
"duration": {
"type": "number",
"default": 0.6,
"description": "Total jump duration in seconds"
}
},
"required": ["skeletonId"]
}
Output:
{
"success": true,
"state": "jumping"
}
pinepaper_character_crouch
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Make a character crouch.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to crouch"
}
},
"required": ["skeletonId"]
}
Output:
{
"success": true,
"state": "crouching"
}
pinepaper_character_idle
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Return a character to idle pose.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to idle"
}
},
"required": ["skeletonId"]
}
Output:
{
"success": true,
"state": "idle"
}
35. Scene Sequencer Tools
Timeline-based multi-character action choreography. Schedule composable actions (walk, jump, crouch, custom) on a timeline for cinematic sequences. Supports LLM/AI script generation via buildScene.
pinepaper_create_scene
Create a new empty action sequence.
Input Schema:
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Optional sequence name"
}
}
}
Output:
{
"success": true,
"sequenceId": "seq_1"
}
pinepaper_add_scene_action
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Schedule an action for a character at a specific time in a sequence.
Input Schema:
{
"type": "object",
"properties": {
"sequenceId": {
"type": "string",
"description": "Sequence to add action to"
},
"skeletonId": {
"type": "string",
"description": "Target character skeleton"
},
"startTime": {
"type": "number",
"description": "Action start time in seconds"
},
"actionType": {
"type": "string",
"enum": ["moveLeft", "moveRight", "jump", "crouch", "idle", "stand"],
"description": "Action type (or custom registered action name)"
},
"duration": {
"type": "number",
"default": 1,
"description": "Action duration in seconds"
},
"speed": {
"type": "number",
"description": "Movement speed for walk actions"
},
"height": {
"type": "number",
"description": "Jump height for jump actions"
}
},
"required": ["sequenceId", "skeletonId", "startTime", "actionType"]
}
Output:
{
"success": true,
"actionId": "act_1"
}
pinepaper_build_scene
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Build a complete scene from a script array. Designed for LLM/AI scene generation — describe actions as a timeline of events.
Input Schema:
{
"type": "object",
"properties": {
"script": {
"type": "array",
"items": {
"type": "object",
"properties": {
"skeleton": { "type": "string", "description": "Skeleton ID" },
"time": { "type": "number", "description": "Start time in seconds" },
"action": { "type": "string", "description": "Action type" },
"params": {
"type": "object",
"description": "Action parameters (duration, speed, height, etc.)"
}
},
"required": ["skeleton", "time", "action"]
},
"description": "Array of timed actions forming the scene script"
},
"name": {
"type": "string",
"description": "Scene name"
},
"loop": {
"type": "boolean",
"default": false,
"description": "Loop the scene"
}
},
"required": ["script"]
}
Example script:
{
"script": [
{ "skeleton": "skeleton_1", "time": 0, "action": "idle", "params": { "duration": 1 } },
{ "skeleton": "skeleton_1", "time": 1, "action": "moveRight", "params": { "duration": 2, "speed": 150 } },
{ "skeleton": "skeleton_2", "time": 1.5, "action": "moveLeft", "params": { "duration": 1.5 } },
{ "skeleton": "skeleton_1", "time": 3, "action": "jump", "params": { "height": 120 } }
],
"name": "encounter",
"loop": false
}
Output:
{
"success": true,
"sequenceId": "seq_2",
"duration": 3.6,
"actionCount": 4
}
pinepaper_play_scene
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Play a scene sequence.
Input Schema:
{
"type": "object",
"properties": {
"sequenceId": {
"type": "string",
"description": "Sequence to play"
},
"speed": {
"type": "number",
"default": 1,
"description": "Playback speed multiplier"
},
"startTime": {
"type": "number",
"default": 0,
"description": "Start time in seconds"
}
},
"required": ["sequenceId"]
}
Output:
{
"success": true,
"playing": true
}
pinepaper_stop_scene
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Stop scene playback and reset to start.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true
}
pinepaper_pause_scene
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Pause scene playback at the current position.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"time": 2.5
}
pinepaper_resume_scene
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Resume paused scene playback.
Input Schema:
{
"type": "object",
"properties": {}
}
Output:
{
"success": true,
"playing": true
}
36. Advanced Rigging Tools
Extended rigging operations: guided rig builder, bone management, pole vectors, secondary motion chains, animation baking, and path skinning.
pinepaper_start_guided_rig
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Start the step-by-step guided rigging wizard. Walks through bone placement with visual highlights, auto-scales skeleton to selection bounds, and supports symmetry mirroring.
Input Schema:
{
"type": "object",
"properties": {
"itemIds": {
"type": "array",
"items": { "type": "string" },
"description": "Pre-selected item IDs to rig"
},
"preset": {
"type": "string",
"enum": ["humanoid", "quadruped", "bird", "simple_arm"],
"description": "Skeleton preset to use"
}
}
}
Output:
{
"success": true,
"wizardActive": true,
"preset": "humanoid"
}
pinepaper_remove_bone
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Remove a bone from a skeleton with child reparenting, IK chain cleanup, and item detachment.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton containing the bone"
},
"boneId": {
"type": "string",
"description": "Bone to remove"
}
},
"required": ["skeletonId", "boneId"]
}
Output:
{
"success": true
}
pinepaper_set_bone_length
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Adjust the length of a bone.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton containing the bone"
},
"boneId": {
"type": "string",
"description": "Bone to resize"
},
"length": {
"type": "number",
"minimum": 0,
"description": "New bone length in pixels"
}
},
"required": ["skeletonId", "boneId", "length"]
}
Output:
{
"success": true
}
pinepaper_set_pole_vector
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Set a pole vector constraint to control IK joint bend direction (e.g., knees forward, elbows back).
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton containing the IK chain"
},
"chainId": {
"type": "string",
"description": "IK chain ID"
},
"position": {
"type": "object",
"properties": {
"x": { "type": "number" },
"y": { "type": "number" }
},
"required": ["x", "y"],
"description": "Pole vector target position in canvas coordinates"
}
},
"required": ["skeletonId", "chainId", "position"]
}
Output:
{
"success": true
}
pinepaper_clear_pole_vector
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Remove a pole vector constraint from an IK chain.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton containing the IK chain"
},
"chainId": {
"type": "string",
"description": "IK chain ID"
}
},
"required": ["skeletonId", "chainId"]
}
Output:
{
"success": true
}
pinepaper_add_secondary_motion
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Add spring-based secondary motion to a chain of bones (tail, hair, cloth). Creates spring_follow relations with stagger delay.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton containing the bones"
},
"boneNames": {
"type": "array",
"items": { "type": "string" },
"description": "Ordered bone names forming the chain (e.g., ['tail_1', 'tail_2', 'tail_3'])"
},
"stiffness": {
"type": "number",
"description": "Spring stiffness"
},
"damping": {
"type": "number",
"description": "Spring damping"
},
"gravity": {
"type": "number",
"description": "Gravity influence"
},
"delay": {
"type": "number",
"default": 0.05,
"description": "Stagger delay per bone in seconds"
}
},
"required": ["skeletonId", "boneNames"]
}
Output:
{
"success": true,
"relationKeys": ["rel_1", "rel_2", "rel_3"]
}
pinepaper_bake_animation
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Convert bone-driven animation to plain item keyframes at configurable FPS. Useful for exporting rigged animation to formats that don’t support skeletons.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to bake animation from"
},
"includeRelations": {
"type": "boolean",
"default": true,
"description": "Also bake spring_follow and other relation animations"
}
},
"required": ["skeletonId"]
}
Output:
{
"success": true,
"itemCount": 8,
"keyframeCount": 120
}
pinepaper_skin_path
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Bind a path item’s vertices to nearby bones for per-vertex deformation (2D Linear Blend Skinning). Auto-computes bone weights based on vertex proximity.
Input Schema:
{
"type": "object",
"properties": {
"skeletonId": {
"type": "string",
"description": "Skeleton to bind to"
},
"itemId": {
"type": "string",
"description": "Path item to skin"
},
"maxInfluences": {
"type": "number",
"description": "Max bone influences per vertex"
},
"maxDistance": {
"type": "number",
"description": "Max distance for bone influence in pixels"
},
"falloff": {
"type": "number",
"default": 2,
"description": "Distance falloff exponent"
}
},
"required": ["skeletonId", "itemId"]
}
Output:
{
"success": true,
"vertexCount": 24,
"boneInfluences": 3
}
pinepaper_unskin_path
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Remove path skinning from an item, returning it to normal transform behavior.
Input Schema:
{
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Path item to unskin"
}
},
"required": ["itemId"]
}
Output:
{
"success": true
}
37. Scene Tools
Scene-level operations: part system for semantic grouping, scene baking for export, and animation suggestions.
pinepaper_add_parts
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Batch-create part_of relations from a role map. Used for semantic grouping (e.g., face parts: eye_left, eye_right, mouth).
Input Schema:
{
"type": "object",
"properties": {
"parentId": {
"type": "string",
"description": "Parent item ID"
},
"roleMap": {
"type": "object",
"additionalProperties": { "type": "string" },
"description": "Role name to child item ID map (e.g., { 'eye_left': 'item_3', 'mouth': 'item_7' })"
}
},
"required": ["parentId", "roleMap"]
}
Output:
{
"success": true,
"relationsCreated": 3
}
pinepaper_bake_scene
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Sample all animation systems (relations, rigging, callbacks) frame-by-frame into exportable keyframes with RDP path optimization. Used for Lottie export and other formats that need pre-baked animation.
Input Schema:
{
"type": "object",
"properties": {
"duration": {
"type": "number",
"description": "Scene duration in seconds"
},
"fps": {
"type": "number",
"description": "Sample rate (frames per second)"
},
"tolerance": {
"type": "number",
"description": "RDP simplification tolerance for keyframe reduction"
},
"includeCallbacks": {
"type": "boolean",
"default": true,
"description": "Include onFrame callback animations"
}
}
}
Output:
{
"success": true,
"itemCount": 12,
"duration": 5,
"fps": 30,
"stats": {
"totalKeyframes": 1500,
"optimizedKeyframes": 340
}
}
pinepaper_suggest_animations
⚠️ Not a tool as of 2026-08-16. It was consolidated or removed — find the current entry point in the generated tool index at the top of this document. The parameters below may still be accurate.
Read-only analysis that returns per-item animation suggestions based on canvas content and mood. Does NOT modify the canvas.
Input Schema:
{
"type": "object",
"properties": {
"mood": {
"type": "string",
"description": "Target mood for suggestions (e.g., 'energetic', 'calm', 'dramatic')"
}
}
}
Output:
{
"success": true,
"suggestions": [
{
"itemId": "item_1",
"itemType": "text",
"suggestedAnimation": "fadeIn",
"reasoning": "Title text works well with a subtle entrance"
},
{
"itemId": "item_2",
"itemType": "circle",
"suggestedAnimation": "pulse",
"reasoning": "Shape complements energetic mood with rhythmic scaling"
}
]
}
Implementation Notes
- Item IDs: All items are referenced by
item.data.registryId(e.g., “item_1”) - Positions: Canvas coordinates, (0,0) is top-left
- Colors: Hex (#RRGGBB), RGB, or named colors
- Async Operations: Generators may be async, return promises
- State Management: Call
historyManager.saveState()after batches - Relations: Process automatically each frame, no manual updates needed
- Rigging: FK/IK solving runs automatically in the update loop before relations; bone transforms are pre-computed
- Blending: Transitions process automatically each frame; blend mode snaps at transition midpoint while opacity cross-fades smoothly
- View Tools: Zoom level is relative (1.0 = 100%); pan coordinates are in canvas space
- Selection: Selection changes dispatch
selectionChangedevents; usedeselect_allbefore batch operations to avoid side effects - History: Undo/redo automatically saves/restores all canvas state including relations and animations
- 3D Projection: 3D objects are rendered as 2D polygons via a 5-stage pipeline (transform → cull → shade → project → sort). GPU acceleration (WebGPU/WebGL2) is automatic above 150 faces. Scene budget: ~500 faces max.
- Shape Keys: Multiple shape keys can be active simultaneously with additive blending. Save shape keys from the current visual state, then animate between them via keyframes or direct weight control.
- Bone Physics: Verlet physics runs in the update loop after FK/IK.
blendWeightcontrols the mix — 0 = pure animation, 1 = full physics. Spring motors automatically pull bones back toward animation targets. - Physics World: Must call
init_physics_worldbefore adding bodies. Kinematic bodies follow animation transforms and push dynamic bodies. Fixed-timestep accumulator prevents tunneling. - Character Controller: Movement functions are composable and input-agnostic. Walk cycle interpolates between saved poses. Test mode binds arrow keys for interactive verification.
- Scene Sequencer: Actions execute based on elapsed time. Multiple characters can act in parallel on the same timeline.
buildSceneis the primary LLM/AI entry point for choreography. - Path Skinning: Per-vertex bone weights are auto-computed from proximity. Works with any Paper.js path — curved paths get per-segment deformation. Call
unskinPathbefore deleting the skeleton. - Widget Export:
export_widgetproduces pp:PinePaper ontology JSON.export_widget_htmlproduces a self-contained HTML file with scene-specific tree-shaken code — only the item renderers and relation handlers used in the scene are included. Zero external dependencies. WCAG 2.1 AA accessible. Supports transparent backgrounds for overlays. - 3D Camera:
camera_animatessupportspitch(tilt) andyaw(rotation) params for cinematic 3D perspective. Uses CSSperspective+rotateX/rotateYfor GPU-accelerated compositing via PinePaper’s equirectangular projection pipeline. Three modes:keyframes(manual),fly_to(shorthand),orbit(revolve). Pitch/yaw interpolate between keyframes with easing.
Image & Detection Tools
Place raster images, run on-device object detection (no data leaves the device), extract regions, and compose graphics onto detected objects. Detection uses a quantized DETR model via transformers.js + ONNX (WebGPU when available, WASM fallback). This is bounding-box object detection over the COCO-80 label set — not pixel-mask segmentation (there is no SAM).
pinepaper_import_image
Place an uploaded library image (or a URL) onto the canvas.
Input Schema:
{
"type": "object",
"properties": {
"imageId": { "type": "string", "description": "Library id of an uploaded image. Omit to use the most recent upload." },
"url": { "type": "string", "description": "Image URL to fetch and place (alternative to imageId)." },
"x": { "type": "number", "description": "Center X on the canvas" },
"y": { "type": "number", "description": "Center Y on the canvas" },
"maxWidth": { "type": "number", "description": "Cap the placed width (aspect preserved)" },
"maxHeight": { "type": "number", "description": "Cap the placed height (aspect preserved)" }
}
}
Output: { "ok": true, "itemId": "item_12" }
pinepaper_detect_objects
Detect objects in an image. By default draws a labeled outline box over each detection. With asNodes: true, instead promotes each detection to a design node — the relational-compositing path.
Input Schema:
{
"type": "object",
"properties": {
"itemId": { "type": "string", "description": "Raster item to analyze. Omit to use the most recent image on the canvas." },
"threshold": { "type": "number", "description": "Confidence floor 0–1 (default 0.4). Lower = more, less-certain detections." },
"asNodes": { "type": "boolean", "description": "When true, promote each detection to a taxonomy-typed, image-anchored DESIGN NODE instead of drawing a box. Default false." }
}
}
Output (default — boxes):
{ "ok": true, "drawn": 3, "count": 3,
"detections": [ { "label": "dog", "confidence": 0.91 } ] }
Output (asNodes: true — design nodes):
{ "ok": true, "promoted": 2, "count": 2,
"nodes": [
{ "id": "item_31", "label": "dog", "ppType": "pp:DetectedDog", "wikidata": "wd:Q144", "confidence": 0.91 },
{ "id": "item_32", "label": "cell phone", "ppType": "pp:DetectedCellPhone", "wikidata": "wd:Q17517", "confidence": 0.77 }
] }
Relational compositing. Each node returned by asNodes:true is a first-class, addressable relation target:
- It is typed by the detected-class taxonomy — a
pp:Detected*class that aliases one-way to a public Wikidata entity (rdfs:subClassOf wd:Q…; e.g.pp:DetectedDog → wd:Q144), with a human/LLM-readable description. The 80 COCO classes are emitted into the ontology (/ontology/index.ttl) and knowledge graph. - It is anchored to the source image (stored in the raster’s normalized bbox space, re-resolved each frame), so anything bound to it tracks the image as it moves or scales.
- It is guarded (invisible system item) — it never appears in exports or selection, it only serves as a target.
To put a shape on / around / at a detected object, add a relation from your shape to the node id:
// 1) detect → nodes
pinepaper_detect_objects({ itemId: "item_7", asNodes: true })
// → { nodes: [ { id: "item_31", label: "dog", ... } ] }
// 2) create a shape
pinepaper_create_item({ itemType: "heart", position: [0,0], properties: { color: "#ef4444" } })
// → { itemId: "item_40" }
// 3) bind it ON the dog (follows = rides the object; it now tracks the image)
pinepaper_add_relation({ from: "item_40", to: "item_31", relation: "follows", params: { offset: [0,0] } })
Use circumscribes to ring the object or points_at / indicates for an arrow, in place of follows.
pinepaper_extract_object
Crop the best-matching detected region out of an image as a new raster item.
Input Schema:
{
"type": "object",
"properties": {
"label": { "type": "string", "description": "Which detected object to extract (e.g. \"cat\"). Falls back to the highest-confidence detection if not found." },
"itemId": { "type": "string", "description": "Source raster. Omit to use the most recent image." },
"threshold": { "type": "number", "description": "Confidence floor 0–1 (default 0.4)." }
}
}
Output: { "ok": true, "extracted": true, "object": "cat", "itemId": "item_55" }
Notes:
- All detection runs locally in the browser; the image and results never leave the device.
- “Segmentation” here means object detection (rectangular boxes), and an extract is a rectangular crop — there is no pixel-accurate mask.
- The detected-class → Wikidata alias is the same
anchormechanism the rest of thepp:ontology uses; it gives the model a real-world identity + description to reason over, not just a bare label.