Skip to main content
Glama

nakkaş 在土耳其语(古语)中意为画家/艺术家。

"make a neon terminal logo with animated binary digits"
  → AI constructs JSON config
  → nakkas renders to animated SVG
  → clean animated SVG output

为什么选择它

  • 一个工具,无限设计。 render_svg 接收 JSON 配置。AI 填充所有内容。

  • AI 原生模式。 每个字段都有 .describe() 注解,以便模型知道该做什么。

  • 纯声明式 SVG。 CSS @keyframes + SMIL 动画,无需 JavaScript。

  • 零外部依赖。 无云 API,无 API 密钥。本地运行。

Related MCP server: inkscape_mcp

安装

Claude Desktop

添加到您的配置文件中:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "nakkas": {
      "command": "npx",
      "args": ["-y", "nakkas@latest"]
    }
  }
}

Claude Code (CLI)

claude mcp add nakkas npx nakkas@latest

Cursor / Zed / 其他 MCP 客户端

{
  "mcpServers": {
    "nakkas": {
      "command": "npx",
      "args": ["-y", "nakkas@latest"]
    }
  }
}

本地开发

git clone https://github.com/arikusi/nakkas
cd nakkas
npm install && npm run build
# Use dist/index.js as the command

快速入门

询问您的 AI(在连接 Nakkas 的情况下):

"制作一个动态 SVG:深色终端框架 (800×200),发光的青色文字 'NAKKAS',霓虹发光滤镜,加载时淡入。"

"创建一个加载旋转器:一个带有绘制描边动画的圆圈,每 1.5 秒循环一次。"

"数据可视化:动态柱状图,5 个柱子,每个柱子交错延迟淡入,渐变填充。"

"个人资料徽章 (400×120):蓝到紫渐变,白色用户名文字,投影,细微的脉冲动画。"

工具

Nakkas 提供三个工具:

工具

用途

render_svg

接收 SVGConfig JSON,返回 SVG 字符串 + 设计分析警告

preview

接收渲染内容,返回用于视觉检查的 PNG 图像

save

接收渲染内容,保存为 SVG(文本)或 PNG(栅格)到磁盘

推荐工作流:渲染 → 预览 → 迭代 → 保存。save 工具与 render_svg 分开,旨在鼓励在保存前进行预览和优化。

save 工具

{ "content": "<svg ...>...</svg>", "outputPath": "./design.svg", "format": "auto" }

格式:auto(根据扩展名推断)、svg(文本文件)、png(先渲染为栅格)。如果文件已存在,将附加一个数字计数器以防止覆盖。返回实际保存的路径。

render_svg 工具

输入: SVGConfig JSON 对象 输出: 完整的 SVG XML 字符串以及可选的设计分析说明

渲染后,响应可能包含关于常见问题的设计警告,例如并发动画过多、缺少 transformBox 或组级缩放变换。

SVGConfig 结构

{
  canvas: {
    width: number | string,   // e.g. 800 or "100%"
    height: number | string,
    viewBox?: string,          // "0 0 800 400"
    background?: string        // hex "#111111" or "transparent"
  },

  defs?: {
    gradients?: Gradient[],   // linearGradient | radialGradient
    filters?: Filter[],        // preset or raw primitives
    clipPaths?: ClipPath[],
    masks?: Mask[],
    symbols?: Symbol[],
    paths?: { id, d }[]       // for textPath elements
  },

  elements: Element[],         // shapes, text, groups, use instances

  animations?: CSSAnimation[]  // CSS @keyframes definitions
}

元素类型

类型

必需字段

说明

rect

width, height

x, y 默认为 0;rx/ry 用于圆角

circle

r

cx, cy 默认为 0

ellipse

rx, ry

独立的水平/垂直半径

line

x1, y1, x2, y2

polyline

points

开放路径:"10,20 50,80 90,20"

polygon

points

自动闭合形状

path

d

完整的 SVG 路径命令

image

href, width, height

用于嵌入图像的 URL 或 data:image/... URI

text

content

字符串或 (string | Tspan)[] 数组

textPath

pathId, text

沿曲线排列的文本;路径定义在 defs.paths

group

children

应用于所有子元素的共享属性(不支持嵌套组)

use

href

实例化符号或通过 #id 克隆元素

radial-group

cx, cy, count, radius, child

在完整圆周上放置 N 个副本

arc-group

cx, cy, radius, count, startAngle, endAngle, child

沿圆弧放置 N 个副本

grid-group

cols, rows, colSpacing, rowSpacing, child

在 M x N 网格中放置副本

scatter-group

width, height, count, seed, child

在种子随机位置散布 N 个副本

path-group

waypoints, count, child

沿折线均匀分布 N 个副本

parametric

fn

数学曲线:rose, heart, star, lissajous, spiral, superformula, epitrochoid, hypotrochoid, wave

所有视觉元素(共享字段)

{
  id?: string,             // required for filter/gradient/clip references
  cssClass?: string,       // matches CSS animation names
  fill?: string,           // "#rrggbb" | "none" | "url(#gradId)"
  stroke?: string,
  strokeWidth?: number,
  strokeDasharray?: string, // "10 5", use for draw-on animation
  strokeDashoffset?: number,
  opacity?: number,        // 0–1
  filter?: string,         // "url(#filterId)"
  clipPath?: string,       // "url(#clipId)"
  transform?: string,      // "rotate(45)" "translate(100, 50)"
  transformBox?: "fill-box" | "view-box" | "stroke-box",  // set "fill-box" for CSS rotation
  transformOrigin?: string, // "center", works with fill-box
  smilAnimations?: SMILAnimation[]
}

滤镜预设

defs.filters 中定义后,可在任何元素上通过 filter: "url(#myId)" 引用:

{ "type": "preset", "id": "myGlow", "preset": "glow", "stdDeviation": 8, "color": "#ff00ff" }

预设

关键参数

效果

glow

stdDeviation, color

柔和光晕

neon

stdDeviation, color

强光

blur

stdDeviation

高斯模糊

drop-shadow

stdDeviation, offsetX, offsetY, color

投影

glitch

stdDeviation

湍流置换(动态)

grayscale

value (0–1)

去色

sepia

暖棕褐色调

invert

反转颜色

saturate

value

增强/降低饱和度

hue-rotate

value (度数)

色相旋转

chromatic-aberration

value (px 偏移,默认 3)

RGB 通道分离,产生镜头畸变效果

noise

value (不透明度 0 到 1,默认 0.25)

胶片颗粒和纹理叠加

outline

color, value (厚度,默认 2)

元素周围的彩色轮廓

inner-shadow

color, stdDeviation, value (不透明度,默认 0.5)

元素内部阴影

emboss

stdDeviation, value (强度,默认 1.5)

3D 浮雕阴影效果

CSS 动画

{
  "animations": [{
    "name": "pulse",
    "duration": "2s",
    "iterationCount": "infinite",
    "direction": "alternate",
    "keyframes": [
      { "offset": "from", "properties": { "opacity": "0.3", "transform": "scale(0.9)" } },
      { "offset": "to",   "properties": { "opacity": "1",   "transform": "scale(1.1)" } }
    ]
  }],
  "elements": [{
    "type": "circle",
    "cx": 100, "cy": 100, "r": 40,
    "cssClass": "pulse",
    "transformBox": "fill-box",
    "transformOrigin": "center"
  }]
}

CSS 属性键:驼峰式 (strokeDashoffset) 或短横线式 (stroke-dashoffset)。两者均可。

可动画化的 CSS 属性opacity, fill, stroke, transform, filter, clip-path, stroke-dasharray, stroke-dashoffset, font-size, letter-spacing 等。

SMIL 动画

三种 SMIL 类型,通过 smilAnimations: [] 在每个元素上内联定义:

{ "kind": "animate",          "attributeName": "d",       "from": "...", "to": "...", "dur": "2s" }
{ "kind": "animateTransform", "type": "rotate",            "from": "0 100 100", "to": "360 100 100", "dur": "3s" }
{ "kind": "animateMotion",    "path": "M 0 0 C ...",      "dur": "4s", "rotate": "auto" }

路径变形 (attributeName: "d"):from/to 路径必须具有相同的命令类型和数量。仅坐标可以不同。

字体

系统字体无需加载即可在任何地方使用:Arial, Helvetica, Courier New, Georgia, Verdana, monospace, sans-serif, serif

也接受自定义字体系列。当渲染环境中存在该字体(加载了字体的网页、设计工具等)时,它们可以正常工作。

使用场景与兼容性

上下文

CSS @keyframes

SMIL

外部字体

交互 (onclick)

GitHub README <img>

网页 <img>

网页内联 SVG

设计工具导出

静态文件查看器

取决于环境

取决于环境

故障排除

"MCP error -32602: Input validation error"

这意味着 MCP SDK 在到达处理程序之前拒绝了输入。这通常发生在第一次尝试时,重试即可解决。最常见的原因:

  • 渐变类型拼写错误。 使用 "linearGradient""radialGradient",而不是 "linear""radial"。这是最常见的错误。

  • 关键帧偏移量作为字符串。 写入 0100(数字)或 "from" / "to"。写入 "0%""100%" 将会失败。

  • 命名颜色。 仅十六进制值有效:"#ff0000",而不是 "red"。也不支持 rgb()

  • 元素缺少 type 每个元素对象都需要一个 type 字段。

如果您在构建 MCP 客户端集成时持续看到此错误,问题可能出在客户端序列化参数的方式上。有关已知序列化怪癖的背景信息,请参阅 anthropics/claude-code#29104

预览显示空白或意外图像

预览工具在 t=0 时渲染静态快照。动画不会被捕获。您看到的是 SVG 在任何 CSS 或 SMIL 动画开始前的初始状态。

如果图像完全空白:

  • 检查您的元素是否设置了 fillstroke。在透明画布上没有填充的形状是不可见的。

  • 检查坐标。在 800px 宽的画布上,位于 x: 2000 的元素在屏幕外。

  • 如果使用 filter: "url(#myFilter)",请确保 myFilter 已在 defs.filters 中定义。

动画在 GitHub 上不工作

GitHub README 通过 <img> 标签渲染 SVG,该标签会剥离 JavaScript,但保留 CSS 和 SMIL。如果您的动画在本地有效但在 GitHub 上无效:

  • 避免使用 <script> 或事件处理程序 (onclick, onmouseover)。这些会被移除。

  • 外部字体不会加载。请坚持使用系统字体:Arial, Courier New, Georgia, monospace, sans-serif

  • 字体 CSS @import 被阻止。如果需要特定字体,请使用带有系统回退的内联 <text>

SVG 输出过大

如果 render_svg 返回关于文件大小(超过 50kb)的警告,可能是参数化曲线或图案组生成了过多的元素。减少参数化曲线的 steps 或图案组的 count。一个 cols: 50, rows: 50 的网格组会产生 2500 个元素,这会迅速增加文件大小。

技术栈

  • TypeScript + Node.js 18+

  • @modelcontextprotocol/sdk (MCP 服务器)

  • zod (模式验证和 AI 类型引导)

  • 无外部 SVG 库,纯 XML 构建

  • Vitest (280 个测试)

许可证

MIT。由 arikusi 构建。

Available Tools

3 tools
previewPreview SVGA

Render SVG content to a PNG image so the AI can visually inspect the output.

When to use:

  • render_svg already returns a preview image by default; call this tool to re-preview a stored artifact at a different width, or to preview SVG that did not come from render_svg

  • Stop iterating when the visual result matches the intent

Input: pass EITHER artifact (id from render_svg, e.g. "art-1" — preferred, no SVG resend) OR content (raw SVG string).

Behavior:

  • Returns a PNG image (base64) rendered from the SVG

  • Background is transparent by default

  • CSS animations and SMIL are rendered as a static snapshot (t=0) — motion is not captured

Width:

  • Omit width to use the SVG's own declared width/viewBox

  • Pass width to scale the output (useful for small SVGs that need a larger preview)

ParametersJSON Schema
NameRequiredDescriptionDefault
widthNoRender width in pixels; defaults to SVG's own declared width
formatNoContent format; auto-detected from content if omitted
contentNoSVG string to render as PNG. Only needed when no artifact id exists.
artifactNoArtifact id returned by render_svg (e.g. "art-1"). Preferred over content.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the output is a PNG base64, background is transparent, animations are static snapshots, and width can be omitted or specified. It does not contradict any annotations (none provided). However, it does not explain the 'format' parameter's effect (e.g., when to use 'html') though schema covers it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections (When to use, Input, Behavior, Width), front-loaded with purpose, and every sentence adds value without unnecessary text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 4 optional parameters, no output schema, and no annotations, the description covers key behaviors and usage contexts. It does not explicitly state mutual exclusivity of artifact and content, but the 'pass EITHER' guidance implies it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so baseline is 3. The description adds meaning by explaining that 'artifact' is preferred over 'content', width can be left to default, and content is only needed when no artifact id exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states clearly 'Render SVG content to a PNG image so the AI can visually inspect the output.' It distinguishes from sibling tool render_svg by noting that render_svg already returns a preview and this tool is for re-previewing or previewing external SVG.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'When to use' section explicitly tells when to use this tool vs render_svg, including re-previewing artifacts or previewing SVG from other sources. It also advises to stop iterating when visual result matches intent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_svgRender SVGA

Render animated SVG from JSON config. AI controls all design parameters.

Workflow: render_svg returns a PNG preview of the result plus an artifact id — critique the image, revise the config, render again. Iterate at least 3 times before finalizing. The SVG text stays on the server: pass the artifact id to save (and to preview for a different width). Add output:{svg:true} only if you actually need the SVG text in the conversation.

output options (response shape, not content): {"svg":false,"preview":true,"previewWidth":800,"minify":false,"frames":4} — all optional. minify:true collapses whitespace in the stored/saved SVG. frames:N (2-10) replaces the static preview with one filmstrip image sampling the CSS animations at N times — use it to verify motion (rotation direction, timing, easing) since a single preview only shows t=0. SMIL is not sampled.

Element types: rect, circle, ellipse, line, polyline, polygon, path, image, text, textPath, group, use, radial-group, arc-group, grid-group, scatter-group, path-group, parametric

Pattern groups (use for repetitive designs): radial-group (circular: cx, cy, radius, count), arc-group (arc: cx, cy, radius, count, startAngle, endAngle), grid-group (matrix: cols, rows, colSpacing, rowSpacing), scatter-group (random: width, height, count, seed), path-group (along polyline: waypoints, count). Each takes ONE "child" element.

Parametric curves (fn field): rose, heart, lissajous, spiral, star, superformula, epitrochoid, hypotrochoid, wave. Size via "scale" field. Server computes coordinates.

defs: gradients (linear/radial, SMIL animated stops), filters (presets: glow, neon, blur, drop-shadow, glitch, chromatic-aberration, noise, outline, inner-shadow, emboss + 5 more), clipPaths, masks, patterns (tile fills).

Animations: CSS @keyframes via animations array. Set cssClass on element matching animation name. For transforms add transformBox="fill-box" transformOrigin="center". SMIL via smilAnimations on elements (animate, animateTransform, animateMotion).

Critical format rules:

  • Gradient type must be "linearGradient" or "radialGradient" (not "linear"/"radial"). Each needs id, stops (array with offset 0-1, color).

  • Filter type must be "preset" with a "preset" field: {"type":"preset","id":"myGlow","preset":"glow","stdDeviation":8,"color":"#ff00ff"}

  • Keyframe offset: use "from"/"to" or percentage number 0-100 (not "0%"/"100%").

  • Gradient stop and filter colors: hex only (#rrggbb or #rrggbbaa). Element fill/stroke accept '#rrggbb', 'none', or 'url(#id)' (hex is safest).

  • Every element needs "type" field. circle needs r, rect needs width+height, path needs d.

Field names that differ from raw SVG:

  • text: string goes in "content" (not "text"): {"type":"text","x":100,"y":50,"content":"Hello","fontSize":24,"textAnchor":"middle"}

  • textPath: {"type":"textPath","pathId":"idFromDefsPaths","text":"..."} — here the field IS "text".

  • group: {"type":"group","children":[...]} — children are shapes/text/use only, no nested groups.

  • Pattern groups take ONE "child" element drawn at local origin (child uses cx=0/cy=0); set rotateChildren:false to keep text upright.

Output: Pure SVG XML. No JavaScript. CSS @keyframes + SMIL only.

ParametersJSON Schema
NameRequiredDescriptionDefault
defsNo
canvasYes
outputNo
elementsYes
animationsNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It transparently discloses that SVG text stays on the server (access via artifact id), describes output format (PNG preview + artifact id), explains field name differences from raw SVG, critical format rules, and the behavior of pattern groups and parametric curves. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with sections (Workflow, output options, element types, pattern groups, etc.). Every sentence adds necessary detail given the complexity of SVG rendering. Slightly verbose but justified; could be tightened without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (5 params, nested objects, no output schema), the description covers all essential aspects: input structure, workflow, output format, edge cases (field name differences, format rules), and usage of defs and animations. It explains return values (PNG preview + artifact id) despite no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate fully. It provides extensive detail on each parameter group (canvas, elements, animations, output, defs) with examples, required fields, and format constraints (e.g., gradient type must be 'linearGradient', elements need 'type' field). This goes far beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with 'Render animated SVG from JSON config', clearly stating the tool's core function. It distinguishes from siblings (preview, save) via workflow context, and the detailed enumeration of element types, animations, and output options reinforces the specific purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides an explicit iterative workflow ('critique, revise, render again, iterate at least 3 times'), explains when to use output options like 'svg:true', and when to preview for different widths. However, it doesn't explicitly state when not to use this tool relative to the sibling tools, though the context strongly implies it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saveSave ContentA

Save rendered content to disk. Format-aware: can save as text or render to raster image.

IMPORTANT: Use this only AFTER iterating on the design with render_svg's preview images. Do not save on the first render. Preview and refine your work first.

Input: pass EITHER artifact (id from render_svg, e.g. "art-1" — preferred, no SVG resend) OR content (raw string).

Format detection:

  • 'auto' (default): infers format from file extension. .svg saves as text, .png renders to image.

  • 'svg': saves content as a UTF-8 text file

  • 'png': renders the content (assumed SVG) to a PNG image, then saves it

If the file already exists, a numeric counter is appended before the extension to prevent overwriting: design.svg becomes design-1.svg, then design-2.svg. The actual saved path is returned in the response.

ParametersJSON Schema
NameRequiredDescriptionDefault
widthNoFor raster formats (png): render width in pixels. Defaults to the source content's own declared dimensions.
formatNoOutput format. 'auto' infers from file extension (.svg saves as text, .png renders to image). 'svg' saves content as a UTF-8 text file. 'png' renders SVG content to a PNG image before saving.auto
contentNoRaw content to save. Only needed when the content did not come from render_svg.
artifactNoArtifact id returned by render_svg (e.g. "art-1"). Preferred over content.
outputPathYesFile path to save to. The directory must already exist. If the file already exists, a numeric counter is appended before the extension: design.svg becomes design-1.svg, then design-2.svg, and so on. The actual saved path is returned in the response.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behaviors: format detection (auto, svg, png), file overwrite prevention with numeric counter, and input options (artifact vs content). No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with sections, bullet points, and bolded keywords. Every sentence earns its place—no fluff. Efficiently communicates complex behavior in a few paragraphs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 5 params, no annotations, and no output schema, description covers all aspects: input selection, format handling, overwrite behavior, and return value. Complete enough for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds crucial context: width defaults to source dimensions, artifact is preferred over content, outputPath explains counter behavior, format enum values are elaborated. Adds significant value beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Save rendered content to disk' and distinguishes itself from siblings (preview, render_svg) by specifying it is for final saving after iterating on design.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this only AFTER iterating on the design with render_svg's preview images' and warns 'Do not save on the first render', providing clear usage context and when-not-to-use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev0.3.0
    • Changedrender_svg1 field changed
      • addedInput schema / properties / output / properties / frames
        Added value: +{
        +  "type": "number"
        +}
  2. 3 tool updatesv0.2.0
    • Changedpreview3 fields changed
      • addedInput schema / properties / artifact
        Added value: +{
        +  "description": "Artifact id returned by render_svg (e.g. \"art-1\"). Preferred over content.",
        +  "type": "string"
        +}
      • changedInput schema / properties / content / description
        Previous value: -"SVG string to render as PNG"New value: +"SVG string to render as PNG. Only needed when no artifact id exists."
      • removedInput schema / required
        Removed value: -[
        -  "content"
        -]
    • Changedrender_svg6 fields changed
      • changedInput schema / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / animations / items / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / animations / items / properties / keyframes / items / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / canvas / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / defs / additionalProperties
        Previous value: -falseNew value: +true
      • addedInput schema / properties / output
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "minify": {
        +      "type": "boolean"
        +    },
        +    "preview": {
        +      "type": "boolean"
        +    },
        +    "previewWidth": {
        +      "type": "number"
        +    },
        +    "svg": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedsave3 fields changed
      • addedInput schema / properties / artifact
        Added value: +{
        +  "description": "Artifact id returned by render_svg (e.g. \"art-1\"). Preferred over content.",
        +  "type": "string"
        +}
      • changedInput schema / properties / content / description
        Previous value: -"Content to save. This is typically the output of a render tool such as render_svg."New value: +"Raw content to save. Only needed when the content did not come from render_svg."
      • changedInput schema / required
        Previous value: -[
        -  "content",
        -  "outputPath"
        -]New value: +[
        +  "outputPath"
        +]
  3. 1 tool updatev0.1.0
    • Changedrender_svg2 fields changed
      • removedInput schema / properties / animations / items / properties / keyframes / minItems
        Removed value: -2
      • removedInput schema / properties / elements / minItems
        Removed value: -1
  4. 3 tool updatesv0.1.3
    • First observedpreview
    • First observedrender_svg
    • First observedsave

TDQS

A4.7/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: render_svg generates SVG from config, preview renders existing or external SVG to PNG, and save persists rendered content. The overlap where render_svg includes a preview by default is explicitly handled by the preview tool's description, so no ambiguity exists.

Naming Consistency4/5

All names use lowercase snake_case and are short, but there is a minor deviation: render_svg follows verb_noun while preview and save are bare verbs. The pattern is still predictable and readable, with only a slight structural inconsistency.

Tool Count5/5

Three tools is well-scoped for a focused SVG rendering service. Each tool earns its place: render for creation, preview for inspection, save for persisting output. No unnecessary duplication or bloat.

Completeness5/5

The tool surface covers the full intended workflow: render generated content, preview it at different sizes or from external SVG, and save as text or image. There are no obvious dead ends or missing core operations for the server's stated purpose.

Maintenance

ActivityStale
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers