Search and download icons, illustrations, elements and emojis in PNG or SVG formats.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
API key for authentication
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Export an icon as PNG or SVG. Returns JSON with a short-lived `downloadUrl`, `expiresAt`, `expiresInSeconds`, `mimeType`, and `fileName`. Give the user `downloadUrl` as a clickable link labelled with `fileName`, and tell them it expires in two hours; do not report a failure because you cannot fetch it yourself. Clients that can fetch files may GET `downloadUrl` directly (no API key needed). SVG-only params: `responsive`, `strokeToFill`.
Image size in pixels (square).
Export format: "png" or "svg".
The icon ID (hash). Obtain it from `search_assets` results.
Array of HEX codes or CSS named colors.
SVG only. Scales with container (viewBox, no fixed size).
Thickness of vector paths.
SVG only. Convert strokes to fills (strokeWidth ignored).
Background color (default: transparent).
Export an icon as PNG or SVG. Returns JSON with a short-lived `downloadUrl`, `expiresAt`, `expiresInSeconds`, `mimeType`, and `fileName`. Give the user `downloadUrl` as a clickable link labelled with `fileName`, and tell them it expires in two hours; do not report a failure because you cannot fetch it yourself. Clients that can fetch files may GET `downloadUrl` directly (no API key needed). SVG-only params: `responsive`, `strokeToFill`.
| Argument | Type | Description |
|---|---|---|
| size* | number | Image size in pixels (square). |
| colors | array | Array of HEX codes or CSS named colors. |
| format* | string | Export format: "png" or "svg". |
| iconHash* | string | The icon ID (hash). Obtain it from `search_assets` results. |
| responsive | boolean | SVG only. Scales with container (viewBox, no fixed size). |
| strokeWidth | number | Thickness of vector paths. |
| strokeToFill | boolean | SVG only. Convert strokes to fills (strokeWidth ignored). |
| backgroundColor | string | Background color (default: transparent). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"format",
"iconHash",
"size"
],
"properties": {
"size": {
"type": "number",
"maximum": 4096,
"minimum": 1,
"description": "Image size in pixels (square)."
},
"colors": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "Array of HEX codes or CSS named colors."
},
"format": {
"enum": [
"png",
"svg"
],
"type": "string",
"description": "Export format: \"png\" or \"svg\"."
},
"iconHash": {
"type": "string",
"minLength": 1,
"description": "The icon ID (hash). Obtain it from `search_assets` results."
},
"responsive": {
"type": "boolean",
"default": false,
"description": "SVG only. Scales with container (viewBox, no fixed size)."
},
"strokeWidth": {
"type": "number",
"description": "Thickness of vector paths."
},
"strokeToFill": {
"type": "boolean",
"default": false,
"description": "SVG only. Convert strokes to fills (strokeWidth ignored)."
},
"backgroundColor": {
"type": "string",
"default": "#ffffff00",
"description": "Background color (default: transparent)."
}
},
"additionalProperties": false
}Export multiple icons (up to 50) as PNG or SVG, bundled into one .zip. Returns JSON with a single short-lived `downloadUrl`, `expiresAt`, `expiresInSeconds`, `mimeType` ("application/zip"), `fileName`, and the `iconHashes` it contains. All icons share the same render options. Give the user `downloadUrl` as a clickable link labelled with `fileName`, and tell them it expires in 2 hours; do not report a failure because you cannot fetch it yourself. Clients that can fetch files may GET `downloadUrl` directly (no API key needed) and unzip it. SVG-only params: `responsive`, `strokeToFill`.
| Argument | Type | Description |
|---|---|---|
| size* | number | Image size in pixels (square). |
| colors | array | Array of HEX codes or CSS named colors. |
| format* | string | Export format: "png" or "svg". |
| iconHashes* | array | Icon IDs (hashes) from `search_assets` results, one per array element (max 50). |
| responsive | boolean | SVG only. Scales with container (viewBox, no fixed size). |
| strokeWidth | number | Thickness of vector paths. |
| strokeToFill |
Case-insensitive substring match on stored Set names (minimum 3 characters). Use for exact or partial name lookup when the user types a name string. For semantic / intent-based discovery, use `search_sets` instead — these do different things and must not be confused.
| Argument | Type | Description |
|---|---|---|
| name* | string | Search string to match against Set names (case-insensitive). Must be at least 3 characters. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"minLength": 3,
"description": "Search string to match against Set names (case-insensitive). Must be at least 3 characters."
}
},
"additionalProperties": false
}Returns all available Families. Each entry includes the Family hash and slug needed for other tools. Use this to present the full catalog or when the user wants to browse all available Families.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Returns all Sets belonging to a specific Family. Paginated with offset (default 0) and limit (default 100, max 100). Call this after choosing a Family with `search_families` and before recommending it: it is what surfaces the Family's actual Sets to the user, and recommending a visual style they cannot see is a failed answer however good the prose. Also use it to list a Family's Sets when the user is browsing with no query to match — reach for `search_sets` when there is one. Pass the Family `familyHash` from get_all_families (`hash` on each row) or from find_sets_by_name (`familyHash`) when available.
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of Sets to return (default: 100, max: 100). |
| offset | number | Number of items to skip before returning results (default: 0). |
| familyHash | string | The hash of the Family (top-level bundle). Legacy alternative to `familySlug`; use `familyHash` from find_sets_by_name when that is all you have. |
| familySlug | string | The slug of the Family (top-level bundle). Preferred over `familyHash`. Use `slug` from `search_families` or `get_all_families`. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "number",
"default": 100,
"maximum": 100,
"minimum": 1,
"description": "Maximum number of Sets to return (default: 100, max: 100)."
},
"offset": {
"type": "number",
"default": 0,
"minimum": 0,
"description": "Number of items to skip before returning results (default: 0)."
},
"familyHash": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The hash of the Family (top-level bundle). Legacy alternative to `familySlug`; use `familyHash` from find_sets_by_name when that is all you have."
},
"familySlug": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The slug of the Family (top-level bundle). Preferred over `familyHash`. Use `slug` from `search_families` or `get_all_families`."
}
},
"additionalProperties": false
}Export up to a dozen assets and return them base64-encoded for the app.
| Argument | Type | Description |
|---|---|---|
| size | number | |
| format* | string | |
| iconHashes* | array |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"iconHashes",
"format"
],
"properties": {
"size": {
"type": "number",
"maximum": 4096,
"minimum": 1
},
"format": {
"enum": [
"png",
"svg"
],
"type": "string"
},
"iconHashes": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 12,
"minItems": 1
}
},
"additionalProperties": false
}Returns full semantic text for a family (bundle) in four sections: fit & recommendations, brand & cultural identity, visual & technical specs, and pairing & compatibility. Also returns the family license. Use when you need richer metadata to choose between family groups after `search_families` or `get_all_families` or when comparing multiple families. Pass the exact familySlug from those results; do not invent slugs.
| Argument | Type | Description |
|---|---|---|
| familySlug* | string | slug of the family from `search_families` or `get_all_families`. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"familySlug"
],
"properties": {
"familySlug": {
"type": "string",
"minLength": 1,
"description": "slug of the family from `search_families` or `get_all_families`."
}
},
"additionalProperties": false
}Retrieves detailed information about an icon (Set, variants, preview URLs, tags). Use this when you need full icon metadata before downloading. Obtain the iconHash from `search_assets` results.
| Argument | Type | Description |
|---|---|---|
| iconHash* | string | The icon ID (hash). Obtain it from `search_assets` results. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"iconHash"
],
"properties": {
"iconHash": {
"type": "string",
"minLength": 1,
"description": "The icon ID (hash). Obtain it from `search_assets` results."
}
},
"additionalProperties": false
}Returns userContext (signed-in email and Streamline plan) and llmInstructions (how to present catalog results for this user). Call this before searching or recommending assets.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Search icons, illustrations, or elements. With a non-empty `setSlug`, search within that Set. Else with a non-empty `familySlug`, search within that Family (bundle). Otherwise global search — requires `productType`. Answer from results, never from memory: asset names, slugs and hashes cannot be recalled, so any icon you name without calling this tool is invented. For a multi-icon request ("save, edit, delete, user"), return every requested icon from ONE Family so the group reads as a system; if one is missing there, take the closest match inside that Family rather than mixing Families. Line suits default and inactive states, Solid or Bold active ones. Commit to a count rather than padding: 1–5 icons for a specific concept, up to 10 when the user is exploring. When the user names specific assets ("House 3, Hyperloop"), pass them all as a comma-separated `query` with `exactNames: true` and the `setSlug` or `familySlug` they belong to, in one call; set `limit` to cover every match, since one name can match several assets.
| Argument | Type | Description |
|---|---|---|
| limit | number | Specifies the maximum number of items to return in the response (default: 20, max: 100). |
| query* | string | Search term. Translate abstract concepts into concrete visual nouns when searching globally. NEVER mix different concepts in the same query. At most 100 characters, or 2000 with `exactNames`. |
| style | string | Filter for the style of the Sets. Global search only; applies when `productType` is "icons". |
| offset | number | Specifies the number of items to skip before starting to return results (default: 0). |
Fetch another page of asset results for the app.
| Argument | Type | Description |
|---|---|---|
| limit | number | |
| query* | string | |
| offset | number | |
| setSlug | string | |
| familySlug | string | |
| productType | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"limit": {
"type": "number",
"default": 24,
"maximum": 100
},
"query": {
"type": "string"
},
"offset": {
"type": "number",
"default": 0,
"minimum": 0
},
"setSlug": {
"type": "string"
},
"familySlug": {
"type": "string"
},
"productType": {
"enum": [
"icons",
"illustrations",
"elements"
],
"type": "string"
}
},
"additionalProperties": false
}Choose a Family (bundle) for any "which icons should I use" ask: pairing icons with a font or typeface, matching a visual style, tone or brand, or picking between packs. Users say "icon set", "pack" or "bundle" for what this catalog calls a Family — when the level is ambiguous, start here. Answer from results, never from memory: the catalog changes and Family names and slugs cannot be recalled, so a Family you name without calling this tool is invented. Semantic search by meaning (hybrid text + embeddings over family metadata); the Family-level counterpart to `search_sets` — use this to choose a Family, then `search_sets` to pick a Set within it. Preserve natural-language intent in `query`: full sentences and questions work well, including negatives (e.g. "which families should I avoid …"). Do not collapse into comma-separated keyword stacks unless the user only spoke in keywords — that often drops task context the rankers rely on. Do not elaborate or add preferences (tone, UI goals, style lists) that are not in the user message. For exclusion-style questions, do not stuff inferred positive aesthetic keywords into `query`; emphasize traits the user said to avoid over positives you invented.
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of Families to return (default: 2, max: 10). |
| query* | string | Plain-language user intent. Prefer their full question or sentence (use case, audience, tone, exclusions). Keep negatives and framing (e.g. "Which families should I avoid for a B2B SaaS product?"). Do not rewrite into stacked adjectives or keyword soup (e.g. "B2B SaaS professional clean corporate") unless that is literally what they said. Bad: appending invented clauses like "I want a professional, trustworthy, minimal corporate UI—avoid playful…" when they only asked what to avoid. Good: pass their words as-is; add traits only if the user stated them. For avoid-style asks, keep user-mentioned risky or excluded aesthetics prominent; do not invent excluded traits. |
Semantic search for Sets by natural-language query: discovers Sets by meaning, not by substring on the stored name. Optionally scoped with `familySlug` to narrow results to a specific Family. For substring / partial name match on stored names, use `find_sets_by_name` instead — these do different things and must not be confused. Use `get_all_sets_from_family` when you already know the Family and want the full list with no search intent.
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of Sets to return (default: 20, max: 100). |
| query* | string | Natural-language search term to find Sets. Preserve full intent (questions, negatives); do not compress into comma-separated keyword stacks unless the user only gave keywords. Do not append tastes or UI goals the user did not say. For avoid / steer-clear asks, keep the traits the user rejected central rather than padding with positives you inferred. |
| familySlug | string | When set, only return Sets belonging to this Family. Use the Family slug from `search_families` (`familySlug`) or `get_all_families` (`slug`). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"limit": {
"type": "number",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Maximum number of Sets to return (default: 20, max: 100)."
},
"query": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Natural-language search term to find Sets. Preserve full intent (questions, negatives); do not compress into comma-separated keyword stacks unless the user only gave keywords. Do not append tastes or UI goals the user did not say. For avoid / steer-clear asks, keep the traits the user rejected central rather than padding with positives you inferred."
},
"familySlug": {
"type": "string",
"minLength": 1,
"description": "When set, only return Sets belonging to this Family. Use the Family slug from `search_families` (`familySlug`) or `get_all_families` (`slug`)."
}
},
"additionalProperties": false
}| boolean |
| SVG only. Convert strokes to fills (strokeWidth ignored). |
| backgroundColor | string | Background color (default: transparent). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"format",
"iconHashes",
"size"
],
"properties": {
"size": {
"type": "number",
"maximum": 4096,
"minimum": 1,
"description": "Image size in pixels (square)."
},
"colors": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "Array of HEX codes or CSS named colors."
},
"format": {
"enum": [
"png",
"svg"
],
"type": "string",
"description": "Export format: \"png\" or \"svg\"."
},
"iconHashes": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"maxItems": 50,
"minItems": 1,
"description": "Icon IDs (hashes) from `search_assets` results, one per array element (max 50)."
},
"responsive": {
"type": "boolean",
"default": false,
"description": "SVG only. Scales with container (viewBox, no fixed size)."
},
"strokeWidth": {
"type": "number",
"description": "Thickness of vector paths."
},
"strokeToFill": {
"type": "boolean",
"default": false,
"description": "SVG only. Convert strokes to fills (strokeWidth ignored)."
},
"backgroundColor": {
"type": "string",
"default": "#ffffff00",
"description": "Background color (default: transparent)."
}
},
"additionalProperties": false
}| setSlug | string | Set slug from `search_sets`, `find_sets_by_name`, or `get_all_sets_from_family`. When set (non-empty), search is scoped to this Set (takes precedence over `familySlug`). |
| language | string | Optional source language of `query`. Options: `en` (English), `fr` (French), `de` (German), `es` (Spanish Spain), `es-MX` (Spanish Latin America), `pt` (Portuguese Brazil). |
| exactNames | boolean | When true, `query` is a comma-separated list of exact asset names (e.g. "House 3, Hyperloop"), matched case-insensitively, up to 50 names. Requires `setSlug` or `familySlug`. Use when the user names specific assets. |
| familySlug | string | Family (bundle) slug from `search_families` or `get_all_families`. When set (non-empty) and `setSlug` is omitted, search is scoped to this Family. |
| productTier | string | Filter for the price tier of the products. Used for global search and Family (bundle) search. E.g., if "free", results will only be from free Sets. |
| productType | string | Required for global search only (when both `setSlug` and `familySlug` are omitted). Asset type: icons, illustrations, or elements. |
| userContext* | string | User context from the "get user profile" tool (`get_user_context`). Always call that tool first if you do not have userContext yet. Do not guess. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"userContext",
"query"
],
"properties": {
"limit": {
"type": "number",
"default": 20,
"maximum": 100,
"description": "Specifies the maximum number of items to return in the response (default: 20, max: 100)."
},
"query": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "Search term. Translate abstract concepts into concrete visual nouns when searching globally. NEVER mix different concepts in the same query. At most 100 characters, or 2000 with `exactNames`."
},
"style": {
"enum": [
"line",
"solid",
"flat",
"duo",
"hand-drawn",
"creative",
"gradient",
"remix",
"neon",
"pop",
"light",
"glyph",
"minimal",
"outlined",
"geometric",
"bold",
"stroke",
"wireframe",
"filled"
],
"type": "string",
"description": "Filter for the style of the Sets. Global search only; applies when `productType` is \"icons\"."
},
"offset": {
"type": "number",
"default": 0,
"minimum": 0,
"description": "Specifies the number of items to skip before starting to return results (default: 0)."
},
"setSlug": {
"type": "string",
"description": "Set slug from `search_sets`, `find_sets_by_name`, or `get_all_sets_from_family`. When set (non-empty), search is scoped to this Set (takes precedence over `familySlug`)."
},
"language": {
"enum": [
"en",
"fr",
"de",
"es",
"es-MX",
"pt",
"pt-PT",
"hi",
"ko",
"ja"
],
"type": "string",
"description": "Optional source language of `query`. Options: `en` (English), `fr` (French), `de` (German), `es` (Spanish Spain), `es-MX` (Spanish Latin America), `pt` (Portuguese Brazil)."
},
"exactNames": {
"type": "boolean",
"default": false,
"description": "When true, `query` is a comma-separated list of exact asset names (e.g. \"House 3, Hyperloop\"), matched case-insensitively, up to 50 names. Requires `setSlug` or `familySlug`. Use when the user names specific assets."
},
"familySlug": {
"type": "string",
"description": "Family (bundle) slug from `search_families` or `get_all_families`. When set (non-empty) and `setSlug` is omitted, search is scoped to this Family."
},
"productTier": {
"enum": [
"all",
"free",
"premium"
],
"type": "string",
"default": "all",
"description": "Filter for the price tier of the products. Used for global search and Family (bundle) search. E.g., if \"free\", results will only be from free Sets."
},
"productType": {
"enum": [
"icons",
"illustrations",
"elements"
],
"type": "string",
"description": "Required for global search only (when both `setSlug` and `familySlug` are omitted). Asset type: icons, illustrations, or elements."
},
"userContext": {
"type": "string",
"minLength": 1,
"description": "User context from the \"get user profile\" tool (`get_user_context`). Always call that tool first if you do not have userContext yet. Do not guess."
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"limit": {
"type": "number",
"default": 2,
"maximum": 10,
"minimum": 1,
"description": "Maximum number of Families to return (default: 2, max: 10)."
},
"query": {
"type": "string",
"minLength": 1,
"description": "Plain-language user intent. Prefer their full question or sentence (use case, audience, tone, exclusions). Keep negatives and framing (e.g. \"Which families should I avoid for a B2B SaaS product?\"). Do not rewrite into stacked adjectives or keyword soup (e.g. \"B2B SaaS professional clean corporate\") unless that is literally what they said. Bad: appending invented clauses like \"I want a professional, trustworthy, minimal corporate UI—avoid playful…\" when they only asked what to avoid. Good: pass their words as-is; add traits only if the user stated them. For avoid-style asks, keep user-mentioned risky or excluded aesthetics prominent; do not invent excluded traits."
}
},
"additionalProperties": false
}