Memungkinkan AI assistant untuk membuat dan menganimasi grafis vektor, diagram, serta visualisasi data menggunakan 178 tool khusus.
Juga dikenal sebagai pinepaper/mcp-server, @pinepaper.studio/mcp-server
- Stars
- 6
- Tools
- 178
- Unduhan, 30 hari
- —
- Versi terbaru
- —
- Commit terakhir
- 14 Nov 2026
- Lisensi
- MIT
Apa itu PinePaper Studio MCP?
PinePaper Studio adalah MCP server. Memungkinkan AI assistant untuk membuat dan menganimasi grafis vektor, diagram, serta visualisasi data menggunakan 178 tool khusus. Server ini menyediakan 178 tool, seperti pinepaper_draw_weave, pinepaper_draw_knots, pinepaper_draw_sashiko.
Ringkasan dibuat dari README proyek
Tentang PinePaper Studio MCP server
PinePaper MCP Server memungkinkan AI assistant untuk menghasilkan serta menganimasi grafis vektor, diagram, dan visualisasi data. Server ini menyediakan suite besar berisi 178 tool khusus yang mencakup berbagai bidang seperti tipografi, simulasi fisika, peta, hingga pengeditan gambar. Pengguna dapat menginstruksikan AI untuk membuat bentuk geometris, kolase teks, atau grafik data yang kompleks menggunakan bahasa alami.
Server ini dapat dijalankan secara lokal secara gratis atau melalui layanan hosted di cloud.pinepaper.studio. Instalasi lokal memerlukan Node 22.13 atau versi terbaru dan menggunakan Puppeteer untuk menjalankan browser Chrome, yang membutuhkan ruang disk sekitar 320 MB dan memori 1 GB. Versi hosted beroperasi melalui HTTP dan menangani encoding video di sisi server menggunakan ffmpeg.
Developer dapat mengekspor hasil karya mereka sebagai SVG, HTML interaktif, atau format video seperti MP4 dan WebM. Meskipun versi lokal menawarkan seluruh fitur tool termasuk fitur yang bergantung pada UI, versi hosted menyediakan pengujian LLM yang terkelola dan rendering video yang lebih stabil. Pengaturan keamanan memungkinkan pengguna untuk mengaktifkan eksekusi JavaScript kustom atau akses file lokal secara eksplisit.
Apa yang bisa Anda lakukan dengannya
- 1Mendesain visualisasi data yang kompleksSeorang developer dapat meminta AI untuk membangun chart dan diagram interaktif menggunakan tool data khusus.
- 2Menerapkan efek teks tingkat lanjutAnda dapat menginstruksikan AI untuk menerapkan deformasi tingkat karakter atau gaya tipografi tertentu pada teks.
- 3Mensimulasikan perilaku objekAI dapat mengatur hubungan antar objek agar dapat saling mengorbit, mengikuti, atau mencerminkan satu sama lain.
Ditulis berdasarkan README proyek. Setiap use case diperiksa terhadap kutipan dari README tersebut.
Cara menginstal PinePaper Studio MCP
Format diverifikasi 10 Nov 2026Tambahkan ke CursorTambahkan ke GooseInstal PinePaper Studio MCP di Claude Code
$ claude mcp add mcp-server -- npx -y @pinepaper.studio/mcp-serverInstal PinePaper Studio MCP di Cursor
~/.cursor/mcp.json
{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@pinepaper.studio/mcp-server"
]
}
}
}Instal PinePaper Studio MCP di VS Code
.vscode/mcp.json
{
"servers": {
"mcp-server": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@pinepaper.studio/mcp-server"
]
}
}
}Instal PinePaper Studio MCP di VS Code CLI
$ code --add-mcp '{"name":"mcp-server","type":"stdio","command":"npx","args":["-y","@pinepaper.studio/mcp-server"]}'Instal PinePaper Studio MCP di Claude Desktop
claude_desktop_config.json
{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@pinepaper.studio/mcp-server"
]
}
}
}Instal PinePaper Studio MCP di Codex
$ codex mcp add mcp-server -- npx -y @pinepaper.studio/mcp-serverInstal PinePaper Studio MCP di Codex config.toml
~/.codex/config.toml
[mcp_servers.mcp-server] command = "npx" args = ["-y", "@pinepaper.studio/mcp-server"]
Instal PinePaper Studio MCP di Gemini CLI
$ gemini mcp add -s user mcp-server npx -- -y @pinepaper.studio/mcp-serverInstal PinePaper Studio MCP di Gemini settings.json
~/.gemini/settings.json
{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@pinepaper.studio/mcp-server"
]
}
}
}Tool PinePaper Studio MCP 178
Terdeteksi dari 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 | — |
Tampilkan semua 178 toolTampilkan lebih sedikit tool
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 | — |
Konfigurasi
PINEPAPER_ALLOW_CODEPINEPAPER_ALLOW_LOCAL_FILESPINEPAPER_EXECUTION_MODEPINEPAPER_LOCALEPINEPAPER_METRICS_ENABLEDPINEPAPER_METRICS_RETENTION
| Nama | Deskripsi | Tipe |
|---|---|---|
| PINEPAPER_ALLOW_CODE | — | |
| PINEPAPER_ALLOW_LOCAL_FILES | — | |
| PINEPAPER_EXECUTION_MODE | — | |
| PINEPAPER_LOCALE | — | |
| PINEPAPER_METRICS_ENABLED | — | |
| PINEPAPER_METRICS_RETENTION | — |
Pengecekan otomatis
Berjalan 13 Nov 2026Laporan lengkap →Lolos checks otomatis kami. Ini bukan audit keamanan: baca kodenya dan berikan server akses paling terbatas yang dibutuhkannya. Cara kerja checks
- Source repository terhubung dan dapat dijangkauLolos
- Lisensi open source (OSI)Lolos
- Ada commit atau release dalam satu tahun terakhirLolos
- Nama package tidak mirip dengan package populerLolos
- Remote endpoint menggunakan HTTPSTidak diperiksa
- Tools yang bersifat destruktif telah diberi labelLolos
- Tidak ada instruksi tersembunyi untuk modelLolos
- Tidak ada advisory kritis pada paket atau dependensinyaTidak diperiksa
README
Lihat di 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.
Pertanyaan tentang PinePaper Studio MCP
Bagaimana cara menambahkan PinePaper Studio MCP ke Claude Code?
Jalankan claude mcp add mcp-server -- npx -y @pinepaper.studio/mcp-server di terminal Anda. Tambahkan --scope user agar tersedia di semua proyek.
Bagaimana cara menambahkan PinePaper Studio MCP ke Cursor?
Buka ~/.cursor/mcp.json dan tambahkan server di bawah mcpServers, menggunakan config Cursor yang ditunjukkan di bagian instalasi di atas.
Tool apa yang disediakan PinePaper Studio MCP?
Server ini menyediakan 178 tool, termasuk pinepaper_draw_weave, pinepaper_draw_knots, pinepaper_draw_sashiko, pinepaper_draw_subdivision, pinepaper_ui_kit.
Apakah server ini sudah termasuk FFmpeg untuk ekspor video?
Tidak, MCP server ini tidak menyertakan atau menginstal FFmpeg. Anda harus menginstalnya sendiri jika perlu melakukan encoding format tertentu seperti MP4 atau ProRes.
Bisakah saya menjalankan server ini tanpa menginstal browser?
Ya, Anda bisa menggunakan mode eksekusi code-only yang tidak memerlukan Chrome atau download sebesar 320 MB dengan mengatur PINEPAPER_EXECUTION_MODE ke 'code'.
Bagaimana cara mengizinkan agent untuk menjalankan kode JavaScript kustom?
Anda harus mengaktifkannya secara manual dengan mengatur environment variable PINEPAPER_ALLOW_CODE ke 1, karena secara default fitur ini dimatikan demi keamanan.