Permet aux assistants IA de créer et d'animer des graphiques vectoriels, des diagrammes et des visualisations de données grâce à 178 outils spécialisés.
Aussi connu sous pinepaper/mcp-server, @pinepaper.studio/mcp-server
- Étoiles
- 6
- Outils
- 178
- Téléchargements, 30 jours
- —
- Dernière version
- —
- Dernier commit
- 14 nov. 2026
- Licence
- MIT
Qu'est-ce que PinePaper Studio MCP ?
PinePaper Studio est un serveur MCP. Permet aux assistants IA de créer et d'animer des graphiques vectoriels, des diagrammes et des visualisations de données grâce à 178 outils spécialisés. Il expose 178 outils, comme pinepaper_draw_weave, pinepaper_draw_knots, pinepaper_draw_sashiko.
Résumé généré à partir du README du projet
À propos du MCP server PinePaper Studio
Le PinePaper MCP Server permet aux assistants IA de générer et d'animer des graphiques vectoriels, des diagrammes et des visualisations de données. Il propose une suite massive de 178 outils spécialisés couvrant des domaines tels que la typographie, les simulations physiques, les cartes et l'édition d'images. Les utilisateurs peuvent demander à une IA de créer des formes géométriques, des collages de texte ou des graphiques de données complexes en utilisant le langage naturel.
Le serveur peut être exécuté localement gratuitement ou via un service hébergé sur cloud.pinepaper.studio. L'installation locale nécessite Node 22.13 ou une version plus récente et utilise Puppeteer pour piloter un navigateur Chrome, ce qui nécessite environ 320 MB d'espace disque et 1 GB de mémoire. La version hébergée fonctionne via HTTP et gère l'encodage vidéo côté serveur avec ffmpeg.
Les développeurs peuvent exporter leurs créations au format SVG, HTML interactif ou formats vidéo comme le MP4 et le WebM. Alors que la version locale offre l'intégralité des outils, y compris les fonctionnalités dépendantes de l'interface utilisateur, la version hébergée propose des tests LLM gérés et un rendu vidéo durable. Les paramètres de sécurité permettent aux utilisateurs d'activer explicitement l'exécution de JavaScript personnalisé ou l'accès aux fichiers locaux.
Ce que vous pouvez faire avec
- 1Concevoir des visualisations de données complexesUn développeur peut demander à une IA de construire des graphiques et des diagrammes interactifs en utilisant des outils de données spécialisés.
- 2Appliquer des effets de texte avancésVous pouvez demander à une IA d'appliquer des déformations spécifiques au niveau des caractères ou des styles typographiques au texte.
- 3Simuler des comportements d'objetsUne IA peut établir des relations entre des objets pour les faire orbiter, suivre ou se refléter les uns les autres.
Extrait du README du projet. Chaque cas d'utilisation est vérifié par rapport à une citation du document.
Comment installer PinePaper Studio MCP
Formats vérifiés le 10 nov. 2026Ajouter à CursorAjouter à GooseInstaller PinePaper Studio MCP dans Claude Code
$ claude mcp add mcp-server -- npx -y @pinepaper.studio/mcp-serverInstaller PinePaper Studio MCP dans Cursor
~/.cursor/mcp.json
{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@pinepaper.studio/mcp-server"
]
}
}
}Installer PinePaper Studio MCP dans VS Code
.vscode/mcp.json
{
"servers": {
"mcp-server": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@pinepaper.studio/mcp-server"
]
}
}
}Installer PinePaper Studio MCP dans VS Code CLI
$ code --add-mcp '{"name":"mcp-server","type":"stdio","command":"npx","args":["-y","@pinepaper.studio/mcp-server"]}'Installer PinePaper Studio MCP dans Claude Desktop
claude_desktop_config.json
{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@pinepaper.studio/mcp-server"
]
}
}
}Installer PinePaper Studio MCP dans Codex
$ codex mcp add mcp-server -- npx -y @pinepaper.studio/mcp-serverInstaller PinePaper Studio MCP dans Codex config.toml
~/.codex/config.toml
[mcp_servers.mcp-server] command = "npx" args = ["-y", "@pinepaper.studio/mcp-server"]
Installer PinePaper Studio MCP dans Gemini CLI
$ gemini mcp add -s user mcp-server npx -- -y @pinepaper.studio/mcp-serverInstaller PinePaper Studio MCP dans Gemini settings.json
~/.gemini/settings.json
{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@pinepaper.studio/mcp-server"
]
}
}
}Outils MCP PinePaper Studio 178
Détectés depuis le 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 | — |
Afficher les 178 outilsAfficher moins d'outils
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 | — |
Configuration
PINEPAPER_ALLOW_CODEPINEPAPER_ALLOW_LOCAL_FILESPINEPAPER_EXECUTION_MODEPINEPAPER_LOCALEPINEPAPER_METRICS_ENABLEDPINEPAPER_METRICS_RETENTION
| Nom | Description | Type |
|---|---|---|
| PINEPAPER_ALLOW_CODE | — | |
| PINEPAPER_ALLOW_LOCAL_FILES | — | |
| PINEPAPER_EXECUTION_MODE | — | |
| PINEPAPER_LOCALE | — | |
| PINEPAPER_METRICS_ENABLED | — | |
| PINEPAPER_METRICS_RETENTION | — |
Vérifications automatisées
Exécuté le 13 nov. 2026Rapport complet →A passé nos vérifications automatisées. Il ne s'agit pas d'un audit de sécurité : lisez le code et donnez au serveur l'accès le plus restreint dont il a besoin. Fonctionnement des vérifications
- Dépôt source lié et accessibleRéussi
- Licence open source (OSI)Réussi
- Commit ou version publiée au cours de l'année écouléeRéussi
- Nom du package non proche d'un package populaireRéussi
- L'endpoint distant utilise HTTPSNon vérifié
- Les outils destructifs sont étiquetésRéussi
- Aucune instruction cachée destinée au modèleRéussi
- Aucun avis critique dans le package ou ses dépendancesNon vérifié
README
Voir sur 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.
Questions sur PinePaper Studio MCP
Comment ajouter PinePaper Studio MCP à Claude Code ?
Exécutez claude mcp add mcp-server -- npx -y @pinepaper.studio/mcp-server dans votre terminal. Ajoutez --scope user pour le rendre disponible dans tous les projets.
Comment ajouter PinePaper Studio MCP à Cursor ?
Ouvrez ~/.cursor/mcp.json et ajoutez le serveur sous mcpServers, avec la configuration Cursor indiquée dans la section d'installation ci-dessus.
Quels outils PinePaper Studio MCP fournit-il ?
Il expose 178 outils, dont pinepaper_draw_weave, pinepaper_draw_knots, pinepaper_draw_sashiko, pinepaper_draw_subdivision, pinepaper_ui_kit.
Le serveur inclut-il FFmpeg pour les exports vidéo ?
Non, le MCP server n'inclut pas et n'installe pas FFmpeg. Vous devez l'installer vous-même si vous avez besoin d'encoder des formats spécifiques comme le MP4 ou le ProRes.
Puis-je exécuter le serveur sans navigateur installé ?
Oui, vous pouvez utiliser un mode d'exécution uniquement par code qui ne nécessite ni Chrome ni un téléchargement de 320 MB en réglant la variable PINEPAPER_EXECUTION_MODE sur 'code'.
Comment permettre à l'agent d'exécuter du code JavaScript personnalisé ?
Vous devez l'activer manuellement en réglant la variable d'environnement PINEPAPER_ALLOW_CODE sur 1, car cette option est désactivée par défaut pour des raisons de sécurité.