SVGator
SVGator превращает описание анимации в редактируемый SVG-проект прямо из ассистента
Что умеет
- Создавать и дублировать проекты анимации по описанию
- Редактировать отдельные части и таймлайн анимации
- Экспортировать проект в SVG, Lottie, GIF или MP4
- Управлять ассетами и папками проектов
- Открывать готовый проект в браузерном редакторе
Какие данные видит
Ассистент работает с проектами, привязанными к аккаунту авторизованного пользователя SVGator.
Нужен ли аккаунт
Не нужен: сервер работает без входа
SVGator — MCP-сервер для создания SVG-анимации по текстовому описанию. Ассистент создаёт проект, редактирует его части, экспортирует результат в SVG, Lottie, GIF или MP4, а затем проект можно доработать вручную в редакторе SVGator, не расходуя лишние токены на тонкую настройку.
Как подключить
Как подключить SVGator к Claude
Адрес сервера, который нужно вставить в настройках Claude:
https://svgator--community-8qo6.run.tools
- Откройте Claude (сайт claude.ai или приложение для компьютера).
- Перейдите в Настройки → Коннекторы (в английском интерфейсе: Settings → Connectors).
- Нажмите Добавить пользовательский коннектор (Add custom connector).
- Вставьте адрес сервера, скопированный ниже, в поле URL удалённого MCP-сервера и нажмите Добавить.
- В чате нажмите + → Коннекторы и включите новый коннектор.
Пользовательские коннекторы доступны на тарифах Free, Pro, Max, Team и Enterprise. На Free можно добавить только один. В Team и Enterprise коннектор сначала добавляет владелец организации в Настройки организации → Коннекторы.
Авторизация
После нажатия Добавить откроется окно входа в сервис. Войдите под своим аккаунтом и подтвердите доступ. Пароль Claude не видит.
Как подключить SVGator к ChatGPT
Адрес сервера, который нужно вставить в настройках ChatGPT:
https://svgator--community-8qo6.run.tools
- Откройте ChatGPT в браузере (chatgpt.com). Нужен тариф Plus, Pro, Business, Enterprise или Edu.
- Один раз включите режим разработчика: Настройки → Приложения → Дополнительные настройки → Режим разработчика (Settings → Apps → Advanced settings → Developer mode).
- Откройте Настройки → Коннекторы и нажмите Создать (Create).
- Заполните форму: Название (любое), Описание (одна фраза, что делает сервис), URL MCP-сервера (скопируйте ниже).
- В поле Аутентификация выберите OAuth, если сервис требует вход, иначе Нет. Нажмите Создать.
- В новом чате откройте + → Приложения/Коннекторы и включите коннектор.
Название раздела у OpenAI менялось (Connectors → Apps/Plugins). Если пункт называется иначе, ищите «режим разработчика» в настройках. В рабочих пространствах Business/Enterprise администратор должен разрешить пользовательские коннекторы.
Авторизация
При первом использовании ChatGPT откроет окно входа в сервис. Войдите и подтвердите доступ.
Как подключить SVGator к Cursor
Адрес сервера, который нужно вставить в настройках Cursor:
https://svgator--community-8qo6.run.tools
Быстрый способ: нажмите кнопку Открыть в Cursor ниже, Cursor сам предложит добавить сервер.
Вручную:
- В Cursor откройте Settings → Cursor Settings → MCP и нажмите Add new global MCP server.
- Вставьте JSON, скопированный ниже, в открывшийся файл
~/.cursor/mcp.json(для одного проекта:.cursor/mcp.jsonв корне проекта). - Сохраните файл. Сервер появится в списке MCP; при необходимости пройдите авторизацию по кнопке рядом с ним.
Авторизация
Если сервис требует вход, рядом с сервером в списке MCP появится кнопка авторизации.
Список инструментов сервера (22)
Технические названия из tools/list. Нужны только разработчикам.
| 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. |