Repository navigation
Releases: icons8/agent-skills
Release list
v0.6.1
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
ouchfor ready animations and tomotionfor interface animation. ouch,motionandicons8-designnow point here:ouchgives you ready animations,illustration-animatoranimates 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
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
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.jsonnames the plugin, its display name, version, author, license and keywords, and gives the listing the Icons8 logo. Cursor finds the nine skills inskills/and the Icons8 server in the two server files without extra configuration. -
A Cursor marketplace.
.cursor-plugin/marketplace.jsonlists 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.pyruns after a bare-skill install in Claude Code. Theouchskill 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
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.jsoncarries 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.jsonis a regular file with"type": "http". Since 0.2.0 it was a symlink tomcp.json. The directory refuses a symlink where the plugin loader reads, and it accepts a remote server only ashttp,sseorws. Chat and Cowork load onlyhttpandsse, so they skipped the server that Claude Code accepted under thestreamable-httpalias.mcp.jsonstays 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.jsonby itself and then loads whatevermcpServersnames on top of it. PointingmcpServersatmcp.jsonwould replace thehttpentry with thestreamable-httpone again. -
measure.pytakes--chrome PATHinstead of$CHROME. The script now reads no environment variables. It looks for Chrome and Edge in their standard install locations, on WindowsC:\Program Files,C:\Program Files (x86)and the user'sAppData\Local, and then onPATH. 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
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.mdcarries the formats, a play-once snippet run in
Chrome, CSS tinting that follows the icon'scolor, 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 inm_outlinedbreaks
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;motionnow 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
icons8no longer says the MCP has no animated icons.motionnames an animated icon played once as the alternative to cross-fading paired variants.
v0.4.1
The ouch frontmatter was not valid YAML. A tool that parses frontmatter strictly skipped the skill.
Fixed
ouchloads 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 isnpx skills: it printedYAML 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 unquotednameordescription, so the same mistake
fails the build.
v0.4.0
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-checkruns 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 inicons8.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-hevcgoes 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.jsonholds 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 separateouch.jsonis folded in on the
next write and left on disk for you to remove. icons8works 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
motionandui-polishare 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
interfacegains a design-check default prompt.
Verified before release
plugin:icons8:icons8mcpreachable from outside the repository.plugin details icons8reportsSkills (9)andMCP servers (1);.mcp.jsonis still a symlink
(git mode120000).- 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
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 tofree_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-heightnever 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
interfacegains an illustrations default prompt. - The README names both skills and states the illustration rules and the server status.
Verified before release
plugin:icons8:icons8mcpreachable from outside the repository, with a negative control: removing
the declaration removes the server from the probe.plugin details icons8reportsSkills (2)andMCP servers (1);.mcp.jsonis still a symlink
(git mode120000).- 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
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.jsonat the repository root — the portable manifest,$schemapinned 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.jsonat the repository root — the MCP configuration, at the path the specification fixes
for it and with$schemapinned tohttps://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
pointingmcpServersat 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 aurl. That removes the bridge process and the Node.js
requirement from every client that reads this file — Claude Code acceptsstreamable-httpas an
alias for its ownhttptype.npx mcp-remoteis gone from the documentation entirely: the
older-Codex fallback is nowcodex mcp add icons8mcp --url …, so no path through these docs still
needs the bridge or a Node.js runtime. -
The Codex manifest's
descriptionnow 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 samemcp.jsonas 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 andget_icon_svgjoins the other
four tools. An API key in anAuthorizationheader 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 Sourcewith no marketplace; Copilot CLI usescopilot 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.jsondeclared agit-subdirsource 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 nowlocalwith"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.jsonand the skill
were always fine — only the marketplace index pointed into the void. -
claude plugin detailscounted no MCP servers. It reportedMCP servers (0)while
claude mcp listshowed the server connected. Claude Code builds that inventory by reading a file
named.mcp.jsonat the plugin root and does not resolve the path a manifest'smcpServers
declares, so a manifest pointing atmcp.jsonleft the count empty. The Agent Plugins
specification fixes the configuration filename asmcp.jsonand forbids any alternative path, so
.mcp.jsonis 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 to0and the server still
loads, which is the behaviour before this change.
v0.1.1
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_svgnever 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 thesvgstring for emptiness were guarding a state that
cannot occur. Both now test for theerrorkey. Step 6's third state is rewritten the same way and
says to read the message before blaming the plan:Icon not foundis a wrong id,Authentication data is invalid or missing (HTTP 401)is the key. -
list_platformsreturns 130 packs, not 98, andfluentandfluent-systems-regularare both in
it. Three places said otherwise.fluent-systems-regularreports 9,186 icons, which puts it in
the high-coverage group besidewin10(9,196) — the old "not listed" cell inPACKS.mdhad 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.