178개의 전문 도구를 사용하여 AI 어시스턴트가 벡터 그래픽, 다이어그램 및 데이터 시각화를 생성하고 애니메이션을 만들 수 있도록 지원합니다.
다른 이름 pinepaper/mcp-server, @pinepaper.studio/mcp-server
- 스타
- 6
- Tools
- 178
- 다운로드, 30일
- —
- 최신 버전
- —
- 마지막 커밋
- 2026년 11월 14일
- 라이선스
- MIT
PinePaper Studio MCP란?
PinePaper Studio은(는) MCP server입니다. 178개의 전문 도구를 사용하여 AI 어시스턴트가 벡터 그래픽, 다이어그램 및 데이터 시각화를 생성하고 애니메이션을 만들 수 있도록 지원합니다. 178개 도구를 제공합니다. 예: pinepaper_draw_weave, pinepaper_draw_knots, pinepaper_draw_sashiko.
프로젝트 README에서 생성된 요약
PinePaper Studio MCP server 정보
PinePaper MCP Server를 사용하면 AI 어시스턴트가 벡터 그래픽, 다이어그램 및 데이터 시각화를 생성하고 애니메이션을 만들 수 있습니다. 타이포그래피, 물리 시뮬레이션, 지도, 이미지 편집 등 다양한 분야를 아우르는 178개의 방대한 전문 도구 세트를 제공합니다. 사용자는 자연어를 사용하여 AI에게 기하학적 도형, 텍스트 콜라주 또는 복잡한 데이터 차트를 만들도록 지시할 수 있습니다.
서버는 로컬에서 무료로 실행하거나 cloud.pinepaper.studio의 호스팅 서비스를 통해 사용할 수 있습니다. 로컬 설치에는 Node 22.13 이상 버전이 필요하며 Puppeteer를 사용하여 Chrome 브라우저를 구동하므로 약 320 MB의 디스크 공간과 1 GB의 메모리가 필요합니다. 호스팅 버전은 HTTP를 통해 작동하며 ffmpeg를 사용하여 서버 측에서 비디오 인코딩을 처리합니다.
개발자는 생성물을 SVG, 대화형 HTML 또는 MP4 및 WebM과 같은 비디오 형식으로 내보낼 수 있습니다. 로컬 버전은 UI 의존적 기능을 포함한 전체 도구 기능을 제공하는 반면, 호스팅 버전은 관리형 LLM 테스트와 안정적인 비디오 렌더링을 제공합니다. 보안 설정을 통해 사용자가 사용자 정의 JavaScript 실행 또는 로컬 파일 액세스를 명시적으로 활성화할 수 있습니다.
활용 사례
- 1복잡한 데이터 시각화 설계개발자가 전문 데이터 도구를 사용하여 대화형 차트와 다이어그램을 구축하도록 AI에게 요청할 수 있습니다.
- 2고급 텍스트 효과 적용AI에게 텍스트에 특정 문자 단위 변형이나 타이포그래피 스타일을 적용하도록 지시할 수 있습니다.
- 3객체 동작 시뮬레이션AI가 객체 간의 관계를 설정하여 서로 궤도를 돌거나, 따라가거나, 미러링하도록 만들 수 있습니다.
프로젝트의 README를 바탕으로 작성되었습니다. 모든 활용 사례는 해당 내용의 인용문과 대조하여 확인합니다.
PinePaper Studio MCP 설치 방법
형식 확인: 2026년 11월 10일Cursor에 추가Goose에 추가Claude Code에 PinePaper Studio MCP 설치
$ claude mcp add mcp-server -- npx -y @pinepaper.studio/mcp-serverCursor에 PinePaper Studio MCP 설치
~/.cursor/mcp.json
{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@pinepaper.studio/mcp-server"
]
}
}
}VS Code에 PinePaper Studio MCP 설치
.vscode/mcp.json
{
"servers": {
"mcp-server": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@pinepaper.studio/mcp-server"
]
}
}
}VS Code CLI에 PinePaper Studio MCP 설치
$ code --add-mcp '{"name":"mcp-server","type":"stdio","command":"npx","args":["-y","@pinepaper.studio/mcp-server"]}'Claude Desktop에 PinePaper Studio MCP 설치
claude_desktop_config.json
{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@pinepaper.studio/mcp-server"
]
}
}
}Codex에 PinePaper Studio MCP 설치
$ codex mcp add mcp-server -- npx -y @pinepaper.studio/mcp-serverCodex config.toml에 PinePaper Studio MCP 설치
~/.codex/config.toml
[mcp_servers.mcp-server] command = "npx" args = ["-y", "@pinepaper.studio/mcp-server"]
Gemini CLI에 PinePaper Studio MCP 설치
$ gemini mcp add -s user mcp-server npx -- -y @pinepaper.studio/mcp-serverGemini settings.json에 PinePaper Studio MCP 설치
~/.gemini/settings.json
{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@pinepaper.studio/mcp-server"
]
}
}
}PinePaper Studio MCP 도구 178
README에서 감지됨pinepaper_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 | — |
도구 178개 모두 보기도구 수 줄이기
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 | — |
구성
PINEPAPER_ALLOW_CODEPINEPAPER_ALLOW_LOCAL_FILESPINEPAPER_EXECUTION_MODEPINEPAPER_LOCALEPINEPAPER_METRICS_ENABLEDPINEPAPER_METRICS_RETENTION
| 이름 | 설명 | 유형 |
|---|---|---|
| PINEPAPER_ALLOW_CODE | — | |
| PINEPAPER_ALLOW_LOCAL_FILES | — | |
| PINEPAPER_EXECUTION_MODE | — | |
| PINEPAPER_LOCALE | — | |
| PINEPAPER_METRICS_ENABLED | — | |
| PINEPAPER_METRICS_RETENTION | — |
자동 검사
2026년 11월 13일에 실행됨전체 보고서 →자동 검사를 통과했습니다. 이는 보안 감사가 아닙니다. 코드를 직접 읽고 서버에 필요한 최소한의 권한만 부여하십시오. 검사 방식
- 소스 저장소 연결 및 접근 가능통과
- 오픈 소스 라이선스 (OSI)통과
- 최근 1년 내 커밋 또는 릴리스통과
- 패키지 이름이 인기 패키지와 유사하지 않음통과
- 원격 엔드포인트가 HTTPS 사용검사되지 않음
- 파괴적인 도구에 라벨 표시됨통과
- 모델에 대한 숨겨진 지침 없음통과
- 패키지 및 해당 종속성에 중요한 보안 권고 없음검사되지 않음
README
GitHub에서 보기PinePaper 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.
PinePaper Studio MCP 질문
PinePaper Studio MCP를 Claude Code에 추가하려면 어떻게 하나요?
터미널에서 claude mcp add mcp-server -- npx -y @pinepaper.studio/mcp-server를 실행합니다. 모든 프로젝트에서 사용할 수 있게 하려면 --scope user를 추가합니다.
PinePaper Studio MCP를 Cursor에 추가하려면 어떻게 하나요?
~/.cursor/mcp.json를 열고 mcpServers 아래에 서버를 추가합니다. 위 설치 섹션에 표시된 Cursor 구성을 사용합니다.
PinePaper Studio MCP는 어떤 도구를 제공하나요?
178개 도구를 제공합니다. 예: pinepaper_draw_weave, pinepaper_draw_knots, pinepaper_draw_sashiko, pinepaper_draw_subdivision, pinepaper_ui_kit.
비디오 내보내기를 위해 FFmpeg가 포함되어 있나요?
아니요, MCP server에는 FFmpeg가 포함되어 있지 않으며 설치도 수행하지 않습니다. MP4 또는 ProRes와 같은 특정 형식을 인코딩해야 하는 경우 직접 설치해야 합니다.
브라우저를 설치하지 않고도 서버를 실행할 수 있나요?
네, PINEPAPER_EXECUTION_MODE를 'code'로 설정하면 Chrome이 필요하지 않고 320 MB를 다운로드할 필요도 없는 코드 전용 실행 모드를 사용할 수 있습니다.
에이전트가 사용자 정의 JavaScript 코드를 실행하도록 하려면 어떻게 해야 하나요?
보안을 위해 기본적으로 비활성화되어 있으므로 PINEPAPER_ALLOW_CODE 환경 변수를 1로 설정하여 수동으로 활성화해야 합니다.