no setup, no code
Ask your AI for the right icon.
Say what the icon is for, then click Claude, ChatGPT, Gemini, Perplexity or Grok. We copy a ready brief that points it to our skill file and open it for you. It comes back with the best-fit icon, two alternatives, the right style and code or steps for your app.
- 1Say what the icon is for
- 2Pick your assistant
- 3We copy a brief and open it
The assistant opens in a new tab, searches with icons and replies with the best fit and how to use it. Nothing is sent to us: the prompt only tells your assistant where to read about with icons (llms.txt and the skill). Gemini can’t pre-fill the message: paste it with Ctrl+V (⌘V on a Mac).
Five things to ask
Every brief starts by sending the assistant to our skill file, so it searches the real library and never invents icon names. You pick the job; we write the brief.
-
Find the right icon
Next to every search box, and here
You type“a button that clears the cart in my grocery app”
The best fit with a one-line reason, up to two alternatives, the right style for where it goes, and code or steps for your app.
-
Code it for my app
On every icon page
You type“the delete button in my React table”
Paste-ready code for your stack, the size and colour, the exact aria-label and tooltip text, and hover, focus, active and disabled states.
-
Build a matching set
On every icon page
You type“the toolbar of my notes app”
The 4 to 8 icons that belong next to this one, all in one style and size, with why each is there and anything the library doesn’t cover.
-
Is this the right icon?
On every icon page
You type“remove item, for shoppers in Japan”
An honest verdict, what people will actually read it as, cultural or ambiguity issues, and better options from the library if there are any.
-
Use it in my slides or doc
On every icon page and app guide
You type“a pricing slide in Google Slides”
Which file to grab (copy image, SVG or PNG and what size), how to insert, recolour and resize it in your app, layout tips, and the matching step-by-step guide.
Add with icons to your AI tool
Coding agents work best with the real thing: connect with icons once and your assistant searches by meaning, uses the right package for your stack and never invents an icon name. Pick your tool.
Claude Code
Skill in .claude/skills plus the MCP server, so Claude Code searches icons by meaning and pastes the right import.
- MCP server
.mcp.json- Agent skill
.claude/skills/ with-icons/ SKILL. md
Step by step
One command fastest
Run in your project. It copies the skill to
.claude/and adds the server toskills/ with-icons/ .mcp.json. Add--globalfor every project.npx withicons init claude-codeOr add the server with Claude Code's own CLI
Remote, no install. Use
--scopeuser for all projects or--scopeproject to share it through.mcp.json.claude mcp add --transport http withicons https://withicons.com/mcpRun it locally instead
The same server over stdio (Node 18+).
claude mcp add --transport stdio withicons -- npx -y @withicons/mcpCheck
Type
/mcpin Claude Code to see the withicons tools, and ask for "an icon for deleting things, in React".
Prefer to edit the config yourself?
Remote · recommended
{
"mcpServers": {
"withicons": {
"type": "http",
"url": "https://withicons.com/mcp"
}
}
}Local · npx
{
"mcpServers": {
"withicons": {
"command": "npx",
"args": [
"-y",
"@withicons/mcp"
]
}
}
}OpenAI Codex
For the Codex CLI, IDE extension and app: the skill in .agents/skills and the server in config.toml.
- MCP server
~/.codex/ config. toml - Agent skill
.agents/skills/ with-icons/ SKILL. md
Step by step
One command fastest
Copies the skill to
.agents/and addsskills/ with-icons/ [mcp_toservers. withicons] .codex/(Codex reads project config in trusted projects). Addconfig. toml --globalto use~/and.codex/ config. toml ~/..agents/ skills npx withicons init codexOr use the Codex CLI
Streamable HTTP, no install.
codex mcp add withicons --url https://withicons.com/mcpRun it locally instead
stdio via npx (Node 18+).
codex mcp add withicons -- npx -y @withicons/mcpIDE extension
The CLI, IDE extension and app share
config.toml. In the extension: gear menu › MCP servers › Add server › Streamable HTTP, then restart the extension.
Prefer to edit the config yourself?
Remote · recommended
[mcp_servers.withicons]
url = "https://withicons.com/mcp"Local · npx
[mcp_servers.withicons]
command = "npx"
args = ["-y", "@withicons/mcp"]Cursor
One click adds the server to Cursor. The skill goes in .agents/skills, which Cursor loads automatically.
- MCP server
.cursor/mcp. json - Agent skill
.agents/skills/ with-icons/ SKILL. md
Step by step
One click
Use the Add to Cursor button. Cursor opens and asks you to confirm the withicons server.
Or one command fastest
Copies the skill to
.agents/and adds the server toskills/ with-icons/ .cursor/. Addmcp. json --globalfor~/..cursor/ mcp. json npx withicons init cursorOr edit mcp.json yourself
Project:
.cursor/. Everywhere:mcp. json ~/..cursor/ mcp. json Remote · recommended
{ "mcpServers": { "withicons": { "url": "https://withicons.com/mcp" } } }Local · npx
{ "mcpServers": { "withicons": { "command": "npx", "args": [ "-y", "@withicons/mcp" ] } } }
OpenCode
Adds a remote MCP entry to opencode.json and the skill to .agents/skills, which OpenCode discovers on its own.
- MCP server
opencode.json- Agent skill
.agents/skills/ with-icons/ SKILL. md
Step by step
One command fastest
Copies the skill to
.agents/and adds "withicons" under "mcp" inskills/ with-icons/ opencode.json. Add--globalfor~/and.config/ opencode/ opencode. json ~/..agents/ skills npx withicons init opencodeOr edit opencode.json
OpenCode merges project and global config. opencode mcp add also walks you through it interactively.
Remote · recommended
{ "$schema": "https://opencode.ai/config.json", "mcp": { "withicons": { "type": "remote", "url": "https://withicons.com/mcp", "enabled": true } } }Local · npx
{ "$schema": "https://opencode.ai/config.json", "mcp": { "withicons": { "type": "local", "command": [ "npx", "-y", "@withicons/mcp" ], "enabled": true } } }Check
Run opencode mcp list.
opencode mcp list
Lovable
Connect the remote server as a chat connector and import the skill from GitHub. No install.
Step by step
Add the MCP server
Open Connectors, choose + (top right) › MCP server. Name: with icons. URL:
https://. Authentication: none. Available on all plans; each teammate connects their own.withicons. com/ mcp https://withicons.com/mcpAdd the skill (owners and admins)
Workspace settings › Skills › Add › Import from GitHub, and paste this link. It is shared with every project in the workspace.
https://github.com/withevergrow/withicons/tree/main/skills/with-iconsOr add project knowledge
Project settings › Knowledge (up to 10,000 characters). Paste the note below.
Icons: use the "with icons" library (https://withicons.com, MIT). Read https://withicons.com/skill/SKILL.md before adding icons. Find names with the withicons MCP server (search_icons) or https://withicons.com/api/search?q=<words>; never invent an icon name. React: npm i @withicons/react, then import { Home } from '@withicons/react'. Use the line style for UI, solid for active states, and one style per region. Icon-only buttons need an aria-label.
Claude Desktop
Add the remote server as a custom connector, or run it locally from claude_. Upload the skill as a zip.
- MCP server
claude_desktop_ config. json - Agent skill
with-icons.zip
Step by step
Remote connector
Customize › Connectors › + › Add custom connector, then paste the URL. Free plans allow one custom connector.
https://withicons.com/mcpOr run it locally fastest
This command adds the npx server to
claude_(Claude menu › Settings › Developer › Edit Config). Quit and reopen Claude afterwards.desktop_ config. json npx withicons init claude-desktopUpload the skill
Make the zip, then go to Customize › Skills › + › Create skill › Upload a skill. Code execution must be on.
npx withicons skill --zip
Prefer to edit the config yourself?
Local · npx
{
"mcpServers": {
"withicons": {
"command": "npx",
"args": [
"-y",
"@withicons/mcp"
]
}
}
}VS Code (Copilot)
Install the server in one click for Copilot agent mode. The skill goes in .agents/skills, which VS Code loads.
- MCP server
.vscode/mcp. json - Agent skill
.agents/skills/ with-icons/ SKILL. md
Step by step
One click
Use Install in VS Code. VS Code asks you to confirm and trust the server.
Or one command fastest
Copies the skill to
.agents/and adds the server toskills/ with-icons/ .vscode/.mcp. json npx withicons init vscodeOr the VS Code CLI (user profile)
Adds the local server to your user
mcp.json.code --add-mcp "{\"name\":\"withicons\",\"command\":\"npx\",\"args\":[\"-y\",\"@withicons/mcp\"]}"
Prefer to edit the config yourself?
Remote · recommended
{
"servers": {
"withicons": {
"type": "http",
"url": "https://withicons.com/mcp"
}
}
}Local · npx
{
"servers": {
"withicons": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@withicons/mcp"
]
}
}
}Windsurf
Windsurf is now Devin Desktop. Its Cascade agent reads MCP servers from your user mcp_config.json and skills from .agents/skills.
- MCP server
~/.config/ devin/ mcp_ config. json - Agent skill
.agents/skills/ with-icons/ SKILL. md
Step by step
One command fastest
Copies the skill to
.agents/and adds the server to your userskills/ with-icons/ mcp_config.json(~/, or %APPDATA%\devin\ on Windows; an existing.config/ devin/ ~/is updated too)..codeium/ windsurf/ mcp_ config. json npx withicons init windsurfOr edit mcp_config.json
Cascade has no one-click install. Remote servers use serverUrl. Refresh the MCP list afterwards.
Remote · recommended
{ "mcpServers": { "withicons": { "serverUrl": "https://withicons.com/mcp" } } }Local · npx
{ "mcpServers": { "withicons": { "command": "npx", "args": [ "-y", "@withicons/mcp" ] } } }
See what your agent gets back
This runs the same search engine as the MCP server, right here in your browser, and shows the same JSON the tool returns. Type what an agent might ask for.
The MCP server
The Model Context Protocol lets AI apps use tools. Add with icons once and your assistant can search, resolve and fetch icons on its own.
https://withicons.com/mcpnpx -y @withicons/mcpAdd it to your app
Exact, checked setup for Claude Code, Codex, Cursor, OpenCode, Lovable, Claude Desktop, VS Code and Windsurf is in Add with icons to your AI tool above. Any other client that speaks MCP: give it the remote URL, or this local config.
{
"mcpServers": {
"withicons": {
"command": "npx",
"args": [
"-y",
"@withicons/mcp"
]
}
}
}On Windows, if npx isn’t found, use "command": "cmd", "args": ["/.
Tools
search_icons{ query, limit?, style ?, category ?, format ? } Find icons by meaning: “throw away” finds trash. Ranked and typo-tolerant. Each result comes with why it matched, a ready-to-paste snippet (React unless you pass
format) and a link. Default limit: 10.get_icon{ name, style?, format ?, size ?, color ? } One icon as paste-ready code.
namecan be an alias (“delete” → trash).format: svg | react | vue | svelte | angular | solid | html-class | web-component | data-uri (default svg).colorreplaces currentColor in svg and data-uri.animate_icon{ name, trigger?, preset ?, to ?, effect ?, style ?, format ? } Paste-ready animation code for the optional
@withicons/package:motion loop,hover,once,invieworswap(play turns into pause), in HTML, React, Vue, Svelte, Solid, Angular or a web component.export_icon{ name, style?, format ?, size ?, background ?, palette ?, motion ?, out_ dir ? } Files, not code: SVG, PNG, PDF, PowerPoint, Word, favicons, app assets, Lottie, and animated GIF, APNG, SVG or a PowerPoint slide with the moving icon, for slides and docs. The local server (
npx -y @withicons/) saves them tomcp out_diror returns them inline; the remote one makes the vector files and answers the rest with the exactnpx withicons exportcommand.resolve_icon{ name }Check a guess:
resolved(with the alias it came through),ambiguous(with candidates) orunknown(with the nearest names).list_styles{}The 20 styles, which are universal, creative or playful, and what each looks like.
list_categories{ category? }Every category with icon counts, or, with
category, every icon in that category.
Resources
Clients that read MCP resources can open any icon directly: icon:// (for example icon://), plus icon://about for an overview. Everything is bundled: no network, no API key.
Example: get_icon
{
"tool": "get_icon",
"arguments": {
"name": "delete",
"style": "solid",
"format": "react"
}
}{
"name": "trash",
"requested": "delete",
"title": "Trash",
"category": "actions",
"style": "solid",
"format": "react",
"size": 24,
"code": "import { Trash as TrashSolid } from '@withicons/react/solid'\n\n<TrashSolid />",
"url": "https://withicons.com/icons/trash.html",
"motion": {
"intent": "rocks on its base, then wobbles as it is filled",
"loop": "rock",
"hover": "wiggle",
"alt": [
"shake",
"bounce"
],
"swap": [
"check (morph)",
"trash@solid (scale)"
],
"howTo": "animate_icon(name, trigger: loop|hover|once|inview|swap, format) returns paste-ready code (@withicons/motion)."
}
}The agent skill
A skill is a short instruction file an agent reads before it starts. Ours teaches it how to use with icons well: search by meaning, pick one style per product, use the right package for the framework, add labels for accessibility, and never invent icon names.
Drop the folder into your agent’s skills directory (for Claude Code: .claude/).
Files for language models
No tools? Give your model these files. They’re plain text and JSON, updated with every release.
/llms.txtA short map of the project for language models: what it is, install lines, canonical imports, links./llms-full.txtEverything in one file: every icon with its description, aliases and tags. Paste it into any chat./icons.jsonMachine-readable metadata for all 500 icons: names, categories, aliases, tags, styles.HTTP API
The same tools over plain HTTP GET, handy for scripts, bots and no-code tools. Responses are JSON, the same as the MCP tools return.
| Route | Same as |
|---|---|
/ | search_icons |
/ | get_icon. Add &raw=1 for just the code, or use / for an SVG image. |
/ | resolve_icon |
/api/styles | list_styles |
/api/categories, / | list_categories |
curl "https://withicons.com/api/search?q=throw%20away&limit=2"{
"query": "throw away",
"style": "line",
"count": 2,
"results": [
{
"name": "trash",
"title": "Trash",
"category": "actions",
"score": 119.96,
"reason": "matched related word \"throw away\"",
"match": {
"field": "synonym",
"term": "throw away",
"typo": false,
"kind": "exact"
},
"snippet": "import { Trash } from '@withicons/react'\n\n<Trash />",
"url": "https://withicons.com/icons/trash.html"
},
{
"name": "close",
"title": "Close",
"category": "navigation",
"score": 45.07,
"reason": "matched related word \"go away\"",
"match": {
"field": "synonym",
"term": "go away",
"typo": false,
"kind": "concept"
},
"snippet": "import { Close } from '@withicons/react'\n\n<Close />",
"url": "https://withicons.com/icons/close.html"
}
],
"suggestions": []
}curl "https://withicons.com/api/resolve/expand"{
"status": "ambiguous",
"candidates": [
"chevron-down",
"maximize"
]
}From the terminal
Agents that run shell commands can use the CLI. Add --json for stable, machine-readable output (exit code 0 = found, 1 = not found or ambiguous, 2 = usage error).
npx withicons search "throw away" --json
npx withicons get trash --style solid --format react
npx withicons resolve bin --jsonAll commands and options are on the developer page.
Ask like this
Once the server is connected, just talk normally: