Documentation

Quick Start

PinePaper Cloud Studio implements the MCP 2025-03 Authorization spec — OAuth 2.1 + PKCE + Dynamic Client Registration on /mcp/v1: interactive clients authorize themselves via the browser-based OAuth flow. Backend agents can instead use a service-account key (Authorization: Bearer pp_sa_…) carrying the mcp:invoke scope on /mcp (Streamable HTTP) and /rpc (JSON-RPC); mint one at /account#service-accounts. Service-account calls are billed to the organisation owner's credit balance.

1. Sign in + add credits

Sign in with Google at /auth/google, then visit /add-credits if you want to purchase credits.

2. Configure Claude Desktop

Claude Desktop launches MCP servers as local stdio processes; remote HTTP MCP servers are reached through the mcp-remote bridge, which proxies stdio ↔ HTTP and handles the OAuth handshake. Add this to your Claude Desktop configuration file:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "pinepaper-cloud": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://cloud.pinepaper.studio/mcp/v1"]
    }
  }
}

No headers block, no static keys. On first connection mcp-remote will:

  1. Hit POST /mcp/v1 → receive 401 with a WWW-Authenticate header pointing at our discovery URL
  2. Fetch /.well-known/oauth-authorization-server + /.well-known/oauth-protected-resource
  3. Register itself via POST /oauth/register (RFC 7591 Dynamic Client Registration)
  4. Open your browser to /oauth/authorize — you'll see a consent page showing the client name and requested scopes (mcp:read, mcp:write)
  5. Click Authorize — mcp-remote receives the auth code, exchanges it for an access + refresh token via POST /oauth/token, and starts proxying real MCP calls to Claude Desktop

The browser handoff happens once per client per device — tokens are cached locally under ~/.mcp-auth/. Refresh tokens last 30 days and rotate on every use (RFC 6819 §5.2.2.3) so a stolen refresh token's window is bounded.

3. Start Creating

Try in Claude Desktop:

  • "Create a red circle that pulses"
  • "Make a flowchart for user login"
  • "Create a solar system with Earth orbiting the Sun"

You can see + revoke each authorized client at /account → MCP Clients.

Web Studio & AI Code Console

You don't need Claude Desktop to use PinePaper. Sign in at pinepaper.studio/editor with your PinePaper Cloud account and the in-browser AI Code Console becomes available — same tools, no install.

What you get when signed in

  • AI Code Console — chat panel inside the editor that generates and runs PinePaper code on the canvas in real time.
  • PinePaper LLM on Credits (coming soon) — our own model (pinepaper-llm-v0) will be served from credits, billed per token at $0.20 / 1M input and $0.60 / 1M output (a typical design turn ~$0.0006). Until it launches, all models — including third-party (Claude, Gemini, GPT, Grok) — require BYOK; PinePaper Cloud does not resell third-party LLMs.
  • Modes — Design and Modify route through the KG pipeline for style learning; Chat and Help talk directly to the model.

Bring Your Own Key (BYOK)

To use a third-party model in the AI Code Console, add your own API key at /account#llm-providers. Once a key is on file, that provider's models appear in the model picker and you can switch per message:

  • Anthropic — Claude Opus 5.5, Claude Sonnet 5.5, Claude Haiku 5.5, Claude Fable 5.1, Claude Opus 5, Claude Sonnet 5, Claude Haiku 4.5, Claude Fable 5; legacy: Claude Opus 4.8, Claude Sonnet 4.6. anthropic.com
  • Google AI — Gemini 3.7 Flash, Gemini 3.8 Flash, Gemini 3.6 Flash, Gemini 3.5 Flash, Gemini 3.5 Flash Lite, Gemini 3.1 Flash Lite, Gemini 3.1 Pro (preview); legacy: Gemini 2.5 Pro, Gemini 2.5 Flash, Gemini 2.5 Flash Lite. ai.google.dev
  • OpenAI — GPT-5.5, GPT-5.4, GPT-5.4 Mini, GPT-5.4 Nano, GPT-5.3 Codex (coding). openai.com
  • xAI — Grok 4.3, Grok 4.20 (reasoning), Grok 4.20 (non-reasoning), Grok 4.20 (multi-agent), Grok Build 0.1. x.ai
  • Cerebras — Llama 3.3 70B, Qwen 3 235B, GPT-OSS 120B. cerebras.ai
  • Groq — Llama 3.3 70B, GPT-OSS 120B. groq.com
  • OpenRouter — DeepSeek V4 Pro, DeepSeek V4 Flash, Kimi K2.6, Nemotron 3 Super 120B, Qwen 3.7 Max, Mistral Medium 3.5, Free auto-router, Nemotron 3 Ultra 550B — free, GLM 5.2 — free, Gemma 4 31B — free, Nemotron 3 Super 120B — free. One key, and the full live catalogue is searchable in the model picker. openrouter.ai

A flat $0.002/request platform fee is deducted from your credits to cover infrastructure (KG pipeline, sessions, caching); your provider bills you separately for tokens.

Set a default model

Pick a provider + model on /account#llm-providers under Default Model. New chats start with that selection; per-conversation choices still win when you reopen an existing thread. The preference is stored at GET/PUT /api/me/preferences.

How your key is protected

  • Encrypted at rest with AES-256-GCM, scoped to your account via a per-user PBKDF2 salt.
  • Never exposed in request or response bodies.
  • Every read is recorded in a private audit log you can ask us to review.
  • Remove the key any time at /account#llm-providers — takes effect immediately.

Model attribution

Every provider above is independent. PinePaper Cloud does not train, host, or fine-tune any of these models — when you BYOK, your request goes directly to the provider you selected (or to OpenRouter's gateway for OpenRouter-prefixed model IDs). For OpenRouter specifically, we send HTTP-Referer: https://cloud.pinepaper.studio + X-Title: PinePaper Cloud on every call so your usage is correctly attributed in your OpenRouter activity feed. Trademarks remain with their respective owners.

Cloud Templates

The template is the unit of saved work — items, relations, animations, canvas size — that you reload, remix, and iterate on with the AI Code Console. A scene is what you compose by chaining templates together. Local templates live in your browser (free); when signed in to PinePaper Cloud you can opt in to cloud sync so the same templates follow you across devices.

Saving from the studio

  • Build a template in the editor.
  • Open the Templates panel (left sidebar) and click Save. Choose Local (free, browser-only) or Cloud (synced, opt-in).
  • Each cloud template gets its own conversation thread (one-to-one) so the AI Code Console remembers context as you iterate on it across sessions.
  • Chain saved templates into a scene to build something larger without losing the per-template KG context.

Pricing & privacy

  • Cloud templates are pay-as-you-go from your credits balance — storage is small per template.
  • Templates are private to your account. The MCP Cloud knowledge graph scopes data per templateId (preferred) or conversationId (fallback), and the PinePaper LLM service learns your style profile privately at the user level.
  • Toggle cloud sync off any time at /account — local templates remain in your browser.

MCP Endpoint

Endpoint: POST https://cloud.pinepaper.studio/mcp/v1
Auth: OAuth 2.1 + PKCE — JWT access token in Authorization: Bearer <token>

The MCP endpoint uses JSON-RPC 2.0. Auth follows the MCP 2025-03 Authorization spec (OAuth 2.1 + PKCE + Dynamic Client Registration). MCP clients that support discovery (Claude Desktop 0.10+, Cursor MCP, etc.) handle the flow automatically — see Quick Start above.

For tools that don't auto-discover OAuth, complete the flow manually and use the resulting access token:

POST /mcp/v1
Authorization: Bearer <access_token_from_oauth_flow>
Content-Type: application/json

{
  "jsonrpc": "2.0",
  "id": "1",
  "method": "tools/list"
}

OAuth Flow Reference

The endpoints below implement OAuth 2.1 (RFC 6749 / draft-ietf-oauth-v2-1), PKCE S256 (RFC 7636), Dynamic Client Registration (RFC 7591), and Token Revocation (RFC 7009).

EndpointMethodPurpose
/.well-known/oauth-authorization-serverGETRFC 8414 metadata: endpoints, scopes, grant types
/.well-known/oauth-protected-resourceGETRFC 9728 metadata: resource URL + authorization_servers
/.well-known/jwks.jsonGETRFC 7517 JWKS — ES256 public keys for offline token verification
/oauth/registerPOSTRFC 7591 Dynamic Client Registration
/oauth/authorizeGETAuthorization endpoint — PKCE S256 mandatory
/oauth/tokenPOSTToken endpoint — authorization_code + refresh_token grants
/oauth/revokePOSTRFC 7009 token revocation

Manual flow (for non-MCP clients)

# 1. Register your client
curl -X POST https://cloud.pinepaper.studio/oauth/register \
  -H "Content-Type: application/json" \
  -d '{
    "client_name": "My App",
    "redirect_uris": ["http://localhost:54321/cb"],
    "token_endpoint_auth_method": "none"
  }'
# → returns { "client_id": "mcpc_..." } (no client_secret for PKCE-only clients)

# 2. Generate a PKCE verifier + challenge
verifier=$(openssl rand -base64 32 | tr -d "=+/" | cut -c1-43)
challenge=$(printf "%s" "$verifier" | openssl dgst -sha256 -binary | \
  openssl base64 | tr -d "=+/" | tr "+/" "-_")

# 3. Open this URL in a browser to sign in + approve
echo "https://cloud.pinepaper.studio/oauth/authorize?client_id=mcpc_...&redirect_uri=http://localhost:54321/cb&response_type=code&code_challenge=$challenge&code_challenge_method=S256&scope=mcp:read+mcp:write&state=xyz"

# 4. Browser redirects to your callback with ?code=mcpac_...&state=xyz
# Exchange that code for tokens:
curl -X POST https://cloud.pinepaper.studio/oauth/token \
  -d "grant_type=authorization_code" \
  -d "client_id=mcpc_..." \
  -d "code=mcpac_..." \
  -d "redirect_uri=http://localhost:54321/cb" \
  -d "code_verifier=$verifier"
# → { "access_token": "eyJhbGc...", "refresh_token": "mcprt_...", "expires_in": 3600 }

# 5. Use the access token for /mcp/v1 calls
curl -X POST https://cloud.pinepaper.studio/mcp/v1 \
  -H "Authorization: Bearer eyJhbGc..." \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":"1","method":"tools/list"}'

# 6. Refresh before the access token expires (1h)
curl -X POST https://cloud.pinepaper.studio/oauth/token \
  -d "grant_type=refresh_token" \
  -d "client_id=mcpc_..." \
  -d "refresh_token=mcprt_..."
# → new access_token + new refresh_token (old refresh is revoked)

Note: refresh tokens rotate on every use. If a stolen refresh token is replayed after the legitimate client already refreshed, the entire chain is revoked and the user is forced to re-authorize.

Pricing

Pay-as-you-go with no subscriptions. Credits never expire.

OperationCost
MCP Request (create, animate, query)$0.001
Cloud rendercredits = ceil(seconds × fps/30 × resolution × format) · 1 credit = $0.015
10 s MP4 · 1080p · 30fps$0.15
10 s MP4 · 720p · 30fps$0.075
10 s GIF · 1080p · 30fps$0.225
10 s animated SVG · 1080p$0.045
PNG, PDF or widget (one frame or build, any resolution)$0.015

Resolution factors: 720p ×0.5, 1080p ×1, 4K ×4. Format factors: MP4/WebM ×1, GIF ×1.5, animated SVG ×0.25. Factors, limits and a calculator are at /render-pricing; POST /v1/renders:estimate returns the exact price for free. Voice and sound prices are on /pricing.

Tools & Toolkit Profiles

The full PinePaper tool registry has 180 tools across canvas, animation, diagrams, maps, fonts, exports, and more. You almost never need all of them at once — exposing the full surface to a model burns context and slows tool selection.

The MCP server organizes tools into toolkit profiles — task-shaped subsets activated per request. pinepaper_set_toolkit switches the active profile; pinepaper_tool_guide answers "which tool fits this job?" without listing the whole registry. The active profile is selected automatically based on the workflow ("draw a flowchart" → diagram profile; "highlight US states" → map profile).

Toolkit profiles

Generated from @pinepaper.studio/mcp-server@1.6.24 on 2026-11-03.

Full — 180 tools

Every tool in the registry. Use when context budget allows and the workflow spans many domains (canvas + diagrams + maps + fonts).

pinepaper_accessibility_check
pinepaper_add_filter
pinepaper_add_ports
pinepaper_add_relation
pinepaper_agent_analyze
pinepaper_agent_batch_execute
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
pinepaper_artboard
pinepaper_audio_beats
pinepaper_auto_layout
pinepaper_background
pinepaper_batch_create
pinepaper_batch_modify
pinepaper_beat_cuts
pinepaper_brand_kit
pinepaper_browser_connect
pinepaper_browser_disconnect
pinepaper_browser_screenshot
pinepaper_browser_status
pinepaper_camera
pinepaper_camera_animate
pinepaper_camera_director
pinepaper_capture_frames
pinepaper_character
pinepaper_choreograph
pinepaper_chroma_key
pinepaper_clear_canvas
pinepaper_comment
pinepaper_component
pinepaper_compose
pinepaper_connect
pinepaper_connect_ports
pinepaper_construction_sequence
pinepaper_create_chart
pinepaper_create_diagonal_stripes
pinepaper_create_diagram_shape
pinepaper_create_glossy_sphere
pinepaper_create_grid
pinepaper_create_item
pinepaper_create_letter_collage
pinepaper_create_product_promo
pinepaper_create_scene
pinepaper_crop_image
pinepaper_cutout_style
pinepaper_deform
pinepaper_delete_item
pinepaper_design_medium
pinepaper_design_system
pinepaper_detect_objects
pinepaper_diagnostic_report
pinepaper_diagram_mode
pinepaper_draw_knots
pinepaper_draw_sashiko
pinepaper_draw_subdivision
pinepaper_draw_weave
pinepaper_emitter
pinepaper_equation_path
pinepaper_event
pinepaper_execute_custom_code
pinepaper_execute_generator
pinepaper_export_scene
pinepaper_export_store
pinepaper_export_svg
pinepaper_export_training_data
pinepaper_export_widget
pinepaper_export_widget_html
pinepaper_extract_object
pinepaper_flip
pinepaper_font
pinepaper_game
pinepaper_generate
pinepaper_generate_estimate
pinepaper_generate_status
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
pinepaper_group
pinepaper_hand_drawn
pinepaper_history
pinepaper_image_filter
pinepaper_import_asset
pinepaper_import_image
pinepaper_import_layered_character
pinepaper_import_mermaid
pinepaper_import_motion_capture
pinepaper_import_scene
pinepaper_import_svg
pinepaper_inspect_product
pinepaper_instantiate_ontology
pinepaper_interaction
pinepaper_interchange
pinepaper_keyframe_animate
pinepaper_lasso
pinepaper_lint_scene
pinepaper_list_generators
pinepaper_look
pinepaper_magic
pinepaper_manage_scenes
pinepaper_map
pinepaper_map_animation
pinepaper_map_data
pinepaper_map_regions
pinepaper_measurement
pinepaper_media
pinepaper_modify_item
pinepaper_morph_sequence
pinepaper_motion
pinepaper_original_character
pinepaper_p5_draw
pinepaper_path
pinepaper_pattern
pinepaper_pen_figure
pinepaper_physics
pinepaper_place_on_surface
pinepaper_play_timeline
pinepaper_precomp
pinepaper_provenance
pinepaper_query
pinepaper_query_capabilities
pinepaper_query_mutations
pinepaper_query_ontology
pinepaper_query_relations
pinepaper_refresh_page
pinepaper_register_custom_relation
pinepaper_register_item
pinepaper_relight
pinepaper_remove_connector
pinepaper_remove_mask
pinepaper_remove_relation
pinepaper_render_batch
pinepaper_render_hook
pinepaper_rigging
pinepaper_scene_diff
pinepaper_scene_graph
pinepaper_scene_playback
pinepaper_search_assets
pinepaper_selection
pinepaper_sequence
pinepaper_set_background_color
pinepaper_set_canvas_size
pinepaper_set_toolkit
pinepaper_shader_graph
pinepaper_shatter_image
pinepaper_sound
pinepaper_sprite_sheet
pinepaper_stagger
pinepaper_stick
pinepaper_story
pinepaper_styled_scene
pinepaper_template_params
pinepaper_text_effect
pinepaper_text_style
pinepaper_tool_guide
pinepaper_transform
pinepaper_ui_kit
pinepaper_update_connector
pinepaper_validate
pinepaper_validate_design
pinepaper_validate_scene
pinepaper_world3d
Agent (default) — 175 tools

Default profile for general-purpose AI agents. Covers canvas, items, animation, relations, effects, exports — the common creative workflow.

pinepaper_accessibility_check
pinepaper_add_filter
pinepaper_add_ports
pinepaper_add_relation
pinepaper_agent_analyze
pinepaper_agent_batch_execute
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
pinepaper_artboard
pinepaper_audio_beats
pinepaper_auto_layout
pinepaper_background
pinepaper_batch_create
pinepaper_batch_modify
pinepaper_beat_cuts
pinepaper_brand_kit
pinepaper_browser_connect
pinepaper_browser_disconnect
pinepaper_browser_screenshot
pinepaper_browser_status
pinepaper_camera
pinepaper_camera_animate
pinepaper_camera_director
pinepaper_capture_frames
pinepaper_character
pinepaper_choreograph
pinepaper_chroma_key
pinepaper_clear_canvas
pinepaper_comment
pinepaper_component
pinepaper_compose
pinepaper_connect
pinepaper_connect_ports
pinepaper_construction_sequence
pinepaper_create_chart
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
pinepaper_deform
pinepaper_delete_item
pinepaper_design_medium
pinepaper_design_system
pinepaper_detect_objects
pinepaper_diagram_mode
pinepaper_draw_knots
pinepaper_draw_sashiko
pinepaper_draw_subdivision
pinepaper_draw_weave
pinepaper_emitter
pinepaper_equation_path
pinepaper_event
pinepaper_execute_custom_code
pinepaper_execute_generator
pinepaper_export_scene
pinepaper_export_store
pinepaper_export_svg
pinepaper_export_training_data
pinepaper_export_widget
pinepaper_export_widget_html
pinepaper_extract_object
pinepaper_flip
pinepaper_font
pinepaper_game
pinepaper_generate
pinepaper_generate_estimate
pinepaper_generate_status
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_relation_stats
pinepaper_globe
pinepaper_group
pinepaper_hand_drawn
pinepaper_history
pinepaper_image_filter
pinepaper_import_asset
pinepaper_import_image
pinepaper_import_layered_character
pinepaper_import_mermaid
pinepaper_import_motion_capture
pinepaper_import_scene
pinepaper_import_svg
pinepaper_instantiate_ontology
pinepaper_interaction
pinepaper_interchange
pinepaper_keyframe_animate
pinepaper_lasso
pinepaper_lint_scene
pinepaper_list_generators
pinepaper_look
pinepaper_magic
pinepaper_manage_scenes
pinepaper_map
pinepaper_map_animation
pinepaper_map_data
pinepaper_map_regions
pinepaper_measurement
pinepaper_media
pinepaper_modify_item
pinepaper_morph_sequence
pinepaper_motion
pinepaper_original_character
pinepaper_p5_draw
pinepaper_path
pinepaper_pattern
pinepaper_pen_figure
pinepaper_physics
pinepaper_place_on_surface
pinepaper_play_timeline
pinepaper_precomp
pinepaper_provenance
pinepaper_query
pinepaper_query_capabilities
pinepaper_query_mutations
pinepaper_query_ontology
pinepaper_query_relations
pinepaper_refresh_page
pinepaper_register_custom_relation
pinepaper_relight
pinepaper_remove_connector
pinepaper_remove_mask
pinepaper_remove_relation
pinepaper_render_batch
pinepaper_render_hook
pinepaper_rigging
pinepaper_scene_diff
pinepaper_scene_graph
pinepaper_scene_playback
pinepaper_search_assets
pinepaper_selection
pinepaper_sequence
pinepaper_set_background_color
pinepaper_set_canvas_size
pinepaper_set_toolkit
pinepaper_shader_graph
pinepaper_shatter_image
pinepaper_sound
pinepaper_sprite_sheet
pinepaper_stagger
pinepaper_stick
pinepaper_story
pinepaper_styled_scene
pinepaper_template_params
pinepaper_text_effect
pinepaper_text_style
pinepaper_tool_guide
pinepaper_transform
pinepaper_ui_kit
pinepaper_update_connector
pinepaper_validate
pinepaper_validate_design
pinepaper_validate_scene
pinepaper_world3d
Diagram — 51 tools

Flowcharts, UML, network topology — diagram shapes, connectors, layout algorithms.

pinepaper_add_ports
pinepaper_agent_analyze
pinepaper_agent_batch_execute
pinepaper_agent_end_job
pinepaper_agent_export
pinepaper_agent_reset
pinepaper_agent_start_job
pinepaper_arrange
pinepaper_auto_layout
pinepaper_background
pinepaper_browser_connect
pinepaper_browser_disconnect
pinepaper_browser_screenshot
pinepaper_browser_status
pinepaper_capture_frames
pinepaper_clear_canvas
pinepaper_connect
pinepaper_connect_ports
pinepaper_create_diagonal_stripes
pinepaper_create_diagram_shape
pinepaper_create_glossy_sphere
pinepaper_create_grid
pinepaper_create_item
pinepaper_delete_item
pinepaper_diagram_mode
pinepaper_export_scene
pinepaper_export_store
pinepaper_export_svg
pinepaper_export_training_data
pinepaper_export_widget
pinepaper_export_widget_html
pinepaper_geometry
pinepaper_get_canvas_size
pinepaper_get_diagram_shapes
pinepaper_get_items
pinepaper_get_relation_stats
pinepaper_group
pinepaper_import_mermaid
pinepaper_import_scene
pinepaper_interchange
pinepaper_modify_item
pinepaper_path
pinepaper_query
pinepaper_query_capabilities
pinepaper_refresh_page
pinepaper_remove_connector
pinepaper_set_background_color
pinepaper_set_canvas_size
pinepaper_set_toolkit
pinepaper_tool_guide
pinepaper_update_connector
Map — 36 tools

Geographic visualization — load maps, highlight regions, apply data colors, project, export GeoJSON.

pinepaper_agent_analyze
pinepaper_agent_batch_execute
pinepaper_agent_end_job
pinepaper_agent_export
pinepaper_agent_reset
pinepaper_agent_start_job
pinepaper_background
pinepaper_browser_connect
pinepaper_browser_disconnect
pinepaper_browser_screenshot
pinepaper_browser_status
pinepaper_capture_frames
pinepaper_clear_canvas
pinepaper_export_scene
pinepaper_export_store
pinepaper_export_svg
pinepaper_export_training_data
pinepaper_export_widget
pinepaper_export_widget_html
pinepaper_get_canvas_size
pinepaper_get_items
pinepaper_get_relation_stats
pinepaper_globe
pinepaper_import_scene
pinepaper_interchange
pinepaper_map
pinepaper_map_animation
pinepaper_map_data
pinepaper_map_regions
pinepaper_query
pinepaper_query_capabilities
pinepaper_refresh_page
pinepaper_set_background_color
pinepaper_set_canvas_size
pinepaper_set_toolkit
pinepaper_tool_guide
Font Studio — 41 tools

Typography workflows — font import, glyph editing, OTF export.

pinepaper_agent_analyze
pinepaper_agent_batch_execute
pinepaper_agent_end_job
pinepaper_agent_export
pinepaper_agent_reset
pinepaper_agent_start_job
pinepaper_animate_letter_collage
pinepaper_arrange
pinepaper_background
pinepaper_browser_connect
pinepaper_browser_disconnect
pinepaper_browser_screenshot
pinepaper_browser_status
pinepaper_capture_frames
pinepaper_clear_canvas
pinepaper_create_diagonal_stripes
pinepaper_create_glossy_sphere
pinepaper_create_grid
pinepaper_create_item
pinepaper_create_letter_collage
pinepaper_delete_item
pinepaper_export_scene
pinepaper_export_store
pinepaper_export_svg
pinepaper_export_training_data
pinepaper_export_widget
pinepaper_export_widget_html
pinepaper_font
pinepaper_geometry
pinepaper_get_canvas_size
pinepaper_group
pinepaper_import_scene
pinepaper_interchange
pinepaper_modify_item
pinepaper_path
pinepaper_refresh_page
pinepaper_set_background_color
pinepaper_set_canvas_size
pinepaper_set_toolkit
pinepaper_text_style
pinepaper_tool_guide
Minimal — 20 tools

Smallest viable surface for low-context models — basic create/modify/animate only. Pair with `pinepaper_tool_guide` for on-demand discovery.

pinepaper_agent_analyze
pinepaper_agent_batch_execute
pinepaper_agent_end_job
pinepaper_agent_export
pinepaper_agent_reset
pinepaper_agent_start_job
pinepaper_background
pinepaper_browser_connect
pinepaper_browser_disconnect
pinepaper_browser_screenshot
pinepaper_browser_status
pinepaper_clear_canvas
pinepaper_export_store
pinepaper_get_canvas_size
pinepaper_interchange
pinepaper_refresh_page
pinepaper_set_background_color
pinepaper_set_canvas_size
pinepaper_set_toolkit
pinepaper_tool_guide

All tools (alphabetical)

Show full registry — 180 tools
pinepaper_accessibility_check
Check the live scene for two accessibility failures that stop ads and broadcast spots: low text contrast and flashing.
pinepaper_add_filter
Add a visual filter effect to the canvas.
pinepaper_add_ports
Add connection ports to an existing item.
pinepaper_add_relation
Create a behavior relationship between two items.
pinepaper_agent_analyze
Analyze canvas content to get export recommendations and content insights.
pinepaper_agent_batch_execute
Execute the primitive operations of a scene in a single call — canvas setup, backgrounds, items, animations, masks, effects, and playback.
pinepaper_agent_end_job
End the current agent job, get summary + screenshot for user validation.
pinepaper_agent_export
Smart export with automatic format detection and platform optimization.
pinepaper_agent_reset
Fast canvas reset without browser refresh.
pinepaper_agent_start_job
Start a new agent job for creating animations, videos, graphics, or any visual content.
pinepaper_analyze_design
Analyze a template or scene definition using the PinePaper Design Knowledge Graph.
pinepaper_animate
Apply a simple LOOP animation to an item.
pinepaper_animate_letter_collage
Apply animation to all letters in a collage with staggered timing.
pinepaper_apply_animated_mask
Apply an animated mask reveal to an item.
pinepaper_apply_custom_mask
Direct helper for applying custom keyframe-based masks.
pinepaper_apply_effect
Apply a visual effect to an item.
pinepaper_apply_template
Load a pre-built template design onto the canvas, or list available templates.
pinepaper_arrange
Change an item's stacking order (z-order) — which items draw on top of which.
pinepaper_artboard
Resize the artboard and control how items reflow when it changes.
pinepaper_audio_beats
Detect beats in audio and bake an item's animation onto them.
pinepaper_auto_layout
Automatically arrange diagram items using a layout algorithm.
pinepaper_background
Set, clear, or query the canvas background.
pinepaper_batch_create
Create multiple items at once with a single history save.
pinepaper_batch_modify
Modify multiple items at once with a single history save.
pinepaper_beat_cuts
Cut on the music: analyse a track's beats (or take beat times you already have), fit a beat grid, and return cut points on every beat, every bar, or every N beats — optionally splitting a video or audio clip at each one.
pinepaper_brand_kit
Apply a brand kit — colours, fonts and roles — across the scene.
pinepaper_browser_connect
Connect to PinePaper Studio in a browser.
pinepaper_browser_disconnect
Disconnect from the browser and close PinePaper Studio.
pinepaper_browser_screenshot
Take a screenshot of the current PinePaper canvas.
pinepaper_browser_status
Check the current browser connection status.
pinepaper_camera
Camera control: zoom, pan, move, reset, stop, get state.
pinepaper_camera_animate
Animate camera with keyframe-based zoom, pan, and 3D tilt sequence for cinematic effects.
pinepaper_camera_director
Direct a cinematic camera walkthrough of the scene from a high-level SHOT LIST.
pinepaper_capture_frames
Deterministically render the scene at a list of times and snapshot each frame (FxTool's app.captureFramesAt, S3).
pinepaper_character
Place a CHARACTER from the design graph and DIRECT it — no geometry, no bones, no poses.
pinepaper_choreograph
Make any item ACT: a list of beats compiled to one keyframe track with anticipation, squash and stretch, contact and settle — the timing a hand animator would key, from one call.
pinepaper_chroma_key
Remove a background color from an imported image (green-screen style) — one shot, no interactive session.
pinepaper_clear_canvas
Clear all items from the canvas, removing everything including any welcome template items.
pinepaper_comment
Notes pinned to a place and a moment — review feedback on a scene.
pinepaper_component
Reusable components with per-instance overrides — a master and its instances.
pinepaper_compose
Arrange items into a NAMED COMPOSITION and film it — "here are four photos, lay them out nicely and give me a clip".
pinepaper_connect
Connect two items with a smart connector.
pinepaper_connect_ports
Connect two specific ports on items.
pinepaper_construction_sequence
Reveal a geometric figure step by step (FxTool's app.constructionSequence, Layer 3).
pinepaper_create_chart
Create and manage data visualizations on the canvas.
pinepaper_create_diagonal_stripes
Create a diagonal stripe pattern.
pinepaper_create_diagram_shape
Create a diagram shape on the canvas.
pinepaper_create_glossy_sphere
Create a 3D-looking glossy sphere with realistic lighting effects.
pinepaper_create_grid
Create a grid of lines on the canvas.
pinepaper_create_item
Create an item on the PinePaper canvas.
pinepaper_create_letter_collage
Create stylized text with per-letter customization.
pinepaper_create_product_promo
Compile a user-directed promotional video with procedural browser mockups, UI typing, Ken Burns motion, and audio sync — or, with capture, from real browser screenshots of the product zooming toward each feature.
pinepaper_create_scene
Create a complete scene with multiple items, relations, and animations in a single operation.
pinepaper_crop_image
Crop an imported image to a rectangle — one shot, no interactive session.
pinepaper_cutout_style
Apply decorative cutout styles to image items (sticker effects, torn edges, etc.).
pinepaper_deform
Apply vertex deformation presets to items for organic motion effects.
pinepaper_delete_item
Delete a single item from the canvas by its registry ID.
pinepaper_design_medium
The THIRD design axis: the MEDIUM — what physically makes the marks.
pinepaper_design_system
The design vocabulary, as data you can read — and eighteen styles that can build a scene.
pinepaper_detect_objects
Run on-device object detection (fully local — no upload) over an imported image and either draw labeled boxes or promote each detection to a design node.
pinepaper_diagnostic_report
[Utility] Generate a diagnostic report for bug reporting.
pinepaper_diagram_mode
Control the diagram mode for interactive editing.
pinepaper_draw_knots
Draw three-dimensional embroidered knot relief (French knots, bullion coil rolls, and tension anchor tacks) with drop shadows, tight thread wraps, and specular highlight glints.
pinepaper_draw_sashiko
Draw Japanese Sashiko geometric folk embroidery lattices (Seigaiha blue sea waves, Asanoha hemp-leaf stars, Hishi diamond grids) with dashed running stitches on indigo ground cloth.
pinepaper_draw_subdivision
Generate asymmetric recursive quadtree/rectangular partition compositions (De Stijl/Mondrian, Swiss International Style, Bauhaus, Minimal) with bounded depth, asymmetric rest cell preservation, and crisp orthogonal dividers.
pinepaper_draw_weave
Draw authentic structural woven textiles (Plain/Tabby, Twill, Herringbone, Basketweave/Panama) as vector fiber lattices with alternating over/under warp and weft phase offsets.
pinepaper_emitter
Particles as an ITEM whose every frame is a pure function of its spec and the scene time — so the preview, capture_frames, every export, a saved project, a template and the cloud render all draw the same particles, scrubbing backwards included.
pinepaper_equation_path
Create a path ITEM from a math equation (FxTool's app.createEquationPath, Expression IR — S10 B5).
pinepaper_event
Manage the pp:event channel — the backbone of EVENT-DRIVEN SCENE CHAINS (FxTool S11).
pinepaper_execute_custom_code
Execute arbitrary JavaScript code in the PinePaper context.
pinepaper_execute_generator
Execute a background generator to create procedural patterns.
pinepaper_export_scene
Export the scene: a SUMMARY for inspection by default, or with full: true a RESTORABLE project document saved to a file.
pinepaper_export_store
Recover an export the studio is still holding.
pinepaper_export_svg
Export the scene as animated SVG.
pinepaper_export_training_data
Export relation data as training pairs for LLM fine-tuning.
pinepaper_export_widget
Export current scene as a PineWidget (pp:PinePaper ontology JSON v0.4.3).
pinepaper_export_widget_html
Export current scene as a self-contained HTML page with tree-shaken PineWidget runtime.
pinepaper_extract_object
Detect objects in an imported image and crop the best match into a NEW item — e.g.
pinepaper_flip
Animate a layout change WITHOUT describing the motion.
pinepaper_font
Fonts: which ones you can USE, and authoring new ones.
pinepaper_game
GAME-LOGIC primitives as pure computation: A* pathfinding and tilemap boards.
pinepaper_generate
Generate images with an AI model in the PinePaper cloud, and optionally place the first one on the canvas.
pinepaper_generate_estimate
Free: price a pinepaper_generate call before making it, or list the models.
pinepaper_generate_status
Collect a pinepaper_generate job that outlived its timeoutSec: its status, and when done its assets and chargedUsd.
pinepaper_geometry
Run an exact geometric construction (FxTool's app.geometry library) and optionally create a canvas item from the result.
pinepaper_get_animatable_properties
Which properties can be animated — on an ITEM, or on each mask type.
pinepaper_get_available_easings
[Utility] List the easing names the studio accepts: one table serves keyframes, masks, relations and the camera.
pinepaper_get_canvas_ontology
Capture the REGISTERED canvas as compact pp: ontology triples + a structured item summary.
pinepaper_get_canvas_size
[Utility] Get the current canvas dimensions.
pinepaper_get_diagram_shapes
[Utility] Get a list of available diagram shapes with their properties.
pinepaper_get_items
[Utility] Get all or filtered items from the canvas.
pinepaper_get_mask_animations
[Utility] Get available mask animation presets.
pinepaper_get_mask_types
[Utility] Get available mask shape types.
pinepaper_get_performance_metrics
[Utility] Get execution performance metrics to identify bottlenecks and optimize workflows.
pinepaper_get_relation_stats
[Utility] Get statistics about active relations in the scene.
pinepaper_globe
Turn a loaded map into a spinning 3D globe and swing it on a cinematic world tour.
pinepaper_group
Combine several items into ONE entity that selects, drags, and animates as a single unit — or ungroup one back into loose items.
pinepaper_hand_drawn
Give a path a hand-drawn look: a rough, bowed outline (sketchy), or a stroke that draws itself on (reveal).
pinepaper_history
Undo/redo and history state inspection.
pinepaper_image_filter
Apply image filters to raster items: a GPU set, plus painted watercolor / painterly looks for photos.
pinepaper_import_asset
Import an SVG asset from search results or direct URL onto the canvas.
pinepaper_import_image
Import a raster image onto the canvas from an http(s) URL, a data: URL, or a LOCAL FILE PATH (the server reads the file).
pinepaper_import_layered_character
Land a DECOMPOSED character illustration as one Group of role-bound parts — eyes that blink, a mouth that talks, with ZERO further wiring.
pinepaper_import_mermaid
Import a Mermaid diagram source string and render it onto the canvas as native diagram shapes + connectors.
pinepaper_import_motion_capture
Import a BVH motion-capture clip (CMU, Mixamo) as an animated skeleton, or retarget one onto a rig that already exists.
pinepaper_import_scene
Restore a scene from a project document saved by pinepaper_export_scene { full: true }.
pinepaper_import_svg
Import an SVG string or SVG from URL onto the canvas.
pinepaper_inspect_product
Inspect any product URL to extract brand colors, copy, and proposed promotional video shots.
pinepaper_instantiate_ontology
Compile a design ONTOLOGY (a pp:-namespaced JSON-LD graph of typed nodes + structural edges) into a real scene — the reverse of scene→graph extraction (FxTool S12-E3).
pinepaper_interaction
Add continuous physics behaviors and trigger interaction actions.
pinepaper_interchange
The formats other tools read and write — Lottie, dotLottie, GLB, BVH, PNG sequence.
pinepaper_keyframe_animate
Apply keyframe-based animation with precise timing and property control.
pinepaper_lasso
Cut a region out of an image along a polygon — the subject cutout behind 2.5D parallax, stickers and collage.
pinepaper_lint_scene
Audit the LIVE scene's relational structure (FxTool S12-E2) — read-only, nothing is changed.
pinepaper_list_generators
[Utility] Get a list of all available background generators with their parameters.
pinepaper_look
Restyle what is already drawn — one item, a group and everything in it, or the WHOLE SCENE — as a named look: palette remapped in place (colour keyframes too), strokes, type, image treatment, texture, background and a framing device.
pinepaper_magic
Ontology-aware auto-animation and style remixing.
pinepaper_manage_scenes
Manage multiple saved scenes (canvas snapshots).
pinepaper_map
Load a map and import/export its config.
pinepaper_map_animation
Animate map regions with keyframes or wave effects.
pinepaper_map_data
CSV / GeoJSON import-export and source-info introspection.
pinepaper_map_regions
Highlight, color, label, and select map regions.
pinepaper_measurement
Rulers, grid overlay, snap-to-grid, and dimension readout.
pinepaper_media
Bring VIDEO and AUDIO onto the canvas from a URL, and control playback.
pinepaper_modify_item
Modify an existing item's properties.
pinepaper_morph_sequence
ONE element through many states, with no cuts: each state grows out of the last (a pill becomes an input field becomes a dot becomes a card).
pinepaper_motion
The generators' Animation knob, pointed at anything — the same motion engine every generator's own animation runs on, reachable for any group or list of items.
pinepaper_original_character
Make an ORIGINAL character from a base rig and a declarative variant — no drawing code, and nothing anyone else owns.
pinepaper_p5_draw
Execute p5.js-style drawing code on the PinePaper canvas.
pinepaper_path
Destructive path operations — the ones that REPLACE or ADD items rather than restyling them.
pinepaper_pattern
Move many items with ONE stored declaration instead of a keyframe track on each: a wave running through a row of letters, a stagger spreading across a grid.
pinepaper_pen_figure
Draw a mathematical figure with a pen: the tip travels the figure and the ink appears behind it, in the editor and in every export.
pinepaper_physics
Rigid body physics simulation (Box2D/Planck.js).
pinepaper_place_on_surface
Put a UI ONTO A SCREEN inside a photo: a phone, a monitor, a billboard.
pinepaper_play_timeline
Control keyframe animation playback.
pinepaper_precomp
Nested compositions — group items into reusable animated precomps.
pinepaper_provenance
Where an item came from and what depends on it.
pinepaper_query
Query canvas items and spatial information.
pinepaper_query_capabilities
Discover and match capabilities across the engine — text styles, character-level text effects, generators, vertex deforms, and behavioral relations.
pinepaper_query_mutations
A property's values over time: the item's keyframe series ({t, frame, value, easing} per key), for one property or all, optionally within [from, to] seconds.
pinepaper_query_ontology
Query the PinePaper design knowledge graph — explore types, properties, edges, hierarchy, and patterns.
pinepaper_query_relations
[Utility] Query relationships for an item.
pinepaper_refresh_page
Refresh the PinePaper Studio page in the browser.
pinepaper_register_custom_relation
PARAMS ARE DEFINITIONS, not values: { gap: { type: 'number', default: 60, min: 0 } } (type is number | string | boolean | array | object).
pinepaper_register_item
Register a Paper.js item created externally.
pinepaper_relight
Light the 3D world layer (pinepaper_world3d) with point and directional lights — a post pass, so the lit side of every surface reads brighter in the preview and the export.
pinepaper_remove_connector
Remove a connector from the canvas.
pinepaper_remove_mask
Remove mask from an item, restoring original appearance.
pinepaper_remove_relation
Remove a relationship between items.
pinepaper_render_batch
Render one creative per row of data from the current scene: for each row, apply its changes (modify_item per item, and / or a template's params), then export with the shared export options.
pinepaper_render_hook
Custom per-frame drawing that a saved scene CARRIES: SOURCE TEXT, compiled and run under the governor's loop guards with seeded Math, saved in the project document, the template and undo, and re-installed on load.
pinepaper_rigging
Rig and animate with SKELETONS — bones, IK chains, and pose keyframes (FxTool RiggingSystem).
pinepaper_scene_diff
What changed between two states of the scene — added, removed and modified items.
pinepaper_scene_graph
Create an interactive multi-node story or quiz card graph.
pinepaper_scene_playback
Control sequential scene chain playback — play saved scenes as a slideshow presentation.
pinepaper_search_assets
Search for free SVG assets from open repositories (Iconify, Font Awesome).
pinepaper_selection
Manage item selection on canvas.
pinepaper_sequence
Work out WHEN clips start, said relative to each other instead of in absolute seconds.
pinepaper_set_background_color
Set the canvas background color.
pinepaper_set_canvas_size
Change the canvas dimensions.
pinepaper_set_toolkit
Switch the active toolkit profile and/or verbosity level at runtime.
pinepaper_shader_graph
Build a pixel-processing graph from nodes (normal map, relighting, depth of field, bloom) and run it over an item or the whole scene.
pinepaper_shatter_image
Split a raster into a GRID OF TILES — the primitive under every "photo breaks apart / assembles from pieces" effect.
pinepaper_sound
Synthesis — and the drawing that is the same object.
pinepaper_sprite_sheet
Generate, play, and export sprite sheets from skeleton poses.
pinepaper_stagger
Shape a delay across many items.
pinepaper_stick
The vendored stick-figure kit — a rigged figure posed, walking, travelling, holding a prop, with a garment and hair, plus the set it stands on and among.
pinepaper_story
FORM — nav: 'scenes' is the VIDEO story: one scene per part on a scene chain that cuts in time (export as MP4); each part's length follows its role (hook 2.5 s, stat 3 s, section 3.5 s, quote 3 s, exit 3 s; 0.4 s transitions), and the reply carries the cut times.
pinepaper_styled_scene
One composition, drawn in a built-in STYLE, as one canvas item that redraws itself every exported frame.
pinepaper_template_params
Templates that take typed inputs — the same scene rebuilt for your text and colours.
pinepaper_text_effect
Animate text CHARACTER BY CHARACTER — the terminaltexteffects vocabulary, reimplemented from source).
pinepaper_text_style
Display TEXT STYLES and variable-font axes — the stacked-layer titles a fill+stroke+shadow cannot make, and weight/width/slant as animatable properties.
pinepaper_tool_guide
Get detailed guidance for PinePaper tools on demand.
pinepaper_transform
Transform items: fit to the canvas, nudge position, flip, or change z-order.
pinepaper_ui_kit
Place product-UI mockups drawn properly, on brand: a phone LOCK SCREEN (Dynamic Island, status bar, clock, wallpaper) with notifications that stack in and a prompt box that types, or a standalone notification, prompt box, toggle, calendar card or ad card.
pinepaper_update_connector
Update the style or label of an existing connector.
pinepaper_validate
Semantically validate the LIVE scene (or a proposed mutation before you apply it) and get back STRUCTURED diagnostics — not just pass/fail.
pinepaper_validate_design
Validate and score a template definition against the PinePaper ontology.
pinepaper_validate_scene
Audit the LIVE canvas with FxTool's OntologyValidator and get structured, actionable diagnostics instead of console warnings.
pinepaper_world3d
A real 3D WORLD under the canvas — depth-buffered terrain, sky, sun shadows, an addressable actor stage and a directed camera.

Use tools/list to fetch the live list with full descriptions and input schemas for whichever profile your client has active.

Relation Types

Behavior-driven animation relationships between items:

RelationDescription
orbitsCircular motion around target
followsSmooth follow toward target
attached_toFixed offset from target
maintains_distanceStay at fixed distance
points_atRotate to face target
mirrorsMirror target position
parallaxDepth-based movement
bounds_toConstrain within area
animatesProperty animation over time
grows_fromScale growth from target
staggered_withSequential timing offset
indicatesArrow/pointer to target
circumscribesFit around target bounds
wave_throughWave motion through items
morphs_toShape morphing transition
camera_followsCamera tracks item
camera_animatesCamera keyframe sequence
part_ofSemantic parent-child grouping
expressesFacial/body expressions

Platform Integrations

PinePaper Cloud Studio is an HTTP MCP server with OAuth 2.1 + PKCE auth. Any MCP-aware client auto-discovers the auth flow; for other tools complete the OAuth flow once and use the resulting access token.

Claude Desktop (Native MCP)

Claude Desktop 0.10+ has native MCP discovery support. See Quick Start above — no headers, no manual key handling.

Cursor IDE (MCP Extension)

Cursor's MCP integration auto-discovers OAuth too. Add the server URL in Settings → MCP → Add server and Cursor will open the consent page in your browser on first use.

ChatGPT (Custom GPT Actions)

Custom GPTs don't currently support OAuth 2.1 + PKCE auth flows. Two options:

  • OAuth-aware GPT Action — set Authentication: OAuth in the Custom GPT builder, paste the endpoints from /.well-known/oauth-authorization-server
  • Static-token fallback — complete the OAuth flow once via cURL (see manual flow above), copy the access token, paste it as a Bearer header. Refresh manually before the 1h expiry.

Any HTTP Client (after completing OAuth flow)

# cURL — assumes you already ran the OAuth flow and have $ACCESS_TOKEN
curl -X POST https://cloud.pinepaper.studio/mcp/v1 \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":"1","method":"tools/list"}'

# Python — full client with refresh handling
import requests

def call_mcp(access_token, method, params=None):
    res = requests.post(
        "https://cloud.pinepaper.studio/mcp/v1",
        headers={"Authorization": f"Bearer {access_token}"},
        json={"jsonrpc": "2.0", "id": "1", "method": method, "params": params or {}}
    )
    if res.status_code == 401:
        raise RuntimeError("Access token expired — call POST /oauth/token with refresh_token")
    return res.json()

def refresh(client_id, refresh_token):
    res = requests.post(
        "https://cloud.pinepaper.studio/oauth/token",
        data={
            "grant_type": "refresh_token",
            "client_id": client_id,
            "refresh_token": refresh_token,
        }
    )
    return res.json()  # { access_token, refresh_token (new!), expires_in }

Supported Platforms

PlatformIntegrationAuth
Claude Desktop 0.10+Native MCPAuto OAuth discovery
Cursor IDEMCP extensionAuto OAuth discovery
ChatGPTCustom GPT ActionsManual OAuth or static token
Google GeminiFunction CallingManual OAuth or static token
Open WebUIFunction CallingManual OAuth or static token
LangChainCustom ToolsManual OAuth or static token

Examples

Animated Text

"Create text 'HELLO' in red that pulses"
→ pinepaper_create_item + pinepaper_animate

Letter Collage

"Create a Wordle-style letter collage saying CANDY with neon colors"
→ pinepaper_create_letter_collage + pinepaper_animate_letter_collage

Flowchart Diagram

"Create a flowchart: Start → Process → Decision → End"
→ pinepaper_create_diagram_shape + pinepaper_connect + pinepaper_auto_layout

Solar System

"Create a sun at center, Earth orbiting it, Moon orbiting Earth"
→ pinepaper_create_item + pinepaper_add_relation (orbits)

World Choropleth Map

"Load a world map and color countries by population"
→ pinepaper_load_map + pinepaper_apply_data_colors

Animated Map

"Animate US states changing color in a wave pattern"
→ pinepaper_load_map + pinepaper_animate_map_wave

Camera Animation

"Zoom in on the title then pan across to the diagram"
→ pinepaper_camera_animate with keyframes

Particle Effects

"Add fire effect to the dragon and snow falling on the scene"
→ pinepaper_apply_effect (fire, snow)

Interactive Quiz

"Create a multiple choice quiz about world capitals"
→ pinepaper_create_quiz with questions and answers

Mask Reveals

"Reveal the title with an iris animation"
→ pinepaper_apply_animated_mask (iris preset)

Drawn Films (the draw contract)

There are two ways to make a piece. Tools assemble it from Studio items — text, shapes, charts, diagrams, rigs — and everything lands on the canvas, editable. A drawn film is for a picture that is painted: scenery, characters, weather, light. The model (or you) writes one plain Canvas 2D program, a pure function of time, and PinePaper renders it to MP4 or GIF. Nothing stands between the drawing and the pixels, which is why it looks better for illustration.

What makes a drawn film more than a video is its declaration: a list of every thing on screen, by name. That list is what can be selected, moved, recoloured, hidden and retimed — and what carries a film towards the Studio.

The program

const meta = { duration: 20, fps: 24, size: [1280, 720], seed: 7 };

// EVERYTHING ON SCREEN IS A NAMED ENTITY — the sky and the ground too. This list is what makes
// the film editable: each entity can be selected, moved, recoloured, hidden or retimed by id.
const entities = [
// `kit` is the design graph's motion techniques (listed below): call them, never rewrite them.
  { id: 'sky', kind: 'background', from: 0, to: 20,
    params: { top: '#0b1026', bottom: '#f4a259' },
    draw(ctx, t, p, rng) { kit.sky(ctx, 1280, 720, [p.top, p.bottom]); } },
  { id: 'ground', kind: 'background', from: 0, to: 20,
    params: { fill: '#6aa85a' },
    draw(ctx, t, p, rng) { GROUND.at = kit.hills(ctx, { w: 1280, h: 720, y: 560, scroll: t * 120, fill: p.fill, hatch: 'rgba(40,90,40,0.4)' }); } },
  { id: 'hero', kind: 'character', from: 0, to: 20,
    params: { x: 300, size: 0.22, color: '#d9622b' },
    // On screen from the first frame, then it acts. Anticipation, a move eased in and out, a squash on landing: the principles, by name. Its personality is in the motion; eyes: 0, because this brief asked for no character or face.
    draw(ctx, t, p, rng) { const x = p.x + 500 * kit.ease.inOut(kit.seg(t, 2.4, 3.6)), s = kit.squash(t, 3.6);
      kit.character(ctx, x, GROUND.at(x), { size: p.size, color: p.color, sx: s.sx, sy: s.sy, eyes: 0 }); },
    bounds(t, p) { const d = p.size * 720; return [p.x - d / 2, 560 - d, d, d]; } },
];
const GROUND = { at: (x) => 560 };   // shared: the hero stands on whatever the ground entity drew

// draw() IS the loop. Write it exactly like this and draw nothing outside an entity.
// A CAMERA is an entity too: { id: 'camera', kind: 'camera', from, to, params, draw(ctx, t, p) { kit.camera(ctx, t, p.keys); } }
// — its draw only TRANSFORMS. The loop applies it inside each world entity's window; titles, captions and overlays stay put.
function draw(ctx, t, params, rng) {
  const cam = entities.find((e) => e.kind === 'camera' && t >= e.from && t <= e.to);
  for (const e of entities) {
    if (t < e.from || t > e.to) continue;
    if (e.kind === 'camera') continue;
    ctx.save();
    if (cam && !/^(overlay|title|caption|type)$/.test(e.kind)) cam.draw(ctx, t, cam.params, rng.for(cam.id));
    e.draw(ctx, t, e.params, rng.for(e.id));
    ctx.restore();
  }
}
  • meta is read without running your code, so every value is a plain number.
  • draw(ctx, t, params, rng) draws the whole frame for time t (seconds). It must be pure: no Math.random, no clocks, no network, no DOM, nothing carried between calls. That is what lets one program be a preview, a loop and a 10-minute render that all agree.
  • entities lists what is on screen in paint order. draw() is the loop over it, and nothing is drawn outside an entity.
  • Each entity reads every tunable from its params (p.x, p.color) — an edit changes params, so a draw that ignores them cannot be edited.
  • rng.for(e.id) gives each entity its own seeded randomness: hiding one thing never changes another.
  • bounds(t, p) returns [x, y, w, h] at time t, which is what lets a person click the thing.
  • Length: any. One render job covers up to 600 seconds; a longer film renders as segments (exportProfile.segment = { index, count }) on one timeline that join end to end. Program size: up to 16 MB. A frame that takes longer than 1.5 s to draw fails the render by name.

A score

Add compose(params) returning timed notes — { inst, t, midi, dur, vel } — on the same clock as draw, and the export mixes them into the MP4 with the same engine mixer every PinePaper score uses. Instruments: piano, guitar, harp, bass, violin, cello, flute, clarinet, trumpet, horn, marimba, pad, strings, pluck, bell, organ, sine (pitched; midi 60 is middle C); drums: kick, snare, tom, hat, clap; effects: beep, pop, noise, wind, whoosh, zap. Notes that start after the film ends are dropped; at most 4,000 are played. A film without compose exports with no audio track at all, not a silent one. In the chat and on /try, the player shows a Sound switch on any film with a score; it plays the same notes through the same mixer as the export, so what you hear while editing is what the file will contain.

Is the declaration true? The honesty check

A declaration is never taken on trust. The film is drawn twice — once by draw(), once entity by entity from the list — and the two are compared pixel by pixel across the film. If they match, everything on screen is a named, editable thing. If they do not, the difference is the undeclared content. A film is scored by its worst sampled frame, not its average: one undeclared shot is a shot nobody can edit. The chat runs this check itself the moment a film arrives and says the result in words — and when a film falls short, one click asks the model to declare the rest.

Render it

POST /v1/renders
{
  "drawContract": "const meta = { … }; const entities = [ … ]; function draw(ctx, t, params, rng) { … }",
  "exportProfile": {
    "format": "mp4",
    "resolution": "720p"
  }
}

Priced by the same formula as any render; POST /v1/renders:estimate is free. A program with no entities still renders, and the response carries a DRAW_CONTRACT_UNDECLARED warning saying nothing in it can be edited by name.

Edit it by declaration

POST /v1/renders
{
  "drawContract": "…the same program…",
  "decl": {
    "hide": [
      "title"
    ],
    "params": {
      "fox": {
        "color": "#3aa0ff",
        "x": 420
      }
    },
    "timing": {
      "fox": {
        "from": 1.5,
        "to": 8
      }
    },
    "add": [
      {
        "id": "tagline",
        "kind": "text",
        "from": 2,
        "to": 7,
        "params": {
          "text": "Winter Arrival",
          "x": 640,
          "y": 120,
          "color": "#ffffff",
          "size": 36
        }
      }
    ]
  },
  "exportProfile": {
    "format": "gif"
  }
}

decl.hide removes entities by id; decl.params overrides an entity's parameters; decl.timing shifts or retimes an entity's from and to playback window; decl.add injects new canvas entities (text, badges, subtitles, shape overlays) with custom timing and params. Only the specified entities change — this is tested on real pixels. The underlying program itself does not need to be rewritten.

Edit it in the chat

When a film declares its entities, the chat lists them under the player. Click one in the list — or click it in the picture, if it has bounds — and its parameters become controls: colours, numbers, text, on/off. You can hide it or reset it, and drag it: position is params.x / params.y by convention, so anything that declares them goes where you drop it. Things that depend on each other share their params object, so a rider moves with its mount. The film re-plays with your changes at once, and Export sends exactly those changes as decl, so the file matches what you saw. An untouched film sends no decl at all.

What it cannot do yet

  • A drawn film exports as MP4 or GIF. PNG, PDF and SVG are refused by name rather than returned blank.
  • Retiming and canvas additions: You can retime existing elements (decl.timing) and add new graphic overlays, text callouts, subtitles, and badges (decl.add) directly on canvas without asking the model for a redesign turn. Arbitrary algorithmic motion logic changes still benefit from model collaboration.
  • Inside the Studio, Run on Canvas puts a film on the canvas as one live layer: it plays with the Studio timeline, can be moved and scaled, and the Studio can export it. Its entities are not yet separate Studio items — they are edited in the chat panel.
  • Sound: instruments are the engine's built-in set; a program cannot define its own. A GIF has no sound.

Making Films: templates, sound, reuse & your characters

Ask the Studio for a film in your own words. What happens next depends on what you asked for — the fastest answer that fits is used, and the answer always says which.

Three ways a request is answered

  1. From a template, in seconds. When a template already makes what you asked for — an invite, a sale, a quote, a recipe, a product launch, a routine — it is filled in with your words, dates, places and colours and answered in about ten seconds. The answer says "Started from the Event Invite template". Want something original instead? Add "from scratch" to your request. Filling a template costs about $0.001; rendering it is priced like any render.
  2. From your own earlier films. When you have rendered films before, a new film reuses your own parts: a hero with the same name is used exactly as you made it, and a scene like one you made is the starting point for the new one. This is private to your account (see below).
  3. Directed fresh. Anything else — a story, an explainer, a new world — is planned and written as a film: a plan, then every scene, the hero and the score written in parallel, each part run before it is handed to you (a part that crashes is rewritten), captions fitted inside the frame and drawn above the artwork. A 30-second film takes about two minutes. Films are up to 3 minutes long for now; a longer request is cut off at 3 minutes rather than rushed to fit.

Music and voice-over

  • Every directed film has a score, written for the whole film: a whoosh into each scene change, a hit on each caption, chords that change with the cuts and a mood that follows the story. If the score cannot be written, the film still arrives — silent — and the answer says so.
  • A voice-over only when you ask for one: "with a voice-over", "narrated by a warm voice", "a narrator tells the story". A narrator writes up to 8 short passages, each is voiced and placed on the timeline, and the music is lowered under the voice. Say "no voice-over" to make sure there is none.
  • Price: the voice is charged on the seconds spoken (about $0.04 a minute through 2026), on its own line in your billing. A passage that cannot fit before the end of the film is left out before it is voiced, so you never pay for speech the film cannot hold.

Your work is reused — privately

  • Only films you render are kept. Drafts are not. When a render succeeds, its scenes, hero and score are noted for your account: a small index of pointers into the render we already keep for you, not a second copy of your design.
  • Only you benefit. Your parts are only ever looked up for your own account. Another account typing the same words gets nothing of yours.
  • On by default, yours to turn off. Your account has the switch and a "Forget everything" button: off, new films start fresh and nothing new is noted; Forget everything deletes what was noted (your renders and characters stay). Deleting your account deletes it with your renders.

Your characters, and calling them with @

  • A film's hero is saved as one of your characters under the name you gave it — write "BOT-001, a small orange box-robot" in your request, render the film, and BOT-001 is yours. A character already holding a name is never replaced by a later film; the new film is added to its list.
  • Call it with @. In the Studio, ask for "a 20-second film of @BOT-001 at the beach": that exact character — as you made it — is the hero of the new film, in any conversation. A name you do not have is said back to you, not guessed at. Ask for a film (a length or the word "film"); a bare "@BOT-001 waving" may be drawn as a still.
  • Coming next in the Studio: typing @ lists your characters with a picture, and a "My ontology" view shows everything you have made as a graph — each character, what kind of thing it is, and the films it is in. Until then, the API below lists them.

API

CallWhat it does
GET /v1/my/concepts?q=Your characters, newest first; q filters by name.
POST /v1/my/concepts { "renderId": "…", "entityId": "pip", "name": "Pip" }Save a character from one of your finished films (a part the film marks as a character). "dryRun": true says what would be saved and writes nothing. A name you already have is never replaced: 409 with that character; "link": true adds this film to it instead.
PATCH /v1/my/concepts/{id} { "label": "Bolt" }Rename one (409 if you already have that name).
DELETE /v1/my/concepts/{id}Forget one character. Its films and renders are untouched.
POST /v1/inference (Studio design turn)The answer carries fromTemplate when a template answered, filmSound (music, voice-over passages, voice price, anything left out), filmReused (what came from your earlier films) and mentions (which @names were yours, which were not found).
POST /v1/template-route:probe { "briefs": [...] }Which template, if any, would answer each request — and how sure the choice is. Designs nothing.

Export on your own device

In the Studio's Export dialog, a computer that is up to it gets Export on this device · free next to the server render. The video (MP4, WebM or GIF) is made in your browser by the same frame-stepped engine the canvas plays — nothing is uploaded and no credits are used. It is offered when the browser has a video encoder (WebCodecs), 4 or more processor cores and, where the browser reports it, 4 GB of memory or more; how long a video it offers grows with the device (a GPU and a hardware encoder count). The dialog says why when it is not offered.

What only a server render adds — the dialog names whichever applies before you choose: the film's music score and voice-over mix, your mark and its verify code, the resolution picker (a device export is made at the canvas's own size), and a true MP4 in a browser with no H.264 encoder (it makes a WebM instead, and names the file that way).

Audio & Voice Synthesis

PinePaper Cloud provides high-fidelity audio engineering for all animated and video productions, adhering to streaming broadcast standards. Audio is never an afterthought or an unmetered novelty — every track is mastered, synchronized, and cryptographically accounted for.

Streaming Loudness Standards

Every export containing audio is mastered to professional streaming broadcast specifications: Stereo, 48 kHz, −14 LUFS integrated loudness, and −1 dBTP true peak (the industry standard required by YouTube, Spotify, and broadcast networks). Dialogue-led scenes target −16 LUFS to ensure crystal-clear vocal intelligibility.

Real-Time Sidechain Ducking

When voice narration or dialogue plays alongside a musical score or sound effects, the audio engine applies dynamic sidechain compression. The musical score smoothly and continuously ducks underneath the vocal frequencies, rising back to full presence during pauses, avoiding stepped or artificial volume jumps.

Voice Synthesis (/v1/voice & pinepaper_voice)

Generate high-clarity voice tracks with natural inflections, pauses, and character personas:

  • Default Platform Engine: Google Gemini 3.8 Flash TTS — ranked #2 on the Artificial Analysis Speech Arena (Elo 1264). Delivers low-latency multi-speaker synthesis across 100+ languages with built-in C2PA metadata.
  • Bring Your Own Key (BYOK): Connect your own keys for ElevenLabs (v3 / Flash v2.5), Cartesia Sonic 3.6, or OpenAI (gpt-4o-mini-tts). Store your keys encrypted per-organization via POST /v1/apikeys. With BYOK, you only pay a nominal platform coordination fee ($0.002) while your vendor account pays the usage.
  • Multi-Speaker Scripts: Support for multi-speaker dialogues with voice casting per line (e.g. Puck & Kore).
POST /v1/voice
{
  "text": "PinePaper turns prompts into knowledge graphs and brings them to life on canvas.",
  "voice": "Puck",
  "language": "en-US",
  "speed": 1.0
}

Knowledge Graph Content Recipes & Design Direction

Instead of requiring bespoke tools for every marketing visual, PinePaper encodes quality-tested creative workflows as Knowledge Graph Nodes that any designer or agent accesses automatically via pinepaper_design_direction or natural prompt matching:

  • Accessible Timed Captions (caption_layout): Enforces 8 verified rules including 90% title-safe margins (yFrac 0.78–0.88), ≥5.5% canvas font size, 5-word / 2.8s phrase limits, contrast backing boxes (rgba(0,0,0,0.65)), keyframe synchronization to Whisper speech timestamps, and social word-highlight pop (#ffe500) or kinetic punch.
  • Vox Editorial Explainer Boards (vox_board): Structural 9% gutter margin hanging all text, ≥96px hero stat callouts, animated 1–2px separator rules, 4-tier typographic hierarchy, and verified ≥4.5:1 contrast against panel backing.
  • Ken Burns Documentary Photo Walks (photo_walk): Continuous subtle scale drift (1.0 → 1.10) anchored to detected faces/focal points, 0.4–0.8s paired crossfade dissolves, beat-aligned cutting, and normalized aspect ratios.
  • Social Share & OpenGraph Cards (share_card): Standard 1200×630 (1.91:1) and 1080×1080 safe canvases, ≥54px mobile-legible headlines, anchored brand badges with 32px safe padding, and high-contrast scrim backing.
  • Compact Result Mode (compact: true): Autonomous agents can pass compact: true in MCP tools/call to reduce token payloads by ~90%, returning concise bounds, findings, warnings, and success flags.
  • Unwrapped Results (unwrap: true): By default /rpc returns one text block whose text is the tool's whole result serialised as JSON, so an MCP client reads escaped JSON and pays tokens for the escaping. Pass unwrap: true (alias unwrapContent: true) in tools/call to receive the tool's own content array directly, with isError propagated — except when the package refused a call that your cloud canvas drew anyway: then isError is false, _canvas.createdCount says what was drawn and _canvas.packageRefusal keeps the package's words. Omit it to keep the single-text-block shape existing agent parsers expect.

Knowledge Graph Audio & Composition Engine (pinepaper_audio_compose)

Arrange, orchestrate, and mix scores deterministically from high-level narrative briefs using the Audio Knowledge Graph:

  • Orchestral Ensembles & Forms: Select curated ensembles (Chamber Strings, Symphonic, Ambient Synth, Hybrid Trailer) and musical form structures (Three-Act Arc, Product Explainer, Continuous Looping Bed).
  • Moods & Tonal Palettes: Compose across harmonic tension profiles and modal scales (Major, Minor, Pentatonic, Lydian, Dorian, Phrygian).
  • Visual Scene Synchronization: Declare reactive bindings between visual animation triggers (step, land, hit, entrance, exit) and score cues.
  • Output Mixing Nodes & Bus Ducking: Stems route through dedicated KG buses (Master, Voiceover, Music, SFX, Ambience) with automatic -12 dB sidechain ducking under dialogue and calibrated LUFS mastering.

Google Lyria & Model Training

Generate music with Google DeepMind's Lyria 3.5 through the Gemini API: full songs up to a couple of minutes, with length steered by the prompt.

  • SynthID: Google embeds an inaudible SynthID watermark in every Lyria output.
  • Model training: On a paid-tier Gemini API key, Google does not use your prompts or generated audio to improve its products; on a free-tier key it does. No request setting changes this, so if you bring your own key, its tier decides.
  • Sound & Audio Model Hub: Manage active music, SFX, and custom audio models, with encrypted BYOK key storage via GET/PUT /v1/sound/config and /v1/sound/keys.

Provenance

Each cloud render carries a machine-readable record of how it was made. Today that record is unsigned: it states what produced the file, but it is not a cryptographic proof of origin, and anyone could write one.

What is written today (phase 1, unsigned)

A pinepaper.provenance/1 JSON record — render id, content hash, format, render engine and pipeline revision, the designing model, provider and prompt (capped at 500 characters), the licence of each audio track, and the render time — is written into the file:

  • MP4 / WebM: the container comment tag (ffprobe -show_format prints it).
  • PNG: an iTXt chunk with keyword PinePaperProvenance.
  • GIF: a Comment Extension.
  • PDF: the Info dictionary, key /PinePaperProvenance.

The record names no requester and carries no fingerprint. /verify (signed in) reads the PNG and GIF records and shows them exactly as embedded; exiftool or ffprobe read every format without an account.

Planned: C2PA signing

Signing the finished file with a C2PA manifest (c2patool in the render container, with a Level 1 certificate) is designed and waiting on our enrolment in the C2PA Conformance Program. Until then no PinePaper render is C2PA-signed.

Your visible mark

Any MP4, WebM, GIF, PNG or PDF render can carry your own visible mark — your text, your logo from your media, or both — drawn by the renderer on every frame: exportProfile.watermark = { text?, logo?, position?, opacity?, size?, verify? }. With verify: true the file also carries a short code that anyone can look up to see what you chose to say, when it was rendered and the file's content hash — so a real piece can be told from a copy with the mark pasted on. It names no account. Free, and opt-in.

Not built: invisible watermarking

No invisible watermark is applied to any export. Metadata can be stripped by platforms that re-encode uploads; the visible mark above survives a re-encode, but nothing invisible does yet.

Local Installation (Free)

Try the tools locally first!
The open-source MCP server is free and runs on your own computer. It shares the core canvas tools with this cloud service, but the two sets are not identical: cloud rendering, drawn films, voice and the design graph (pinepaper_render, pinepaper_film, pinepaper_voice, pinepaper_kg_*) are cloud-only.

Claude Desktop

Download the PinePaper extension (.mcpb) and open it. Claude Desktop installs it, with no config file to edit. It uses your installed Google Chrome.

Other MCP clients

The server needs Puppeteer to draw; without it, tools return code instead of drawing. Use npx with Puppeteer alongside:

{
  "mcpServers": {
    "pinepaper": {
      "command": "npx",
      "args": ["-y", "-p", "puppeteer", "-p", "@pinepaper.studio/mcp-server", "pinepaper-mcp"]
    }
  }
}

Or install both globally and point your client at the installed command:

npm install -g @pinepaper.studio/mcp-server puppeteer

{
  "mcpServers": {
    "pinepaper": {
      "command": "pinepaper-mcp"
    }
  }
}

The cloud service is for users who:

  • Want remote access without local installation
  • Need hosted infrastructure
  • Use AI clients that don't support local MCP servers

View on GitHub →