Prototype · Preview: every server in the official registry, synced every 30 minutes. Reviews and accounts come in a later step.
PopNx MCPMCP servers for people who use AI · explained in plain words

Nakkas

by arikusiversion 0.5.0i★ –iRuns on your computer
Registry nameio.github.arikusi/nakkas

Install

Overview

Description from the maker (original English)

MCP server that turns AI into an SVG artist. One rendering engine, AI decides everything.

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

  • Connection: Runs on your computer
  • Transport: stdio
  • Category: Design, images & audio

Install

Pick the AI app you use, then copy the settings.

Before you install

  • Basic checks: 1 of 1 passed
  • Runs on your computer with your user’s permissions (files, network, apps).
  • The registry lists no key to fill in.

You need

  • npmNode.js installed (for the npx command)

Which app do you use?

Pick your app above. We remember it, so next time the button says “Install in …”.

Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json

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

Run this in your terminal

claude mcp add nakkas -- npx -y nakkas

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

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

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "nakkas": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "nakkas"
      ]
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.

Your choice stays on this device in a cookie; no account needed.

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

What it can do

Runs on your computer; the tool list appears in your AI app after you install it.

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified with the GitHub account arikusi, which owns the repo

  • … Not checked yet

    Still maintained

    We have not read this repo from GitHub yet

  • … Not checked yet

    Has a licence

    We have not read this repo from GitHub yet

  • – Not applicable

    Endpoint responds

    This one runs on your computer; there is no internet endpoint

  • – Not applicable

    Sign-in with OAuth

    Runs on your computer and uses local settings instead

  • … Not checked yet

    No hidden instructions in tool descriptions

    Runs on your computer; we can only read tool lists from internet endpoints

Compared with others in Design, images & audioi

  • More stars than 0% of the other 2752 servers in this category
  • Published to the registry more recently than 16% of the other 2752 servers in this category
  • Basic checks equal to or better than 100% of the other 2752 servers in this category

Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.

Common questions

Is Nakkas safe?

It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

The registry does not list a required key, though some servers ask you to sign in on first use.

Does it run on my computer or in the cloud?

It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).

Is it still maintained?

The GitHub repo last changed –, and the latest version (0.5.0) reached the registry 4 months ago.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Node.js on your computer.

What can I use instead?

In the same category: Figma Context MCP, Claude Real Video, Figma MCP Server

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

Give your coding agent access to your Figma data. Implement designs in any framework in one-shot.

Runs on your computer★ 16,165MITUpdated 5 months ago
Install

Claude Real Video

by HUANGCHIHHUNGLeo

Let any LLM watch a video locally — and search everything it has ever watched.

Runs on your computer★ 2,284MITUpdated 2 months ago
Install

Figma’s official server gives AI your design data so it can turn designs into code or describe them accurately. Connects to Figma’s cloud.

Runs in the cloud★ 2,152Updated 13 months ago
Install

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

MCP server that turns AI into an SVG artist.

One rendering engine. AI decides everything.

Officially listed on the MCP Registry , Glama , LobeHub , and PulseMCP .

Both drawn by an AI through nakkas, one JSON config each, iterated against its own PNG previews. Pure CSS animation, no JavaScript.

Nakkas is an MCP (Model Context Protocol) server that lets AI assistants like Claude create animated SVG graphics from a declarative JSON config: logos, icons, loading spinners, GitHub README banners, badges, and generative art. It renders CSS @keyframes and SMIL animations with no JavaScript, so the output works inside GitHub READMEs and anywhere an tag renders SVG. Every render comes back as a PNG preview plus a server-side artifact id, so the AI sees its own work immediately and iterates without the SVG text ever passing through its context window.

*nakkaş* means painter/artist in Turkish (old).

"make a neon terminal logo with animated binary digits"

→ AI constructs JSON config → nakkas renders to animated SVG → AI previews the PNG, critiques, revises → clean animated SVG output

Why

  • One tool, infinite designs. render_svg takes a JSON config. AI fills in everything.
  • The AI sees its own work. Every render returns a PNG preview, so the model critiques and revises instead of designing blind.
  • Token-cheap iteration. The SVG stays on the server as an artifact; preview and save address it by id, so revision loops don't pay for the SVG text.
  • Pure declarative SVG. CSS @keyframes + SMIL animations, no JavaScript. Survives GitHub's camo proxy.
  • Zero external deps. No cloud API, no API keys. Runs locally.

Install

Claude Desktop

Add to your config file:

  • 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 / Other MCP clients
{

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

Local Development
git clone https://github.com/arikusi/nakkas

cd nakkas npm install && npm run build

Use dist/index.js as the command

Quick Start

Ask your AI (with Nakkas connected):

"Make an animated SVG: dark terminal frame (800×200), glowing cyan text 'NAKKAS', neon glow filter, fade-in on load."

"Create a loading spinner: a circle with a draw-on stroke animation that loops every 1.5 seconds."

"Data visualization: animated bar chart, 5 bars, each fading in with a staggered delay, gradient fills."

"Profile badge (400×120): blue-to-purple gradient, white username text, drop shadow, subtle pulse animation."

Tools

Nakkas provides three tools:

ToolPurpose
render_svgTakes SVGConfig JSON, returns a PNG preview + artifact id (+ design analysis warnings)
previewRe-renders a stored artifact (or raw SVG) to PNG at any width
saveSaves a stored artifact (or raw content) to disk as SVG (text) or PNG (raster)

The intended workflow: render → look at the returned preview → revise the config → render again → save. The rendered SVG stays on the server as an artifact: render_svg answers with the preview image and an id like art-1, and preview/save accept that id directly. The SVG text never has to travel back through the model's context window, which cuts the token cost of an iteration loop to a fraction of pasting SVG around. Artifacts live for the server process lifetime (capped at 32, oldest evicted).

The save Tool
{ "artifact": "art-1", "outputPath": "./design.svg", "format": "auto" }

Pass either artifact (id from render_svg, preferred) or content (raw string). Formats: auto (infers from extension), svg (text file), png (renders to raster first). If the file exists, a numeric counter is appended to prevent overwriting. The actual saved path is returned.

The render_svg Tool

Input: SVGConfig JSON object Output: PNG preview image + a summary naming the artifact id, plus optional design analysis notes

The response shape is controlled by an optional output block in the config:

{ "output": { "svg": false, "preview": true, "previewWidth": 800, "minify": false } }
  • svg: true includes the full SVG text in the response (off by default; the artifact id covers preview and save)
  • preview: false skips the PNG image
  • previewWidth scales the preview
  • minify: true collapses whitespace in the stored and saved SVG
  • frames: N (2 to 10) replaces the static preview with one filmstrip image sampling the CSS animations at N points in time — the way to verify motion, since a single preview only shows the starting state

With frames, nakkas evaluates the @keyframes math itself (duration, delay, iteration count, direction, fill mode, easing per segment) and bakes each sampled state into a static frame. Transform origins declared as transform-box: fill-box are resolved numerically from the element's geometry. SMIL animations are not sampled.

After rendering, the response may include design warnings about common issues such as too many concurrent animations, missing transformBox, group-level scale transforms, content extending past the viewport (measured from the real rendered bounding box, with the overflow in pixels), or low-contrast text against the canvas background (WCAG ratios). Text gets its own layout audit: every text element's ink bounding box is measured through an isolated render, so text escaping the viewport is named with its exact overflow, and two texts printed over each other come back as an overlap warning naming both.

SVGConfig Structure
{

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 patterns?: Pattern[], // repeating tile fills markers?: Marker[] // arrowheads: triangle | arrow | circle | square | diamond | bar },

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

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

Element Types
TypeRequired fieldsNotes
rectwidth, heightx, y default 0; rx/ry for rounded corners
circlercx, cy default 0
ellipserx, ryIndependent horizontal/vertical radii
linex1, y1, x2, y2markerStart/markerEnd take a marker id from defs.markers
polylinepointsOpen path: "10,20 50,80 90,20"; supports markerStart/markerMid/markerEnd
polygonpointsAuto-closed shape
pathdFull SVG path commands
imagehref, width, heightURL or data:image/... URI for embedded images
textcontentString or `(string \Tspan)[]` array
textPathpathId, textText following a curve; path defined in defs.paths
groupchildrenShared attrs applied to all children (no nested groups)
usehrefInstance a symbol or clone an element by #id
radial-groupcx, cy, count, radius, childPlace N copies around a full circle
arc-groupcx, cy, radius, count, startAngle, endAngle, childPlace N copies along a circular arc
grid-groupcols, rows, colSpacing, rowSpacing, childPlace copies in an M by N grid
scatter-groupwidth, height, count, seed, childScatter N copies at seeded random positions
path-groupwaypoints, count, childDistribute N copies evenly along a polyline
parametricfnMathematical curve: rose, heart, star, lissajous, spiral, superformula, epitrochoid, hypotrochoid, wave

Two field names differ from raw SVG on purpose: the string of a text element goes in content (on textPath it is text), and validation errors will point you to the exact field if you mix them up. Pattern groups rotate each copy to face outward by default; set rotateChildren: false when the child is text or any shape that should stay upright.

All Visual Elements (Shared Fields)
{

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[] }

Filter Presets

Reference as filter: "url(#myId)" on any element after defining in defs.filters:

{ "type": "preset", "id": "myGlow", "preset": "glow", "stdDeviation": 8, "color": "#ff00ff" }
PresetKey paramsEffect
glowstdDeviation, colorSoft halo
neonstdDeviation, colorIntense bright glow

| blur | stdDeviation | Gaussia

Only the beginning is shown; read the rest in the repo

Ask PopNx