Skip to content

Releases: icons8/agent-skills

v0.6.1

Choose a tag to compare

@Eugenius-S Eugenius-S released this 28 Oct 11:00
88b58ea

illustration-animator 0.6.1 is a cleanup after review: the skill now reads like the rest of the Icons8 line, and the neighbouring skills point to it. The engine hasn't changed, so animations come out the same.

Changed

  • The skill file now has hard rules, when not to use it, what never ships and what it hands back, like the other Icons8 skills.
  • Every hard rule carries a Tested note from real review rounds, checked against what those rounds actually showed.
  • The analysis steps read as plain instructions: look, decide what to cut, write the story, cut the parts, lay them out, check the build.
  • The description says what you get and when to use the skill, and sends you to ouch for ready animations and to motion for interface animation.
  • ouch, motion and icons8-design now point here: ouch gives you ready animations, illustration-animator animates your own static SVGs.
  • The skill explains why it runs subagents: analysis goes in batches, the judge never sees the animator's reasoning, and one stuck scene can't eat the others' time.
  • Lessons from past scenes moved into their style files, so working notes no longer ship with the plugin.

Fixed

  • The judge's reference mode has a heading in plain words.
  • README has a comment for every file in the tree and the missing comma in "Lottie JSON, GIF and MOV".

v0.6.0

Choose a tag to compare

@Eugenius-S Eugenius-S released this 15 Oct 16:30
65e3a84

Hi, I'm Eugene, and this is my first contribution here. illustration-animator takes still SVG illustrations and brings them to life. It's far from perfect yet, but simple animations already work, and we'll keep teaching it and shipping updates.

Added

  • Its rules and reference scenes are trained on Icons8 animations and illustrations.
  • Turns still SVG illustrations into looped animations.
  • Works out what each object affords on its own: a wheel spins, a rocket flies.
  • Cuts the drawing into moving parts with joints and tight masks along the lines.
  • Characters drawn as one merged outline get cut and bent too, with the seam pinned.
  • Exports a looped Lottie JSON, GIF and MOV, plus an MP4 with a transparent background on macOS.
  • Checks every animation with scripts and a visual judge and fixes what they find, keeping to hard time limits at every step.
  • A scene you call bad becomes a rule for the whole style.
  • Runs on its own Node engine from the skill folder and doesn't use the MCP server.

The first install shows what it's going to set up before it does anything:

  • npm packages at the exact versions from the lockfile;
  • a pinned Chrome checked against SHA-256, if the machine has no Chrome, Chromium or Edge.

Nothing gets installed without your OK. It names ffmpeg but leaves installing it to you.

The lessons, bans and samples it collects stay in your project, not in the plugin folder.

v0.5.2

Choose a tag to compare

@eniwito eniwito released this 05 Oct 08:41
cb366e5

A Cursor marketplace can now list the plugin, and Cursor installs it from there with its skills and the Icons8 server.

Added

  • A Cursor manifest. .cursor-plugin/plugin.json names the plugin, its display name, version, author, license and keywords, and gives the listing the Icons8 logo. Cursor finds the nine skills in skills/ and the Icons8 server in the two server files without extra configuration.

  • A Cursor marketplace. .cursor-plugin/marketplace.json lists the plugin from the repository root, so a team can import this repository as a marketplace in Cursor.

  • Install steps for GitHub Copilot CLI. The README shows how to add this repository as a marketplace in Copilot CLI and install the plugin from it. Copilot CLI reads the existing Claude marketplace file, so no new file was needed.

Fixed

  • measure.py runs after a bare-skill install in Claude Code. The ouch skill located the script through ${CLAUDE_PLUGIN_ROOT}, which Claude Code fills in only for a plugin, so a bare skill could not run the command. The skill now uses ${CLAUDE_SKILL_DIR}, which Claude Code fills in for a plugin and a bare skill alike. Cursor, Codex and GitHub Copilot fill in neither variable, and the skill now tells them to replace it with the folder that holds the skill instead of leaving the path to a guess. Windows uses the same path, so the separate PowerShell and cmd lines are gone.

v0.5.1

Choose a tag to compare

@eniwito eniwito released this 01 Oct 16:24
07f1a22

The plugin is ready for Anthropic's plugin directory. The Icons8 server is now declared with the http type, the one that claude.ai chat and Cowork load, as well as Claude Code.

Added

  • A listing for the Claude directory. .claude-plugin/plugin.json carries a display name, the Icons8 logo as its icon, and links to the privacy policy, the terms and conditions, the contact page for support and the README as documentation. Without the icon the directory would show the publisher's GitHub avatar.

  • The README says what the plugin connects to. A new section lists every host the skills reach, what each request carries, what the skills write into a project, and what runs on the user's machine. The README also gains example prompts and a support section.

Changed

  • .mcp.json is a regular file with "type": "http". Since 0.2.0 it was a symlink to mcp.json. The directory refuses a symlink where the plugin loader reads, and it accepts a remote server only as http, sse or ws. Chat and Cowork load only http and sse, so they skipped the server that Claude Code accepted under the streamable-http alias. mcp.json stays as it was, in the Agent Plugins v1 format that Codex and v1 clients read. The server is now declared in two files, one per format, and CI fails if the two URLs differ.

  • The Claude manifest no longer names an MCP file. Claude Code loads .mcp.json by itself and then loads whatever mcpServers names on top of it. Pointing mcpServers at mcp.json would replace the http entry with the streamable-http one again.

  • measure.py takes --chrome PATH instead of $CHROME. The script now reads no environment variables. It looks for Chrome and Edge in their standard install locations, on Windows C:\Program Files, C:\Program Files (x86) and the user's AppData\Local, and then on PATH. A browser installed anywhere else is named with --chrome. The Claude directory holds for manual review every version of a plugin that reads environment variables and also sends data to a server, and that hold would stop automatic publishing.

v0.5.0

Choose a tag to compare

@kalimullin kalimullin released this 30 Sep 12:46
19dee68

Icons that move, without an interface that flickers.

Added

  • Animated icons in icons8. The server now finds icons that move (search_icons(animated=True))
    and serves them as Lottie, gif or apng (get_icon_animation). The skill's rule is that motion
    answers the user and never starts on its own: an icon plays one cycle on a click that changes
    state or on a mouse hover over a standalone element, half a cycle each way on a toggle, or for
    as long as a loading process runs, then stops on its rest frame. Navigation, lists, empty and error states stay
    static, and nothing loops on hover or click. Hover and click take Lottie only, because gif and
    apng loop forever by construction, cannot be recolored and exist in one size per pack; gif is
    also opaque white. references/ANIMATION.md carries the formats, a play-once snippet run in
    Chrome, CSS tinting that follows the icon's color, and two new lock fields (motion, format).
    The motion also has to say what the action says: positive actions take motion that fills or
    joins, negative ones motion that empties or breaks, checked by the Lottie's layer names and by
    looking at frames. Found in a test build where the only animated link in m_outlined breaks
    apart, which suits Unlink and contradicts Copy link. Toggles (like, bookmark) play half a cycle
    on and half off, reverse from wherever they are on a quick second click, and load in the right
    state. Keyboard focus never starts motion. The loader loops only between start and stop. Each
    Lottie is fetched once and saved to the file the lock names, so later screens do not pay for it
    again. The icon keeps the animator's timing; motion now says its durations do not apply to
    authored animation inside Icons8 assets.
  • The main search loop passes animated=False, so animated variants stay out of static screens.

Changed

  • icons8 no longer says the MCP has no animated icons.
  • motion names an animated icon played once as the alternative to cross-fading paired variants.

v0.4.1

Choose a tag to compare

@eniwito eniwito released this 24 Sep 11:21
075cd67

The ouch frontmatter was not valid YAML. A tool that parses frontmatter strictly skipped the skill.

Fixed

  • ouch loads in every tool that reads skill frontmatter as strict YAML. Since 0.4.0 its
    description contained (video and Lottie): use it. A colon followed by a space is not allowed in
    an unquoted YAML value. A strict parser rejects the frontmatter, and the tool drops the skill
    without an error in the agent. One confirmed case is npx skills: it printed YAML parse error
    and listed eight skills instead of nine. Claude Code reads frontmatter less strictly and still
    showed the skill. The sentence now ends with a full stop, and the description text is otherwise
    the same. CI now rejects : and # in an unquoted name or description, so the same mistake
    fails the build.

v0.4.0

Choose a tag to compare

@eniwito eniwito released this 22 Sep 20:16
03e5a4d

The plugin stops at fetching assets and starts checking what the agent built with them. Seven
design skills arrive in this release, together with Ouch illustrations that move and one lock file
for the whole project. All of it was designed and written by
@kalimullin in #7:
a designer's review turned into rules an agent can run on its own work. The ownership map that
gives every rule exactly one skill, the merged report with a single verdict, and the <video>
source order that lets Safari show the alpha are all theirs, and the animation rules were measured
against the live server rather than assumed. Asking for an icon stays a one-skill job: icons8 and
ouch reference none of the new skills.

Added

A design pass over the finished screen — seven skills:

  • asset-check runs on its own once a UI is built or changed and answers four mechanical
    questions: is an emoji standing in for an icon, does a section that should carry a picture carry
    none, is an image URL dead, does an icon import name still exist in the library. The last check
    works on projects that use no Icons8 asset at all.
  • ux-check: behaviour, the six states, flows, and the accessibility floor of semantics, keyboard
    reach, labels and alt text.
  • ux-writing: every string a user reads, with before/after patterns per surface.
  • ui-polish: alignment, radii, icons, contrast, focus and state styling.
  • motion: whether a thing should animate at all, then every timing value.
  • design-tokens: bootstrap a token system, then catch drift in counts rather than adjectives. It
    records the token names in icons8.json, so the next asset is wired to the same variables.
  • icons8-design: the front door that routes a request to the skill that owns it, so a narrow
    question does not load all of them.

Two properties keep them from becoming noise. Every rule two skills could raise has exactly one
named owner, so one defect yields one finding. When several run on the same screen, the reports
merge into one table with one verdict. Where a finding is about an icon or an illustration, the fix
comes from the catalogue through the MCP, already in place.

Animated illustrations in ouch — when a slot earns motion, the skill finds the animated
versions, fetches the real files through get_illustration_animation, and falls back to the still
when motion is not wanted:

  • mp4-hevc goes first in the <video>: Safari answers "probably" for webm too, takes whichever
    source it sees first, and then cannot show the transparency;
  • one moving thing per screen, normally the hero; empty states stay static;
  • Lottie where the artwork has it, video for the one hero at most;
  • the animation links in search results are 368 px, opaque and watermarked without a plan: for
    choosing, never for shipping.

The rules, the budget, the playback and the layout math are in skills/ouch/references/ANIMATION.md.

Changed

  • One lock file per project. icons8.json holds the icon pack, the sizes the project uses, the
    illustration style with its slots, and the names of the CSS variables assets are wired to. Nothing
    breaks: a lock in the old shape is read as before, and a separate ouch.json is folded in on the
    next write and left on disk for you to remove.
  • icons8 works when nobody is watching. In a subagent or a batch run, the skill reads the
    contact sheet itself, names the picks it was unsure about, and treats the set that survived the
    layout as the approved one instead of shipping PNG where the project wants vectors.
  • Third-party notices. Parts of motion and ui-polish are derived from MIT-licensed skills by
    Emil Kowalski and Jakub Krehel and stay under their authors' copyright. THIRD_PARTY_NOTICES.md
    carries the full permission notices and the links that the adapted CC BY 4.0 and Open Government
    Licence sources require. The repository stays Apache-2.0.
  • The manifests, the Claude marketplace entry and the README describe all nine skills. The Codex
    interface gains a design-check default prompt.

Verified before release

  • plugin:icons8:icons8mcp reachable from outside the repository.
  • plugin details icons8 reports Skills (9) and MCP servers (1); .mcp.json is still a symlink
    (git mode 120000).
  • Animation counts, sizes and formats in the skill checked against the live server on 2026-09-22.
  • Three manifests agree on 0.4.0, and their description matches the marketplace entry.
  • CI green on Linux, macOS and Windows.

v0.3.0

Choose a tag to compare

@eniwito eniwito released this 07 Sep 17:46
4094996

The plugin's second skill: illustrations. ouch brings to Ouch! artwork the discipline icons8
brought to icons. It was designed and written by @kalimullin in
#4 — a designer's judgment written down as rules an
agent can follow, which is a harder thing than it sounds: the metaphor rules, the priority ladder
that settles collisions, the contrast gate and the browser-measured layout rules are all theirs, and
each one earned its place in a test run rather than being asserted. The five illustration tools it relies on are live on mcp.icons8.com; on a
connection that does not expose them, the skill says so and stops, per its own rules.

Added

ouch skill — choose and ship Icons8 illustrations so a deliverable ends up with pictures that
are about the product, read as one set, and can legally and technically be published:

  • every slot query carries the product's own noun, and absence states show the missing container,
    never the inhabitant;
  • one style per project, locked in ouch.json, with two named escapes — an existing page's style
    always wins, and public repos filter to free_distribution: true;
  • a priority ladder that settles collisions: licence → existing style → subject coverage → surface
    and contrast → tone → the first tier;
  • a contrast gate for non-white backgrounds, and layout rules measured in real browsers, including
    "max-height never upscales a small SVG" and ground-line alignment for 3D artwork;
  • watermarked previews are for choosing only; presigned original URLs live an hour and never go
    into a page.

Bundled references — STYLES.md (the 43-style first tier and the 15-style free tier, counts
verified against the API on 2026-09-07), SLOTS.md (slot kits per project type, known-thin
subjects), VOCABULARY.md (state → query translations with measured result counts) and LAYOUT.md
(the browser measurements behind the layout rules).

scripts/measure.py — ground-line offset, mass offset and mean saturation in one script, the
single source of those formulas for the skill and its gates. Rasterizes SVG through headless Chrome
at the artwork's own aspect ratio. Needs Python 3 with Pillow, declared in the script via PEP 723 so
uv run installs it; finds Chrome or Edge on macOS, Linux and Windows, and writes rasters to a
temporary directory instead of next to the sources.

Changed

  • The three plugin manifests and the Claude marketplace entry describe both skills, and the Codex
    interface gains an illustrations default prompt.
  • The README names both skills and states the illustration rules and the server status.

Verified before release

  • plugin:icons8:icons8mcp reachable from outside the repository, with a negative control: removing
    the declaration removes the server from the probe.
  • plugin details icons8 reports Skills (2) and MCP servers (1); .mcp.json is still a symlink
    (git mode 120000).
  • Codex installs the plugin from its manifest, not from config.toml, and the server disappears
    with the plugin.
  • CI green on Linux, macOS and Windows.

v0.2.0

Choose a tag to compare

@eniwito eniwito released this 03 Sep 11:15
5e70526

Two things land together here. The plugin now ships as a conforming
Agent Plugins v1 package, so clients that implement the
standard install it from the repository root instead of needing a Claude Code or Codex specific
path. And the Icons8 server moved to OAuth, so signing in replaces pasting a key — which changes how
the skill reads the SVG paywall, and what the README tells you to do about it. The way the skill
picks icons is untouched.

Added

  • plugin.json at the repository root — the portable manifest, $schema pinned to
    https://agent-plugins.org/schemas/1.0.0/plugin.schema.json. Its schema is closed, so the fields
    the client-specific manifests carry outside that set (skills, mcpServers, interface) are not
    repeated here: skills/ is already the location the spec fixes for discovery, and MCP
    configuration belongs in its own file.

  • mcp.json at the repository root — the MCP configuration, at the path the specification fixes
    for it and with $schema pinned to https://agent-plugins.org/schemas/1.0.0/mcp.schema.json. A
    conforming client reads the server from here and from nowhere else, so this is where the Icons8
    server is now declared — once, rather than once per packaging format, with both client manifests
    pointing mcpServers at it.

Changed

  • The bundled server connects over HTTP instead of through npx mcp-remote. mcp.icons8.com
    speaks the MCP Streamable HTTP transport directly, so the entry is now
    "type": "streamable-http" with a url. That removes the bridge process and the Node.js
    requirement from every client that reads this file — Claude Code accepts streamable-http as an
    alias for its own http type. npx mcp-remote is gone from the documentation entirely: the
    older-Codex fallback is now codex mcp add icons8mcp --url …, so no path through these docs still
    needs the bridge or a Node.js runtime.

  • The Codex manifest's description now matches the other three. It had been missing the closing
    "Bundles the Icons8 MCP server." since 0.1.0 — true then and truer now, since that manifest points
    at the same mcp.json as everything else.

  • The server authenticates with OAuth, so the README's plan section is rewritten. Signing in
    through the browser is now the whole setup, and search and high-res PNG follow from it — the old
    "no account and no API key required" no longer describes what happens on first use. SVG needs no
    separate server either: the subscribed account carries the plan and get_icon_svg joins the other
    four tools. An API key in an Authorization header remains the path for a client that cannot do
    OAuth, and for CI, where nobody is around to sign in.

  • The skill reads the SVG gate as a plan, not as a key. Step 6 used to tell the agent that the
    gate was "the connection's API key", so a signed-in paid user with no key in sight read as
    keyless — the wrong diagnosis, and the wrong advice to hand back. It now names the plan the
    connection carries, whether that comes from the signed-in account or from a bearer header, and
    adds the state no tool call can diagnose: when the client reports the whole server as needing
    authentication, nobody has signed in yet.

  • README names the install path per client. VS Code takes a repository URL through
    Chat: Install Plugin From Source with no marketplace; Copilot CLI uses copilot plugin install;
    Cursor installs from marketplaces only. The section used to say "whatever install path that client
    documents", which is where the reader's actual question starts.

  • .claude-plugin/ and .codex-plugin/ keep their own manifests. Claude Code is not on the
    compatible clients list and Codex still documents
    .codex-plugin/plugin.json, so the portable files are additive rather than a replacement — which
    is what the spec's own migration guidance calls for. What they no longer keep is their own copy of
    the server definition.

Fixed

  • Codex found no plugin in the marketplace. codex plugin marketplace add icons8/agent-skills —
    the command the README gives — added the marketplace and then listed nothing in the plugin browser,
    so the documented install path dead-ended. It had been broken since 0.1.0. The entry in
    .agents/plugins/marketplace.json declared a git-subdir source with "path": ".", and Codex
    resolves that source only for a real subdirectory: ".", "./" and "" all yield an empty
    listing, while a genuine subdirectory resolves. The source is now local with "path": "./",
    which resolves against the marketplace root and so covers a clone, a fork and a local checkout
    alike. Nothing else about the entry changes, and both .codex-plugin/plugin.json and the skill
    were always fine — only the marketplace index pointed into the void.

  • claude plugin details counted no MCP servers. It reported MCP servers (0) while
    claude mcp list showed the server connected. Claude Code builds that inventory by reading a file
    named .mcp.json at the plugin root and does not resolve the path a manifest's mcpServers
    declares, so a manifest pointing at mcp.json left the count empty. The Agent Plugins
    specification fixes the configuration filename as mcp.json and forbids any alternative path, so
    .mcp.json is a symlink to it rather than a second file: one definition, reachable under both
    names. Where a checkout cannot create symlinks the count falls back to 0 and the server still
    loads, which is the behaviour before this change.

v0.1.1

Choose a tag to compare

@eniwito eniwito released this 11 Aug 14:02
2feb273

Two facts the skill stated about the MCP server no longer held. Re-checked against the live API and
corrected; no behaviour of the skill's workflow changes.

Fixed

  • get_icon_svg never answers with an empty string. Every failure comes back as
    {"error": ...} — a bad id as {"error": "Icons8 API: Icon not found (HTTP 404)"} — so the two
    places that told the reader to test the svg string for emptiness were guarding a state that
    cannot occur. Both now test for the error key. Step 6's third state is rewritten the same way and
    says to read the message before blaming the plan: Icon not found is a wrong id, Authentication data is invalid or missing (HTTP 401) is the key.

  • list_platforms returns 130 packs, not 98, and fluent and fluent-systems-regular are both in
    it.
    Three places said otherwise. fluent-systems-regular reports 9,186 icons, which puts it in
    the high-coverage group beside win10 (9,196) — the old "not listed" cell in PACKS.md had kept it
    out of consideration for Windows work. The caution is kept without the stale example: a code
    missing from the list is still not proof the pack is gone.