SVGator
Prompt an animation, get an editable project back, and export it as SVG, Lottie, GIF, MP4, and more, then open it in the editor to finish by hand to save…
Community: Submitted by a user or imported; check the owner before granting accessOnlineNo sign-inGlobalFreeRead-only
What it can do
- Ping: Diagnostic connectivity check. Returns "pong" with the MCP server name, version and current time. Requires no authentication — use it to confirm the server is reachable and the transport is work
- List Projects: List the authenticated user's SVGator projects (newest first). Returns lean rows (id, title, preview, created/updated timestamps, and an `editor_url` deep link to open the project in th
- Get Project: Get a single project summary: title, preview, folder, timestamps, canvas size, background colour, animation timeline, saved export settings, and an `editor_url` deep link to open it in th
What data it sees
Do you need an account
No: the server works without sign-in
Prompt an animation, get an editable project back, and export it as SVG, Lottie, GIF, MP4, and more, then open it in the editor to finish by hand to save tokens/credits when fine-tuning. Drive your SVGator account from any AI assistant.
Server tool list (22)
Raw names from tools/list. Only developers need these.
| ping | Diagnostic connectivity check. Returns "pong" with the MCP server name, version and current time. Requires no authentication — use it to confirm the server is reachable and the transport is working. |
| list_projects | List the authenticated user's SVGator projects (newest first). Returns lean rows (id, title, preview, created/updated timestamps, and an `editor_url` deep link to open the project in the SVGator editor) plus the total count for pagination. Use the project id (pi_…) with get_project or export_project. |
| get_project | Get a single project summary: title, preview, folder, timestamps, canvas size, background colour, animation timeline, saved export settings, and an `editor_url` deep link to open it in the SVGator editor. Does NOT return the full project JSON. Takes a project id (pi_…) from list_projects. |
| export_project | Export a project to a deliverable format. The JSON result always has a `kind` field: `kind:"link"` for svg | lottie | react-native | flutter (the default) — the exported file is uploaded to a temporary `content_url` (valid ~1–2 days); hand that link to the user instead of inlining the file (token-light). Pass `inline:true` to get the file contents inline instead as `kind:"content"` in the `content` field (SVG markup, or Lottie/JSON, or the framework-wrapped source) — only do this when you actually need to read or embed the file. `exportId` references the stored export. `kind:"render"` for video | gif — an async raster job: no file yet, use the returned `render_id` with get_render to poll until status is "done", then fetch the download URL. Raster export requires the project to be animated. All override params below are optional — omit them to use the project's saved settings. Each override only applies to certain formats (noted in its description); passing one that does not apply to the chosen format returns a validation error explaining the constraint. `responsive` and `bgColor` (canvas background; pair with exportCanvasColor=true) are also supported. This tool can ONLY override export settings — `options`/`animation`/`responsive`/`bgColor` — never the project structure (`document`/`definitions`); there is no parameter for that. To change shapes, text, colors, or animation content, use edit_part (or replace_project) first, then export. |
| get_render | Check the status of a raster (video/gif) render started by export_project. Returns status, percent, and — once status is "done" — a short-lived (~5 min) signed download URL. Takes a render_id (ri_…). |
| get_profile | Get the authenticated customer profile: name, email, plan (name + access level), and teams. Useful for limit-aware UX before exporting. |
| get_skeleton | Get a cheap, token-light structure map of a project — step 1 of the editing loop (navigate → read_part → edit_part → verify). Returns a tree of nodes carrying NAMES AND COUNTS ONLY, never values: each node has an `id`, `type`, its `properties` channel names, and an `animators` map — NESTED group → channel → keyframe count (e.g. `{transform:{origin:3}}` means the origin channel has 3 keyframes, valid `keys` indices 0..2; a disabled channel is `{keys:<n>, disabled:true}`). `hidden` appears only when an element is truly hidden. Use it to locate an element by `id` and learn which channels are animated before reading or editing — then call read_part for an actual value. ALWAYS address parts by `id`; never guess array indices. Called without `item` the response also includes `definitions` (the reusable <defs> subtrees); each `use` node's `ref` points to its definition id there. Bound the response with `depth` (element-tree depth; 0 = infinite) or scope it to a subtree with `item`. This tool never returns path data, keyframe arrays, or gradient stops — use it instead of downloading the project JSON. |
| read_part | Read the exact value or element at `item` — step 2 of the editing loop, after get_skeleton has located the element by `id`. The `item` path can target three kinds of thing: an ELEMENT (a bare `#<id>`, returns the node with its properties and animators; `depth` controls how many child levels come with it), a PROPERTY or ANIMATOR sub-object (e.g. `#<id>/properties/fill`), or a LEAF value (e.g. `#<id>/properties/fill/paint`, returns the scalar/paint object). `depth` is only meaningful for element targets and is ignored otherwise. ALWAYS check `itemAnimated`: when true, the static value you read is SHADOWED by an animation, so changing it has no visible effect — edit the keyframe at `#<id>/animators/<channel>/keys/<i>/value` instead (get the valid `<i>` range from the animator keyframe counts in get_skeleton). Copy the returned `resolvedItem` verbatim as the target when you edit. |
| edit_part | Apply ONE validated edit at `item` and persist it — step 3 of the editing loop (navigate with get_skeleton → read with read_part → edit here → optionally verify with a preview). Pick the edit with `action`: • `update` (default) overwrites the value at `item`. A bare `#<id>` replaces the whole element but keeps its existing id; any node that omits `children` keeps its existing subtree, while `animators` are taken verbatim (an omitted animator is REMOVED). A path inside the element (e.g. `#<id>/properties/fill/paint`) replaces just that value. • `before`/`after` insert a sibling element; `append`/`prepend` add a last/first child (the only way to populate an empty container). Send the new element subtree as `value`. These target ELEMENT nodes only. • `move` relocates the `item` element (preserving its id and animators) to `target`+`position` (position: before|after|append|prepend). • `delete` removes an element (and its subtree), a whole animator channel, or a single keyframe (`…/keys/<i>`); no `value` needed. ON INSERTS THE SERVER ASSIGNS/REMAPS IDS — address the new node by the returned `insertedItem`/`idMap`, never the id you sent. Anchor edits by element `id` from get_skeleton; never guess an array index. If read_part reported `itemAnimated: true`, the static value is shadowed — edit the KEYFRAME, not the static property (the response echoes `itemAnimated: true` to flag a no-op). After you edit an animator's keyframe 0 the server re-syncs the matching static property automatically — do NOT also write it. `preview` defaults to `none` (cheap); pass `image` to get a static SVG to visually verify the change, or `module` (opt-in, up to ~400 KB) when you need the animation data. The response returns `element` — the affected node as finally stored (server-assigned ids, first-keyframe-synced baseline), so you can confirm the result without a follow-up read_part (`null` on an element delete). Invalid edits return a descriptive validation error — read it and retry with a corrected value. |
| create_project | Create a NEW SVGator project from a full project JSON, owned by the authenticated user. Returns the saved metadata (id, title, timestamps, and an `editor_url` deep link) — NOT the full project back. This is a COARSE write: it takes a whole project (often hundreds of KB), so use it for a document you have assembled, or for cloning/templating — for incremental tweaks to an existing project prefer edit_part. A minimal blank project needs only the root svg's properties.shape position + size. Before assembling the document, call describe_shape for EACH element type and concept you will use (rect, path, the animators/keyframe/paint shapes, …) so you copy exact field names instead of guessing — the whole project is validated as one unit, so a single wrong field fails the entire create. CAUTION on `options`: a stored project nests every format under options.export.settings.<format> — do NOT copy the flattened params export_project takes. Invalid structure is rejected with a descriptive validation error (nothing is persisted) — read it and retry. |
| replace_project | Replace an existing project's ENTIRE JSON with the supplied full project (coarse write; requires edit rights — demo/template projects are read-only). Last write wins (no concurrency check); validation runs before any mutation, so a rejected replace leaves the stored project untouched. Returns the saved metadata (incl. `editor_url`), not the full project. Because this overwrites the whole document, prefer edit_part for incremental changes; use replace_project for a document you have fully assembled or bulk-transformed. Before assembling the document, call describe_shape for EACH element type and concept you will use so you copy exact field names instead of guessing — the whole document is validated as one unit, so a single wrong field fails the entire replace. Same `options` nesting caution as create_project (options.export.settings.<format>, not the export_project shape). |
| duplicate_project | Make a COPY of an existing project, owned by the authenticated user. The copy keeps the source title unless you pass `title`, and is filed in the SAME folder as the source unless you pass `folder_id` (a folder id to place it in, or null for no folder). Server-side copy — it preserves the full document and image references without downloading the project. Returns the NEW project’s metadata (its own id, title, folder, timestamps, and an `editor_url` deep link). Duplicating into the same folder is allowed. Takes a project id (pi_…) from list_projects. |
| move_project | Move an existing project to a different folder and/or rename it (requires edit rights). Pass `folder_id` (a folder id to move it into, or null to remove it from any folder) and/or `title` (to rename). Omit `folder_id` to keep the current folder; omit `title` to keep the current title. Moving into the folder the project is already in WITHOUT a rename is rejected (nothing to do) — but renaming in place (same or omitted folder + a new title) is allowed. Lightweight — it does not rewrite the document. Returns the updated project metadata (incl. `editor_url`). Takes a project id (pi_…) from list_projects. |
| list_assets | List the authenticated user's reusable assets (static or animated SVG items), newest first. Returns lean rows (id `as_…`, title, preview URL, created/updated timestamps) plus the total count for pagination — NOT each asset's document. Use the asset id with get_asset to read the full payload. |
| get_asset | Get a single asset including its `data` ({document, definitions}) — the full reusable SVG item, ready to inspect or drop into a project. Takes an asset id (as_…) from list_assets. |
| create_asset | Create a NEW reusable asset from an asset document, owned by the authenticated user. The `document` is the root `svg` element and MUST carry a numeric canvas size at properties.shape.size {width,height}; it can be static or animated (same structure as a project document — call describe_shape for exact field names before assembling). Returns the saved asset (id, title, preview, timestamps) with its `data`. The whole document is validated as one unit — a single wrong field rejects the create with a descriptive error and nothing is persisted. |
| update_asset | Replace an existing asset's ENTIRE document with the supplied one (coarse write). Validation runs before any mutation, so a rejected update leaves the stored asset untouched. `document` must carry a numeric canvas size (as with create_asset). Pass `title` to rename; omit it to keep the current title. Returns the saved asset with its `data`. |
| list_folders | List the authenticated user's folders (the labels projects are filed under), newest first. Returns lean rows (id `fd_…`, title, created/updated timestamps) plus the total count for pagination. Use a folder id (fd_…) as the `folder` argument of create_project / replace_project to file a project under it. |
| get_folder | Get a single folder (id, title, timestamps) by its id (fd_…) from list_folders. |
| create_folder | Create a NEW folder (a label to organize projects) owned by the authenticated user. Only a `title` is needed. Returns the saved folder (id `fd_…`, title, timestamps); use that id as the `folder` argument of create_project / replace_project. |
| update_folder | Rename an existing folder. Only the `title` can be changed. Takes a folder id (fd_…) and the new title; returns the saved folder. |
| describe_shape | Get the exact JSON shape of ONE building block before you author an element for edit_part (insert/update) or create_project/replace_project — so you never guess field names. Returns a copy-ready `shape` example; for element types it also returns `groups` (the property groups THIS element carries — NOT universal: e.g. image/g/a have no fill/stroke, svg/defs have none), `properties` (annotated channel list with value hint + animatable/static + default), and `animators` (the animatable channels as a NESTED map mirroring the required `animators.<group>.<channel>` JSON, group = transform | fill | stroke | compositing | filter | shape, each channel a timeline `{ disabled, keys: [...] }`). Author animators nested — e.g. `{"fill":{"opacity":{"keys":[…]}}}` — NEVER as a dotted key like `{"fill.opacity":…}`. Also give every element you author a `title` (a short human-readable name) so it is identifiable in the editor and get_skeleton. `topic` is an element type (rect, circle, ellipse, line, polyline, polygon, path, text, tspan, image, use, a, g, svg, mask, clipPath, defs, symbol, pattern, marker) or a concept (root, animation, element, keyframe, easing, paint, morph, transform, fill, stroke, compositing, filter). Follow the `see` list for related topics. Reference data only — needs no authentication. |