iconoteka-mcp
MCP server for Iconoteka β let an AI assistant
search 1,300 icons and hand back paste-ready SVG.
Ask for "a notification bell, medium weight" and the assistant returns the real
icon, rather than inventing a path or reaching for whatever library it happens
to remember.
Setup
Each client stores MCP servers in its own format, so use the entry for yours.
Claude Code
claude mcp add --scope user iconoteka -- npx -y iconoteka-mcp
Codex
codex mcp add iconoteka -- npx -y iconoteka-mcp
Or in ~/.codex/config.toml:
[mcp_servers.iconoteka]
command = "npx"
args = ["-y", "iconoteka-mcp"]
VS Code (GitHub Copilot)
code --add-mcp '{"name":"iconoteka","command":"npx","args":["-y","iconoteka-mcp"]}'
Or per workspace in .vscode/mcp.json β note the key is servers:
{
"servers": {
"iconoteka": {
"command": "npx",
"args": ["-y", "iconoteka-mcp"]
}
}
}
Cursor, Claude Desktop, Windsurf and Gemini CLI share one shape, each in
its own file:
| Client | File |
|---|
| Cursor | ~/.cursor/mcp.json, or .cursor/mcp.json in a project |
| Claude Desktop | ~/Library/Application Support/Claude/claude_desktop_config.json (macOS), %APPDATA%\Claude\claude_desktop_config.json (Windows) |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Gemini CLI | ~/.gemini/settings.json, or .gemini/settings.json in a project |
{
"mcpServers": {
"iconoteka": {
"command": "npx",
"args": ["-y", "iconoteka-mcp"]
}
}
}
Zed β in settings.json, under context_servers:
{
"context_servers": {
"iconoteka": {
"command": "npx",
"args": ["-y", "iconoteka-mcp"],
"env": {}
}
}
}
It runs offline: the icon data ships inside the package.
search_icons β find icons by meaning or name. Returns ranked matches with
the weights and styles each one has, plus its other keywords.
search_icons({ query: "notification bell" })
β bell [Interface] β
popular score 949
variants: 7 weights, fill varies by weight
also matches: notification, notify, reminder, ring, sound
Optional category and limit.
get_icon β SVG markup for one icon, or for several in a single call.
get_icon({ name: "bell", weight: "medium", style: "fill" })
β bell β medium fill β Interface
<svg width="24" height="24" viewBox="0 0 24 24" β¦>
<path d="M12 22.25C10.375β¦" fill="currentColor"/>
</svg>
Pass an array to fetch up to 24 icons at once, so a whole toolbar takes one
request:
get_icon({ name: ["bell", "trash", "pen"] })
β one block per icon, separated by ---
weight is thin ultralight light regular medium semibold bold
(default regular); style is stroke or fill (default stroke). The path
uses currentColor, so it inherits the surrounding text colour.
name takes an icon's own name or the word people reach for: trash, edit
and settings each resolve to the right icon.
Most icons have all 14 variants; some have 7 or 8. Ask for one that doesn't
exist and the server says what to use instead β for example, "download" has no fill; it is a stroke-only icon. Use style "stroke".
list_categories β all 23 categories with icon counts.
Support
Iconoteka is a free, open-source library created and maintained by one person.
Support its future development through a monthly
Patreon subscription or a one-time
Ko-fi donation.
License
MIT β both this server and the icons. Free for personal and commercial use,
including closed-source. No attribution required.
The Iconoteka name and logo are not covered by the MIT grant.