io.github.asr-aditya/iconserve is an MCP server that icons for agentic development: search & fetch 366,000+ open-source icons as SVG/PNG. No API key. Its tool list has not been published yet over http, requires no API key, and scores 47/100 on MCPpedia's security, maintenance and efficiency rubric.
Config is the same across clients - only the file and path differ.
{
"mcpServers": {
"io-github-asr-aditya-iconserve": {
"args": [
"-y",
"npm"
],
"command": "npx"
}
}
}Are you the author?
Add this badge to your README to show your security score and help users find safe servers.
Icons for agentic development: search & fetch 366,000+ open-source icons as SVG/PNG. No API key.
Run this in your terminal to verify the server starts. Then let us know if it worked - your result helps other developers.
npx -y 'npm' 2>&1 | head -1 && echo "✓ Server started successfully"
After testing, let us know if it worked:
Five weighted categories - click any category to see the underlying evidence.
Packing does not respect root-level ignore files in workspaces
### Impact `npm pack` ignores root-level `.gitignore` & `.npmignore` file exclusion directives when run in a workspace or with a workspace flag (ie. `--workspaces`, `--workspace=<name>`). Anyone who has run `npm pack` or `npm publish` with workspaces, as of [v7.9.0](https://github.com/npm/cli/releases/tag/v7.9.0) & [v7.13.0](https://github.com/npm/cli/releases/tag/v7.13.0) respectively, may be affected and have published files into the npm registry they did not intend to include. ### Patch - Up
Incorrect Permission Assignment for Critical Resource in NPM
An issue was discovered in an npm 5.7.0 2018-02-21 pre-release (marked as "next: 5.7.0" and therefore automatically installed by an "npm upgrade -g npm" command, and also announced in the vendor's blog without mention of pre-release status). It might allow local users to bypass intended filesystem access restrictions because ownerships of /etc and /usr directories are being changed unexpectedly, related to a "correctMkdir" issue.
Local Privilege Escalation in npm
Affected versions of `npm` use predictable temporary file names during archive unpacking. If an attacker can create a symbolic link at the location of one of these temporary file names, the attacker can arbitrarily write to any file that the user which owns the `npm` process has permission to write to, potentially resulting in local privilege escalation. ## Recommendation Update to version 1.3.3 or later.
npm CLI exposing sensitive information through logs
Versions of the npm CLI prior to 6.14.6 are vulnerable to an information exposure vulnerability through log files. The CLI supports URLs like `<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>`. The password value is not redacted and is printed to stdout and also to any generated log files.
npm Vulnerable to Global node_modules Binary Overwrite
Versions of the npm CLI prior to 6.13.4 are vulnerable to a Global node_modules Binary Overwrite. It fails to prevent existing globally-installed binaries to be overwritten by other package installations. For example, if a package was installed globally and created a `serve` binary, any subsequent installs of packages that also create a `serve` binary would overwrite the first binary. This will not overwrite system binaries but only binaries put into the global node_modules directory. This b
Be the first to review
Have you used this server?
Share your experience - it helps other developers decide.
Sign in to write a review.
Others in design
Design tokens from any live site: colours, type, spacing, components, drift against a baseline.
Draw and visually collaborate with your agents on tldraw's canvas.
MeiGen-AI-Design-MCP — Turn Claude Code / OpenClaw into your local Lovart. Local ComfyUI, 1,400+ prompt library, multi-direction parallel generation.
Inspect and edit Three.js scenes, materials, shaders, lights in real time from any AI agent
MCP Security Weekly
Get CVE alerts and security updates for io.github.asr-aditya/iconserve and similar servers.
Start a conversation
Ask a question, share a tip, or report an issue.
Sign in to join the discussion.
A free, agent-readable service that aggregates 10,000+ open-source icons — Lucide,
Heroicons, Tabler, and Simple Icons —
and serves them as SVG or PNG at predictable URLs, with keyword + semantic search, an llms.txt, and an MCP server.
Runs entirely within the Cloudflare free tier (Workers + R2 + Workers AI).
| Need | Do this |
|---|---|
| Embed an icon you know the name of | GET /i/{name}.svg (best match) or /icons/{set}/{name}.svg |
| Find the right icon | GET /api/search?q=shopping+cart → names + ready URLs |
| Read the whole API in one shot | GET /llms.txt (or /llms-full.txt) |
| Native tool calls | MCP server at /mcp (search_icons, get_icon, list_sets) |
| OpenAPI | GET /openapi.json |
GET /icon/{set}/{name} — crawlable HTML page per icon (preview, usage, JSON-LD ImageObject + breadcrumb). /icon/{name} 302-redirects to the best match.GET /sitemap.xml — every icon page (~10k URLs).GET /robots.txt — explicitly allows AI crawlers (GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot, Google-Extended, …) and points to the sitemap.WebSite+SearchAction and WebAPI JSON-LD and Open Graph tags./{INDEXNOW_KEY}.txt; npm run indexnow pings Bing/Yandex to crawl new or changed URLs instantly (pass paths to submit a subset, e.g. npm run indexnow /icon/lucide/house).color= hex / CSS color / currentColor — e.g. ?color=%23e11d48size= 1..2048 pxstroke= 0..20 (line icons)style= e.g. solid (Heroicons), filled (Tabler)format= svg | pngExample: /i/shopping-cart.svg?color=crimson&size=48&stroke=1.5
Build (offline, on your machine — no Cloudflare cost)
scripts/ingest.mjs → data/pack/icons.json (id → normalized SVG, currentColor-driven)
data/pack/catalog.json (names, tags, aliases, license, styles)
data/pack/corpus.json (search text per icon)
scripts/embed.mjs → data/pack/embeddings.bin (10k × 384, bge-small-en-v1.5)
data/pack/embed-index.json
Cloudflare
R2 (ICONS) holds the 4 packed artifacts; loaded once per isolate into memory
Workers AI embeds ONLY the query string at search time (same 384-dim model)
Worker routing, color/size/stroke transforms, PNG (resvg-wasm), search, MCP, docs
Assets public/index.html landing page
Semantic search = keyword ranking fused (reciprocal-rank fusion) with cosine similarity over the
in-memory embeddings. No Vectorize, no per-vector billing, no dimension cap. If embeddings.bin is
absent, search gracefully falls back to keyword-only.
npm install
npm run build:data # ingest + embed (embed downloads a ~40MB model once)
npm run upload:r2 # push artifacts into the LOCAL R2 store
npm run dev # http://localhost:8787
In
wrangler dev --localthe Workers AI binding is offline, so search runs keyword-only locally. Semantic search activates once deployed (or when running against the remote AI binding).
wrangler login # one-time, opens a browser
npm run deploy # creates the R2 bucket, uploads artifacts, deploys the Worker
npm run deploy runs scripts/deploy.mjs: it creates the iconserve-icons
bucket (idempotent), uploads the four artifacts to remote R2, then wrangler deploy.
Edit scripts/lib/sets.mjs, then re-run npm run build:data && npm run upload:r2
(local) or npm run deploy (remote). Set priority for /i/{name} best-match is DEFAULT_SET_ORDER in
[`wrang