Permite a los asistentes de IA crear y animar gráficos vectoriales, diagramas y visualizaciones de datos mediante 178 herramientas especializadas.
También conocido como pinepaper/mcp-server, @pinepaper.studio/mcp-server
- Stars
- 6
- Herramientas
- 178
- Descargas, 30 días
- —
- Última versión
- —
- Último commit
- 14 nov 2026
- Licencia
- MIT
¿Qué es PinePaper Studio MCP?
PinePaper Studio es un MCP server. Permite a los asistentes de IA crear y animar gráficos vectoriales, diagramas y visualizaciones de datos mediante 178 herramientas especializadas. Expone 178 herramientas, como pinepaper_draw_weave, pinepaper_draw_knots, pinepaper_draw_sashiko.
Resumen generado a partir del README del proyecto
Acerca del MCP server de PinePaper Studio
PinePaper MCP Server permite a los asistentes de IA generar y animar gráficos vectoriales, diagramas y visualizaciones de datos. Ofrece una suite masiva de 178 herramientas especializadas que cubren áreas como tipografía, simulaciones físicas, mapas y edición de imágenes. Los usuarios pueden dar instrucciones a una IA para crear formas geométricas, collages de texto o gráficos de datos complejos usando lenguaje natural.
El servidor se puede ejecutar localmente de forma gratuita o a través de un servicio alojado en cloud.pinepaper.studio. La instalación local requiere Node 22.13 o superior y utiliza Puppeteer para controlar un navegador Chrome, lo que requiere aproximadamente 320 MB de espacio en disco y 1 GB de memoria. La versión alojada funciona mediante HTTP y gestiona la codificación de video en el servidor usando ffmpeg.
Los desarrolladores pueden exportar sus creaciones como SVG, HTML interactivo o formatos de video como MP4 y WebM. Mientras que la versión local ofrece la totalidad de las herramientas, incluyendo funciones que dependen de la interfaz de usuario, la versión alojada proporciona pruebas de LLM gestionadas y renderizado de video duradero. Los ajustes de seguridad permiten a los usuarios habilitar explícitamente la ejecución de JavaScript personalizado o el acceso a archivos locales.
Qué puedes hacer con él
- 1Diseñar visualizaciones de datos complejasUn desarrollador puede pedirle a una IA que construya gráficos y diagramas interactivos utilizando herramientas de datos especializadas.
- 2Aplicar efectos de texto avanzadosPuedes instruir a una IA para que aplique deformaciones a nivel de carácter o estilos tipográficos específicos al texto.
- 3Simular comportamientos de objetosUna IA puede establecer relaciones entre objetos para hacer que orbiten, sigan o reflejen el movimiento de otros.
Escrito a partir del README del proyecto. Cada caso de uso se verifica con una cita del mismo.
Cómo instalar PinePaper Studio MCP
Formatos verificados el 10 nov 2026Añadir a CursorAñadir a GooseInstalar PinePaper Studio MCP en Claude Code
$ claude mcp add mcp-server -- npx -y @pinepaper.studio/mcp-serverInstalar PinePaper Studio MCP en Cursor
~/.cursor/mcp.json
{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@pinepaper.studio/mcp-server"
]
}
}
}Instalar PinePaper Studio MCP en VS Code
.vscode/mcp.json
{
"servers": {
"mcp-server": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@pinepaper.studio/mcp-server"
]
}
}
}Instalar PinePaper Studio MCP en VS Code CLI
$ code --add-mcp '{"name":"mcp-server","type":"stdio","command":"npx","args":["-y","@pinepaper.studio/mcp-server"]}'Instalar PinePaper Studio MCP en Claude Desktop
claude_desktop_config.json
{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@pinepaper.studio/mcp-server"
]
}
}
}Instalar PinePaper Studio MCP en Codex
$ codex mcp add mcp-server -- npx -y @pinepaper.studio/mcp-serverInstalar PinePaper Studio MCP en Codex config.toml
~/.codex/config.toml
[mcp_servers.mcp-server] command = "npx" args = ["-y", "@pinepaper.studio/mcp-server"]
Instalar PinePaper Studio MCP en Gemini CLI
$ gemini mcp add -s user mcp-server npx -- -y @pinepaper.studio/mcp-serverInstalar PinePaper Studio MCP en Gemini settings.json
~/.gemini/settings.json
{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@pinepaper.studio/mcp-server"
]
}
}
}Herramientas de PinePaper Studio MCP 178
Detectado desde el READMEpinepaper_draw_weavepinepaper_draw_knotspinepaper_draw_sashikopinepaper_draw_subdivisionpinepaper_ui_kitpinepaper_set_background_colorpinepaper_set_canvas_sizepinepaper_get_canvas_sizepinepaper_clear_canvaspinepaper_refresh_pagepinepaper_backgroundpinepaper_create_item
| pinepaper_draw_weave | — | |
| pinepaper_draw_knots | — | |
| pinepaper_draw_sashiko | — | |
| pinepaper_draw_subdivision | — | |
| pinepaper_ui_kit | — | |
| pinepaper_set_background_color | — | |
| pinepaper_set_canvas_size | — | |
| pinepaper_get_canvas_size | — | |
| pinepaper_clear_canvas | — | |
| pinepaper_refresh_page | — | |
| pinepaper_background | — | |
| pinepaper_create_item | — |
Mostrar las 178 herramientasMostrar menos herramientas
pinepaper_modify_itempinepaper_delete_itempinepaper_create_gridpinepaper_create_glossy_spherepinepaper_create_diagonal_stripespinepaper_geometrypinepaper_grouppinepaper_arrangepinepaper_pathpinepaper_batch_createpinepaper_batch_modifypinepaper_import_motion_capturepinepaper_import_svgpinepaper_import_imagepinepaper_detect_objectspinepaper_extract_objectpinepaper_search_assetspinepaper_import_assetpinepaper_add_relationpinepaper_remove_relationpinepaper_query_relationspinepaper_register_custom_relationpinepaper_soundpinepaper_motionpinepaper_animatepinepaper_keyframe_animatepinepaper_choreographpinepaper_play_timelinepinepaper_staggerpinepaper_patternpinepaper_flippinepaper_get_animatable_propertiespinepaper_get_available_easingspinepaper_construction_sequencepinepaper_hand_drawnpinepaper_pen_figurepinepaper_apply_animated_maskpinepaper_apply_custom_maskpinepaper_remove_maskpinepaper_get_mask_typespinepaper_get_mask_animationspinepaper_camerapinepaper_camera_animatepinepaper_camera_directorpinepaper_create_scenepinepaper_manage_scenespinepaper_scene_playbackpinepaper_scene_graphpinepaper_sequencepinepaper_eventpinepaper_execute_generatorpinepaper_list_generatorspinepaper_generatepinepaper_generate_estimatepinepaper_generate_statuspinepaper_styled_scenepinepaper_apply_effectpinepaper_lookpinepaper_original_characterpinepaper_morph_sequencepinepaper_emitterpinepaper_render_hookpinepaper_text_effectpinepaper_add_filterpinepaper_relightpinepaper_shader_graphpinepaper_selectionpinepaper_transformpinepaper_historypinepaper_composepinepaper_design_mediumpinepaper_brand_kitpinepaper_componentpinepaper_artboardpinepaper_commentpinepaper_provenancepinepaper_scene_diffpinepaper_audio_beatspinepaper_template_paramspinepaper_render_batchpinepaper_image_filterpinepaper_crop_imagepinepaper_chroma_keypinepaper_shatter_imagepinepaper_lassopinepaper_cutout_stylepinepaper_precomppinepaper_deformpinepaper_sprite_sheetpinepaper_interactionpinepaper_create_chartpinepaper_equation_pathpinepaper_create_diagram_shapepinepaper_connectpinepaper_connect_portspinepaper_add_portspinepaper_auto_layoutpinepaper_get_diagram_shapespinepaper_update_connectorpinepaper_remove_connectorpinepaper_diagram_modepinepaper_import_mermaidpinepaper_mappinepaper_map_regionspinepaper_map_animationpinepaper_map_datapinepaper_globepinepaper_mediapinepaper_riggingpinepaper_import_layered_characterpinepaper_design_systempinepaper_stickpinepaper_storypinepaper_characterpinepaper_fontpinepaper_text_stylepinepaper_create_letter_collagepinepaper_animate_letter_collagepinepaper_magicpinepaper_physicspinepaper_gamepinepaper_world3dpinepaper_measurementpinepaper_apply_templatepinepaper_get_itemspinepaper_get_relation_statspinepaper_querypinepaper_query_capabilitiespinepaper_get_canvas_ontologypinepaper_query_ontologypinepaper_analyze_designpinepaper_validate_designpinepaper_validatepinepaper_beat_cutspinepaper_query_mutationspinepaper_accessibility_checkpinepaper_validate_scenepinepaper_instantiate_ontologypinepaper_lint_scenepinepaper_export_svgpinepaper_export_scenepinepaper_import_scenepinepaper_place_on_surfacepinepaper_export_training_datapinepaper_export_widgetpinepaper_export_widget_htmlpinepaper_capture_framespinepaper_agent_start_jobpinepaper_agent_end_jobpinepaper_agent_resetpinepaper_agent_batch_executepinepaper_interchangepinepaper_agent_exportpinepaper_export_storepinepaper_agent_analyzepinepaper_browser_connectpinepaper_browser_disconnectpinepaper_browser_screenshotpinepaper_browser_statuspinepaper_tool_guidepinepaper_set_toolkitpinepaper_get_performance_metricspinepaper_diagnostic_reportpinepaper_execute_custom_codepinepaper_p5_drawpinepaper_register_item
| pinepaper_modify_item | — | |
| pinepaper_delete_item | — | |
| pinepaper_create_grid | — | |
| pinepaper_create_glossy_sphere | — | |
| pinepaper_create_diagonal_stripes | — | |
| pinepaper_geometry | — | |
| pinepaper_group | — | |
| pinepaper_arrange | — | |
| pinepaper_path | — | |
| pinepaper_batch_create | — | |
| pinepaper_batch_modify | — | |
| pinepaper_import_motion_capture | — | |
| pinepaper_import_svg | — | |
| pinepaper_import_image | — | |
| pinepaper_detect_objects | — | |
| pinepaper_extract_object | — | |
| pinepaper_search_assets | — | |
| pinepaper_import_asset | — | |
| pinepaper_add_relation | — | |
| pinepaper_remove_relation | — | |
| pinepaper_query_relations | — | |
| pinepaper_register_custom_relation | — | |
| pinepaper_sound | — | |
| pinepaper_motion | — | |
| pinepaper_animate | — | |
| pinepaper_keyframe_animate | — | |
| pinepaper_choreograph | — | |
| pinepaper_play_timeline | — | |
| pinepaper_stagger | — | |
| pinepaper_pattern | — | |
| pinepaper_flip | — | |
| pinepaper_get_animatable_properties | — | |
| pinepaper_get_available_easings | — | |
| pinepaper_construction_sequence | — | |
| pinepaper_hand_drawn | — | |
| pinepaper_pen_figure | — | |
| pinepaper_apply_animated_mask | — | |
| pinepaper_apply_custom_mask | — | |
| pinepaper_remove_mask | — | |
| pinepaper_get_mask_types | — | |
| pinepaper_get_mask_animations | — | |
| pinepaper_camera | — | |
| pinepaper_camera_animate | — | |
| pinepaper_camera_director | — | |
| pinepaper_create_scene | — | |
| pinepaper_manage_scenes | — | |
| pinepaper_scene_playback | — | |
| pinepaper_scene_graph | — | |
| pinepaper_sequence | — | |
| pinepaper_event | — | |
| pinepaper_execute_generator | — | |
| pinepaper_list_generators | — | |
| pinepaper_generate | — | |
| pinepaper_generate_estimate | — | |
| pinepaper_generate_status | — | |
| pinepaper_styled_scene | — | |
| pinepaper_apply_effect | — | |
| pinepaper_look | — | |
| pinepaper_original_character | — | |
| pinepaper_morph_sequence | — | |
| pinepaper_emitter | — | |
| pinepaper_render_hook | — | |
| pinepaper_text_effect | — | |
| pinepaper_add_filter | — | |
| pinepaper_relight | — | |
| pinepaper_shader_graph | — | |
| pinepaper_selection | — | |
| pinepaper_transform | — | |
| pinepaper_history | — | |
| pinepaper_compose | — | |
| pinepaper_design_medium | — | |
| pinepaper_brand_kit | — | |
| pinepaper_component | — | |
| pinepaper_artboard | — | |
| pinepaper_comment | — | |
| pinepaper_provenance | — | |
| pinepaper_scene_diff | — | |
| pinepaper_audio_beats | — | |
| pinepaper_template_params | — | |
| pinepaper_render_batch | — | |
| pinepaper_image_filter | — | |
| pinepaper_crop_image | — | |
| pinepaper_chroma_key | — | |
| pinepaper_shatter_image | — | |
| pinepaper_lasso | — | |
| pinepaper_cutout_style | — | |
| pinepaper_precomp | — | |
| pinepaper_deform | — | |
| pinepaper_sprite_sheet | — | |
| pinepaper_interaction | — | |
| pinepaper_create_chart | — | |
| pinepaper_equation_path | — | |
| pinepaper_create_diagram_shape | — | |
| pinepaper_connect | — | |
| pinepaper_connect_ports | — | |
| pinepaper_add_ports | — | |
| pinepaper_auto_layout | — | |
| pinepaper_get_diagram_shapes | — | |
| pinepaper_update_connector | — | |
| pinepaper_remove_connector | — | |
| pinepaper_diagram_mode | — | |
| pinepaper_import_mermaid | — | |
| pinepaper_map | — | |
| pinepaper_map_regions | — | |
| pinepaper_map_animation | — | |
| pinepaper_map_data | — | |
| pinepaper_globe | — | |
| pinepaper_media | — | |
| pinepaper_rigging | — | |
| pinepaper_import_layered_character | — | |
| pinepaper_design_system | — | |
| pinepaper_stick | — | |
| pinepaper_story | — | |
| pinepaper_character | — | |
| pinepaper_font | — | |
| pinepaper_text_style | — | |
| pinepaper_create_letter_collage | — | |
| pinepaper_animate_letter_collage | — | |
| pinepaper_magic | — | |
| pinepaper_physics | — | |
| pinepaper_game | — | |
| pinepaper_world3d | — | |
| pinepaper_measurement | — | |
| pinepaper_apply_template | — | |
| pinepaper_get_items | — | |
| pinepaper_get_relation_stats | — | |
| pinepaper_query | — | |
| pinepaper_query_capabilities | — | |
| pinepaper_get_canvas_ontology | — | |
| pinepaper_query_ontology | — | |
| pinepaper_analyze_design | — | |
| pinepaper_validate_design | — | |
| pinepaper_validate | — | |
| pinepaper_beat_cuts | — | |
| pinepaper_query_mutations | — | |
| pinepaper_accessibility_check | — | |
| pinepaper_validate_scene | — | |
| pinepaper_instantiate_ontology | — | |
| pinepaper_lint_scene | — | |
| pinepaper_export_svg | — | |
| pinepaper_export_scene | — | |
| pinepaper_import_scene | — | |
| pinepaper_place_on_surface | — | |
| pinepaper_export_training_data | — | |
| pinepaper_export_widget | — | |
| pinepaper_export_widget_html | — | |
| pinepaper_capture_frames | — | |
| pinepaper_agent_start_job | — | |
| pinepaper_agent_end_job | — | |
| pinepaper_agent_reset | — | |
| pinepaper_agent_batch_execute | — | |
| pinepaper_interchange | — | |
| pinepaper_agent_export | — | |
| pinepaper_export_store | — | |
| pinepaper_agent_analyze | — | |
| pinepaper_browser_connect | — | |
| pinepaper_browser_disconnect | — | |
| pinepaper_browser_screenshot | — | |
| pinepaper_browser_status | — | |
| pinepaper_tool_guide | — | |
| pinepaper_set_toolkit | — | |
| pinepaper_get_performance_metrics | — | |
| pinepaper_diagnostic_report | — | |
| pinepaper_execute_custom_code | — | |
| pinepaper_p5_draw | — | |
| pinepaper_register_item | — |
Configuración
PINEPAPER_ALLOW_CODEPINEPAPER_ALLOW_LOCAL_FILESPINEPAPER_EXECUTION_MODEPINEPAPER_LOCALEPINEPAPER_METRICS_ENABLEDPINEPAPER_METRICS_RETENTION
| Nombre | Descripción | Tipo |
|---|---|---|
| PINEPAPER_ALLOW_CODE | — | |
| PINEPAPER_ALLOW_LOCAL_FILES | — | |
| PINEPAPER_EXECUTION_MODE | — | |
| PINEPAPER_LOCALE | — | |
| PINEPAPER_METRICS_ENABLED | — | |
| PINEPAPER_METRICS_RETENTION | — |
Verificaciones automáticas
Ejecutado 13 nov 2026Informe completo →Pasó nuestras verificaciones automáticas. Esto no es una auditoría de seguridad: lee el código y dale al servidor el acceso más limitado que necesite. Cómo funcionan las verificaciones
- Repositorio de origen vinculado y accesibleAprobado
- Licencia de código abierto (OSI)Aprobado
- Commit o lanzamiento en el último añoAprobado
- El nombre del paquete no es similar a un paquete popularAprobado
- El endpoint remoto usa HTTPSNo verificado
- Las herramientas destructivas están etiquetadasAprobado
- Sin instrucciones ocultas para el modeloAprobado
- No hay avisos críticos en el paquete ni en sus dependenciasNo verificado
README
Ver en GitHubPinePaper MCP Server
Create animated vector graphics with AI using the Model Context Protocol
English · 简体中文 · 日本語 · 한국어 · Español · Português (BR) · Français · Deutsch · हिन्दी
Everything above and below moves — these are animated SVGs exported straight from PinePaper tool calls, no video files, no GIFs. Open this README on GitHub and watch.
Overview
PinePaper MCP Server enables AI assistants to create and animate graphics in PinePaper Studio via the Model Context Protocol (MCP). Works with any AI that supports MCP tool calling (Claude, GPT, Gemini, local models, etc.).
The server exposes 178 tools across drawing, animation, diagrams, maps, typography, physics, image editing, data visualization, and export. Using natural language, you can:
- Create geometric shapes, text collages, diagrams, and data charts
- Apply 37+ character-level text effects and 28+ vertex deformation presets
- Wire behavioral relationships between objects (orbit, follow, point-at, mirror, parallax, morph)
- Animate with keyframes, timeline sequencing, and physics simulations
- Build interactive widgets with click/hover/drag event bindings
- Export to SVG, self-contained interactive HTML, MP4, and animated formats
Running it: local or hosted
Local is free and complete. Every one of the 178 tools works when you run this server yourself. There is no reduced tier and nothing held back.
What it needs:
| Node | 22.13 or newer (any supported Node release: 22, 24 or 26) |
| Disk | With Puppeteer (below), Chrome is downloaded on install — roughly 320 MB per version |
| Memory | a Chrome process plus the Studio canvas, so budget ~1 GB while a job runs |
That is fine on a laptop and awkward on a small VPS, a locked-down work machine, or a container you would rather keep thin.
cloud.pinepaper.studio runs the same server for you — same tools, same version, over HTTP with no install and no browser on your machine. It exists for three cases: you have no MCP client, you cannot install one, or your machine cannot spare the browser.
Hosting costs money, so the hosted option is paid — it runs on credits. See cloud.pinepaper.studio for current pricing. Run it locally if you can, but it is not identical, and the differences run both ways.
The hosted service runs a tested set of LLMs, repairs generated code before it reaches the canvas — which a local server structurally cannot do for itself — and encodes video server-side, in an ffmpeg container that owns the job durably. Locally, an export runs in your own browser: it needs Chrome and Puppeteer, it is bounded by your machine, and a long render occupies that browser for its duration.
What the local server has instead is the whole tool surface. Tools that need the editor's UI — selection, drag-and-drop, mode toggles — work here against a visible browser and are excluded from headless operation. Which model to trust is a question you can answer yourself rather than take on trust: a benchmark runs one prompt across several models and puts the results side by side, any run shareable. It is in invite-only beta.
FFmpeg is yours to install
The MCP server does not include, download or install FFmpeg, and PinePaper does not provide an FFmpeg build. If you want it, install it yourself from ffmpeg.org or your package manager. Your copy comes under FFmpeg's own licence and the licences of whatever codecs your build includes, and following those terms is up to you.
Most exports don't need it: MP4, WebM and the other formats are made in your browser. You need your own FFmpeg for these:
-
An MP4 that repeats byte for byte, on a machine where the browser's encoder won't. The export warns with
determinism_not_pinnedwhen that happens. Export the frames withpinepaper_interchange(export_png_sequence, passingdurationandfps), unzip them, and encode:ffmpeg -framerate 30 -i frame_%05d.png -c:v libx264 -pix_fmt yuv420p -crf 18 -threads 1 out.mp4Match
-framerateto thefpsyou exported, and use a build that includeslibx264. Keep-threads 1, because x264 can vary between runs when it uses several threads under a bitrate cap. The file repeats when the browser build, the FFmpeg build and the settings stay the same, but a different browser build can produce different frames. The frames carry no audio, so add any sound in FFmpeg. -
Formats browsers can't encode, such as ProRes and HAP, from the same frames.
-
In the Claude Desktop extension, joining a
perSceneexport and checking a saved video. These use theffmpegandffprobeon yourPATH; the extension bundles a small script that starts them, not the programs themselves. Without them, aperSceneexport runs whole and the check is skipped. The npm package never starts FFmpeg.
Quick start
Claude Desktop: download pinepaper-mcp-server.mcpb and open it. Desktop installs the server, with no config file to edit. It drives your installed Google Chrome; its settings choose another Chromium-based browser, the export folder and the tool list. Each release lists the file's SHA-256.
For other MCP clients: this package does not install Puppeteer, so a plain
npx @pinepaper.studio/mcp-server has no browser, and every tool returns the
code it would run instead of running it (the result says so). To execute in a
real browser, install Puppeteer in the same npx call. A separate
npm i puppeteer in your project is not visible to npx's copy of the server:
{
"mcpServers": {
"pinepaper": {
"command": "npx",
"args": ["-y", "-p", "puppeteer", "-p", "@pinepaper.studio/mcp-server", "pinepaper-mcp"]
}
}
}
Security switches: off by default. Two capabilities are a security boundary and stay off until you, the person running the server, turn them on. An agent cannot turn them on from a tool call.
Switch Turns on PINEPAPER_ALLOW_CODE=1Running JavaScript the agent writes: pinepaper_execute_custom_code,pinepaper_p5_draw,pinepaper_render_hook(register),pinepaper_register_custom_relation, and the custom relations saved in a scene file (pinepaper_import_sceneregisterCustomRelations).PINEPAPER_ALLOW_LOCAL_FILES=1Importing images, audio, video and scenes from your disk (the working folder and PINEPAPER_ASSET_DIRS). URLs and the export folder always work.With a switch off, those calls are refused with the switch named, and everything else works. Turn one on only if you trust what your agent reads, since a web page or a scene file can steer what it writes. In the Claude Desktop extension they are the "Allow custom code" and "Allow local files" settings. In a config file, add them to the server's
env:"env": { "PINEPAPER_ALLOW_CODE": "1", "PINEPAPER_ALLOW_LOCAL_FILES": "1" }
For code-only use (no Chrome, no 320 MB download), use
"args": ["-y", "@pinepaper.studio/mcp-server"] and set
"env": { "PINEPAPER_EXECUTION_MODE": "code" }. A global install works too:
npm i -g @pinepaper.studio/mcp-server puppeteer, then "command": "pinepaper-mcp".
Made with tool calls
Every graphic below is an animated SVG produced through this server's tool surface — the arguments shown with each result are what an AI agent passes to the named tool. They aren't shell commands; Run these yourself below shows the three ways to execute them.
// The scene IS a graph: two items, two declared edges —
// the canvas view and the graph view are the same data.
{ "sourceId": "$dot",
"relationType": "moves_along_path",
"relationOptions": { "path": "$p1", // an ellipse path
"duration": 6, "easing": "easeInOut", "loop": true } }
{ "itemId": "$square", "animationType": "rotate",
"options": { "speed": 0.18 } }
// Five rails, five named easings, one loop — each dot is
// a moves_along_path down its rail with a different easing
for (const easing of ['linear', 'easeIn', 'easeOut',
'easeInOut', 'pingpong']) {
add_relation($dot, 'moves_along_path', {
equation: { kind: 'parametric', xExpr: '0', yExpr: 't',
min: -1, max: 1, scale: 58 },
duration: 2.6, easing, loop: true });
}
// The engine solves the curve; the exporter bakes the
// motion to native SVG keyframes. pinepaper_add_relation:
{ "sourceId": "$dot", "relationType": "moves_along_path",
"relationOptions": { "equation": {
"kind": "parametric",
"xExpr": "cos(2*t)*cos(t)",
"yExpr": "cos(2*t)*sin(t)",
"scale": 108, "cx": 280, "cy": 118 },
"duration": 8, "loop": true } }
// Status chip: pale panel, slate bar, green dot blinking
{ "itemType": "rectangle", "properties": { "width": 264,
"height": 72, "fillColor": "#e8eff5" } }
{ "itemType": "circle", "properties": { "radius": 9,
"fillColor": "#2e9b4e" } }
{ "itemId": "$1", "animationType": "fade",
"options": { "speed": 1.0 } } // only the dot blinks
All five showcase files (including the banner) live in assets/ — tiny (4–11 KB), dependency-free, loop forever, and render anywhere SVG renders: GitHub READMEs, docs sites, dashboards, emails that allow SVG. They follow one editorial design system (serif mastheads, hairline rules, slate ink on paper white, framed canvas stages, typed-edge graph diagrams) supplied to the agent as context — share a design guideline with your agent and the tool calls come out on-system.
Try it interactive
GitHub can't run scripts inside a README, so the interactive demos live in the editor — one click, no install. Each is a shipped template where the relation graph does all the state handling (tabs, accordions, menus — no event-handler code):
- Tabs from relations —
on_click_fire+exclusive_group+on_enter_set_visibility - Accordion from relations — disclosure pairs via
on_event_toggle - Solar system, 4-in-1 tabs — the state machine driving four scenes
- Menubar from relations — WAI-ARIA menubar semantics from the same graph
The same graph drives visuals, keyboard access, and screen-reader roles (WCAG 2.1 AA) — see pinepaper://docs/relations from your MCP client.
Run these yourself
The snippets above are MCP tool-call arguments — they execute when an AI agent invokes the tool. Three ways to make that happen:
1 · Ask your agent (any MCP client). With this server configured, paste a prompt like:
Create a blue circle and make it ride a diamond-shaped path with easeInOut, looping. Add an orange rotating square beside it. Then export the scene as animated SVG.
Your agent picks the tools (pinepaper_create_item, pinepaper_add_relation, pinepaper_export_svg) and runs them.
2 · Hand your agent a complete batch. This is a full, valid pinepaper_agent_batch_execute argument — an agent (or an MCP inspector) can execute it verbatim; $0/$1 reference the created items in order:
{
"operations": [
{ "type": "create", "itemType": "circle",
"properties": { "x": 300, "y": 260, "radius": 10, "fillColor": "#2e5e8f" } },
{ "type": "relation", "relationType": "moves_along_path", "sourceId": "$0",
"relationOptions": { "path": [ { "x": 180, "y": 260 }, { "x": 300, "y": 180 },
{ "x": 420, "y": 260 }, { "x": 300, "y": 340 } ],
"duration": 6, "easing": "easeInOut", "loop": true } },
{ "type": "create", "itemType": "rectangle",
"properties": { "x": 520, "y": 260, "width": 60, "height": 60, "fillColor": "#f0a030" } },
{ "type": "animate", "itemId": "$1", "animationType": "rotate" }
]
}
3 · No MCP, no agent — just a browser. Open pinepaper.studio/editor, open the browser console, and paste (verified working as-is):
const app = window.PinePaper;
const dot = app.create('circle', { x: 300, y: 260, radius: 10, fillColor: '#2e5e8f' });
app.addRelation(dot.data.id, null, 'moves_along_path', {
path: [ {x:180,y:260}, {x:300,y:180}, {x:420,y:260}, {x:300,y:340} ],
duration: 6, easing: 'easeInOut', loop: true,
});
const sq = app.create('rectangle', { x: 520, y: 260, width: 60, height: 60, fillColor: '#f0a030' });
app.animate(sq, { animationType: 'rotate' });
The same code an agent generates is the code you can paste — the canvas is yours either way, undo included.
Security: yes, it executes code
Supply-chain scanners flag this package, and they are not wrong about the mechanism. Socket and tools like it mark it as malware-adjacent because it evaluates JavaScript at runtime. The detection is correct about the capability and wrong about the intent, so here is exactly what happens.
Every tool emits JavaScript — that is the architecture, not an exception. A tool call is compiled into a snippet written against the PinePaper and Paper.js APIs; the snippet is the product. pinepaper_execute_custom_code is simply the case where the agent writes the snippet instead of the server generating it, which is what lets a model draw something no other tool has a name for. Removing execution would not harden this package, it would delete it.
Code the agent writes is off unless you turn it on. The tools that run JavaScript the agent wrote (pinepaper_execute_custom_code, pinepaper_p5_draw, pinepaper_render_hook register, pinepaper_register_custom_relation, and pinepaper_import_scene's registerCustomRelations) refuse, naming the switch, unless the server is started with PINEPAPER_ALLOW_CODE=1. Reading files from your disk for an import (images, audio, video, scenes) needs PINEPAPER_ALLOW_LOCAL_FILES=1; files in the export folder, the server's own results, are always readable. In the Claude Desktop extension both are settings, off by default. An agent takes instructions from whatever it reads, a web page or a scene file included, so whether that text may become code is the decision of whoever starts the server.
Where the code runs. In a browser page on your own machine, against your own canvas. It does not run in the server process, and nothing is sent anywhere else to be executed.
Two modes, and one of them never executes anything:
| Mode | What happens |
|---|---|
code (PINEPAPER_EXECUTION_MODE=code) |
The tool returns the JavaScript and stops. Nothing runs. You read it and paste it if you want it. |
puppeteer (default) |
The server launches Chrome and runs the snippet in the page via page.evaluate(). |
If you do not want an agent executing anything, code mode is a first-class path, not a degraded one — the same snippet, handed to you instead of run.
What guards execution. On current engine builds the snippet goes through app.runGenerated(code, { source: 'agent' }) — a governor with seeded determinism, loop and item budgets, and a machine-readable report — rather than a bare eval. Older engine builds fall back to eval.
Found a vulnerability? Report it privately, as SECURITY.md describes, not in a public issue.
What to weigh before running it.
- Code an agent writes runs with whatever that browser page has. Give this server the same trust you would give anything else you let write and run code on your machine — which is the trust you already extend to an MCP client with tool access.
- Puppeteer mode launches Chrome with
--no-sandboxand--disable-setuid-sandbox. That is routine for headless automation and it does weaken Chrome's own process sandbox. If that matters where you are running it, usecodemode or put the server in a container. - Puppeteer itself is not a dependency at all (it was an optional peer until 1.6.25), kept out of the tree precisely because a headless browser plus an install script is what scanners flag hardest. Install it only if you want the executing mode. The server loads it only from where its own dependencies would be found (the same
npxcall, a global install, a project install) or from a folder you name inPINEPAPER_PUPPETEER_FROM; never from the folder it happens to be started in. puppeteer 22 or newer is required. - The npm package starts no process. Two export features use
ffprobeandffmpeg: checking a saved video against what the studio encoded, and joining the cached segments of aperSceneexport (ffmpeg -f concat). Only the Claude Desktop extension runs them, through a small runner it bundles that allows those two binaries alone, viaexecFile(no shell, argument lists the server writes, absolute paths). From npm, the check is skipped and said so, and aperSceneexport runs whole. - The server itself fetches the images, SVGs and media a tool call names by URL, and reads local files named by path. URLs that resolve to loopback, private, link-local or reserved addresses are refused, redirects included, and so are cloud metadata addresses. Local files are read only with
PINEPAPER_ALLOW_LOCAL_FILES=1, and then only from the working directory, the export folder, and folders listed inPINEPAPER_ASSET_DIRS(the export folder is readable without the switch).PINEPAPER_ALLOW_PRIVATE_NETWORK=1allows local and LAN hosts. Metadata addresses stay refused even with it set.
What's new in 1.6.35
Fixed
- A batch
relationop with a name pattern (sourceId: "disc-*") bindsphase_wave,ring_formingandflockonce over every match, so each member gets its own phase, ring slot or boid. It used to bind one relation per item, and every member took the first slot.ring_formingwith nocenteror target centres on the members. - A PDF still honours
timewhile the timeline is playing. - A PDF with
bleedon a named paper size no longer warns that the bleed was dropped: it is applied (the page is the sheet plus the bleed). The warning now covers trim marks only, and only when the studio didn't draw them. The result'sprintrecord, where the studio sends one, says what the page carries. - An export
regionwhose output has a different shape is cropped about its centre. It used to draw content from outside the region, and black past the canvas edge. The reply'scroppedTosays what was rendered. - A GIF with
maxBytesreports the size of the file it delivers, read from the file, and never delivers a retry larger than the first file. morph_sequencetakes every easing the studio names, including back and elastic.on_completeandat_beatwith an event's name inparams.eventfire that event. The name is resolved to the event's id (the reply'seventResolvedTo); a name two events share is named in a warning. It used to bind without a word and never fire.visible: falseon create (and in a batch create) hides the item. It was reported as ignored and the item was drawn.- A refused export carries the studio's reason as
cause(for exampleaudio_codec_unavailable) under the error codeEXPORT_FAILED.
Changed
- Relation params a relation does not read are now named for the long-form relations
too (
then,after,phase_wave,ring_forming,flock,on_complete,at_beat,camera_tracks,soundtrack_cue), against the params the current studio declares. add_contraptionwarns whensourceEventis an event's name and the studio kept it as a literal channel: a timed event and a pulse fire the event's id, so pass theeventIdthatcreatereturned. A studio that resolves the name says so insourceEventResolvedTo.- An emitter
fadeother thannone,linearor{ in, out }is named in a warning. - The relation docs say what
on_complete,at_beatandtriggers_animationdo: reveal a hidden target and pulse an event. They don't re-time a track; usethen. A rule'sfireCountis put back after an export, like everything else the rule changed.
What's new in 1.6.34
Added
keysonkeyframe_animatesends a track by column instead of one object per key:{"time":[0,1,2],"x":[100,400,700],"easing":"easeOut"}. Evenly spaced keys can use"time":{"step":0.033333,"count":180}. A 180-key track ofxandyis about three times smaller to send, or four with even spacing, and renders the same.create_manyinpinepaper_agent_batch_executemakes many items of one type, with what they share stated once. 300 items sharing five properties are about fifteen times smaller to send.PINEPAPER_TOOLKIT=starterserves five tools, enough for a first scene: the batch, keyframes, patterns, export and lint. The eight-tool lane adds events, starting over and custom relations.
Preguntas sobre PinePaper Studio MCP
¿Cómo agrego PinePaper Studio MCP a Claude Code?
Ejecuta claude mcp add mcp-server -- npx -y @pinepaper.studio/mcp-server en tu terminal. Añade --scope user para que esté disponible en todos los proyectos.
¿Cómo agrego PinePaper Studio MCP a Cursor?
Abre ~/.cursor/mcp.json y añade el servidor en mcpServers, usando la configuración de Cursor que se muestra en la sección de instalación de arriba.
¿Qué herramientas proporciona PinePaper Studio MCP?
Expone 178 herramientas, incluidas pinepaper_draw_weave, pinepaper_draw_knots, pinepaper_draw_sashiko, pinepaper_draw_subdivision, pinepaper_ui_kit.
¿El servidor incluye FFmpeg para exportaciones de video?
No, el MCP server no incluye ni instala FFmpeg. Debes instalarlo tú mismo si necesitas codificar formatos específicos como MP4 o ProRes.
¿Puedo ejecutar el servidor sin tener un navegador instalado?
Sí, puedes usar un modo de ejecución basado solo en código que no requiere Chrome ni una descarga de 320 MB configurando la variable PINEPAPER_EXECUTION_MODE en 'code'.
¿Cómo habilito que el agente ejecute código JavaScript personalizado?
Debes habilitarlo manualmente configurando la variable de entorno PINEPAPER_ALLOW_CODE en 1, ya que por seguridad viene desactivado por defecto.