@solar-icons/mcp 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,11 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Hakim Saoudi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ The Software may include icons that are licensed under the Creative Commons Attribution 4.0 International License (CC BY 4.0). Commercial use is allowed, but attribution is required for the use of these icons. See LICENSE-THIRD-PARTY for more details.
10
+
11
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,14 @@
1
+ THIRD-PARTY LICENSES
2
+
3
+ This project includes icons that are licensed under the Creative Commons Attribution 4.0 International License (CC BY 4.0).
4
+
5
+ Attribution Requirement:
6
+ You are allowed to use these icons for commercial and non-commercial purposes, but you must give appropriate credit as required by the CC BY 4.0 license.
7
+
8
+ For more details, please visit: https://creativecommons.org/licenses/by/4.0/
9
+
10
+ List of Third-Party Elements:
11
+ - **Solar Icons Set** By [480 Design](https://www.figma.com/community/file/1166831539721848736)
12
+
13
+ Attribution Instructions:
14
+ When using the icons, please attribute the original authors in a visible way according to the terms of the CC BY 4.0 license.
package/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # @solar-icons/mcp
2
+
3
+ MCP server for Solar Icons — 1,268 icons × 6 styles. Exposes `solar_*` tools for search, get, list, info and overview via the Model Context Protocol.
4
+
5
+ ## Install
6
+
7
+ ```json
8
+ // .vscode/mcp.json, claude_desktop_config.json, etc.
9
+ {
10
+ "mcpServers": {
11
+ "solar-icons": {
12
+ "command": "npx",
13
+ "args": ["-y", "@solar-icons/mcp"]
14
+ }
15
+ }
16
+ }
17
+ ```
18
+
19
+ Or with local stdio:
20
+
21
+ ```bash
22
+ npx -y @solar-icons/mcp
23
+ ```
24
+
25
+ ## Tools
26
+
27
+ | Tool | Description |
28
+ | ----------------------- | ------------------------------------------------ |
29
+ | `solar_search_icons` | Search by name/tags/category |
30
+ | `solar_get_icon` | Get import snippet + CDN + SVG for one icon |
31
+ | `solar_list_icons` | List icons (by category) |
32
+ | `solar_info_icon` | Show metadata + all import paths for one icon |
33
+ | `solar_overview` | Global overview — catalog, packages, Figma, docs |
34
+ | `solar_list_categories` | List 37 categories |
35
+ | `solar_list_styles` | List 6 styles + provider tokens |
36
+
37
+ All tools use `@solar-icons/static` as source of truth (offline, no network required beyond `npx` install). For programmatic use, prefer `--json` via the CLI (`npx @solar-icons/cli search --json`).
38
+
39
+ ## Development
40
+
41
+ ```bash
42
+ pnpm --filter @solar-icons/mcp build
43
+ pnpm --filter @solar-icons/mcp start # stdio
44
+ npx @modelcontextprotocol/inspector npx -y @solar-icons/mcp # inspector
45
+ ```
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Solar Icons MCP Server
4
+ *
5
+ * Exposes solar_* tools via Model Context Protocol (stdio).
6
+ * Source of truth is @solar-icons/static (via @solar-icons/cli), no network.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
package/dist/index.js ADDED
@@ -0,0 +1,521 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Solar Icons MCP Server
4
+ *
5
+ * Exposes solar_* tools via Model Context Protocol (stdio).
6
+ * Source of truth is @solar-icons/static (via @solar-icons/cli), no network.
7
+ */
8
+ import { readFileSync, existsSync } from 'node:fs';
9
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
10
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
11
+ import { getOverview, importSnippet, listCategories, loadDescriptions, resolveSvgPath, rootImportSnippet, searchCatalog, STYLES, cdnSvgUrl, } from '@solar-icons/cli';
12
+ import { z } from 'zod';
13
+ // ---------------------------------------------------------------------------
14
+ // Helpers
15
+ // ---------------------------------------------------------------------------
16
+ const CHARACTER_LIMIT = 25000;
17
+ function truncate(text) {
18
+ if (text.length <= CHARACTER_LIMIT)
19
+ return { text, truncated: false };
20
+ const half = Math.floor(CHARACTER_LIMIT / 2);
21
+ return {
22
+ text: `${text.slice(0, half)}\n\n… truncated from ${text.length} to ${half} chars. Use limit/offset to paginate.`,
23
+ truncated: true,
24
+ };
25
+ }
26
+ function toFrameworkList() {
27
+ return 'react|vue|svelte|solid|angular|react-native|nuxt|static|js';
28
+ }
29
+ // ---------------------------------------------------------------------------
30
+ // Server
31
+ // ---------------------------------------------------------------------------
32
+ const server = new McpServer({
33
+ name: 'solar-icons-mcp-server',
34
+ version: '1.0.0',
35
+ });
36
+ // ---------------------------------------------------------------------------
37
+ // solar_search_icons
38
+ // ---------------------------------------------------------------------------
39
+ server.registerTool('solar_search_icons', {
40
+ title: 'Search Solar Icons',
41
+ description: `Search Solar Icons by name, tags or category. Use when the user asks for an icon, needs a replacement for Lucide/Phosphor/Tabler, or wants to browse the catalog.
42
+
43
+ Args:
44
+ - query (string): search terms, e.g. "home", "shopping cart", "arrow up"
45
+ - limit (number): max results 1..100 (default 20)
46
+ - style (string): optional style filter: ${STYLES.join('|')}
47
+ - category (string): optional category filter (see solar_list_categories)
48
+ - framework (string): optional framework to include import snippet (${toFrameworkList()})
49
+
50
+ Returns: { total, count, query, results: [{ name, category, tags, import? }] } + markdown
51
+ `,
52
+ inputSchema: {
53
+ query: z
54
+ .string()
55
+ .min(1)
56
+ .max(200)
57
+ .describe('Search terms, e.g. "home" or "shopping cart"'),
58
+ limit: z.number().int().min(1).max(100).default(20).describe('Max results 1..100'),
59
+ style: z
60
+ .enum([...STYLES])
61
+ .optional()
62
+ .describe('Style filter'),
63
+ category: z.string().optional().describe('Category filter'),
64
+ framework: z
65
+ .enum([
66
+ 'react',
67
+ 'vue',
68
+ 'svelte',
69
+ 'solid',
70
+ 'angular',
71
+ 'react-native',
72
+ 'nuxt',
73
+ 'static',
74
+ 'js',
75
+ ])
76
+ .optional()
77
+ .describe('Framework for import snippet'),
78
+ },
79
+ annotations: {
80
+ readOnlyHint: true,
81
+ destructiveHint: false,
82
+ idempotentHint: true,
83
+ openWorldHint: false,
84
+ },
85
+ }, async ({ query, limit = 20, style, category, framework }) => {
86
+ try {
87
+ const descs = loadDescriptions();
88
+ const results = searchCatalog(descs, {
89
+ query,
90
+ limit,
91
+ style: style,
92
+ category,
93
+ });
94
+ const mapped = results.map(r => ({
95
+ name: r.name,
96
+ category: r.category,
97
+ tags: r.tags.slice(0, 6),
98
+ ...(framework
99
+ ? {
100
+ import: importSnippet(r.name, style ?? 'linear', framework),
101
+ }
102
+ : {}),
103
+ }));
104
+ const structured = {
105
+ total: mapped.length,
106
+ count: mapped.length,
107
+ query,
108
+ results: mapped,
109
+ has_more: false,
110
+ };
111
+ const lines = [`# Search: "${query}" — ${mapped.length} result(s)`, ''];
112
+ for (const r of mapped) {
113
+ lines.push(`- **${r.name}** — ${r.category} — ${r.tags.join(', ')}${r.import ? ` → ${r.import}` : ''}`);
114
+ }
115
+ const text = lines.join('\n');
116
+ const { text: truncated } = truncate(text);
117
+ return {
118
+ content: [{ type: 'text', text: truncated }],
119
+ structuredContent: structured,
120
+ };
121
+ }
122
+ catch (e) {
123
+ return {
124
+ isError: true,
125
+ content: [
126
+ { type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` },
127
+ ],
128
+ };
129
+ }
130
+ });
131
+ // ---------------------------------------------------------------------------
132
+ // solar_get_icon
133
+ // ---------------------------------------------------------------------------
134
+ server.registerTool('solar_get_icon', {
135
+ title: 'Get Solar Icon',
136
+ description: `Get import snippet, CDN URL and SVG for a single Solar icon. Use when the user picked an icon name and you need the exact import for their framework.
137
+
138
+ Args:
139
+ - name (string): kebab icon name, e.g. "home", "arrow-up"
140
+ - style (string): style, default linear: ${STYLES.join('|')}
141
+ - framework (string): framework for snippet, default react: ${toFrameworkList()}
142
+
143
+ Returns: { name, style, framework, category, import, cdn, svg } + markdown
144
+ `,
145
+ inputSchema: {
146
+ name: z.string().min(1).describe('Kebab icon name, e.g. "home"'),
147
+ style: z
148
+ .enum([...STYLES])
149
+ .default('linear')
150
+ .describe('Style'),
151
+ framework: z
152
+ .enum([
153
+ 'react',
154
+ 'vue',
155
+ 'svelte',
156
+ 'solid',
157
+ 'angular',
158
+ 'react-native',
159
+ 'nuxt',
160
+ 'static',
161
+ 'js',
162
+ ])
163
+ .default('react')
164
+ .describe('Framework for snippet'),
165
+ },
166
+ annotations: {
167
+ readOnlyHint: true,
168
+ destructiveHint: false,
169
+ idempotentHint: true,
170
+ openWorldHint: false,
171
+ },
172
+ }, async ({ name, style = 'linear', framework = 'react' }) => {
173
+ try {
174
+ const descs = loadDescriptions();
175
+ const entry = descs.find(d => d.name === name);
176
+ if (!entry) {
177
+ return {
178
+ isError: true,
179
+ content: [
180
+ {
181
+ type: 'text',
182
+ text: `Icon '${name}' not found. Try solar_search_icons with query "${name}"`,
183
+ },
184
+ ],
185
+ };
186
+ }
187
+ const snippet = importSnippet(name, style, framework);
188
+ const cdn = cdnSvgUrl(name, style);
189
+ const svgPath = resolveSvgPath(name, style);
190
+ let svg;
191
+ if (svgPath && existsSync(svgPath)) {
192
+ try {
193
+ svg = readFileSync(svgPath, 'utf8');
194
+ }
195
+ catch { }
196
+ }
197
+ const structured = {
198
+ name,
199
+ style,
200
+ framework,
201
+ category: entry.category,
202
+ tags: entry.tags,
203
+ import: snippet,
204
+ cdn,
205
+ svgPath: svgPath ?? null,
206
+ svg,
207
+ };
208
+ const lines = [
209
+ `# ${name} — ${style} — ${framework}`,
210
+ '',
211
+ `\`\`\`ts\n${snippet}\n\`\`\``,
212
+ '',
213
+ `- Category: ${entry.category}`,
214
+ `- CDN: ${cdn}`,
215
+ ];
216
+ if (svg)
217
+ lines.push('', '```svg', svg.slice(0, 800) + (svg.length > 800 ? '…' : ''), '```');
218
+ const text = lines.join('\n');
219
+ const { text: truncated } = truncate(text);
220
+ return {
221
+ content: [{ type: 'text', text: truncated }],
222
+ structuredContent: structured,
223
+ };
224
+ }
225
+ catch (e) {
226
+ return {
227
+ isError: true,
228
+ content: [
229
+ { type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` },
230
+ ],
231
+ };
232
+ }
233
+ });
234
+ // ---------------------------------------------------------------------------
235
+ // solar_list_icons
236
+ // ---------------------------------------------------------------------------
237
+ server.registerTool('solar_list_icons', {
238
+ title: 'List Solar Icons',
239
+ description: `List Solar icons, optionally filtered by category. Use to browse the catalog.
240
+
241
+ Args:
242
+ - category (string): optional category (see solar_list_categories)
243
+ - limit (number): max results 1..200 (default 50)
244
+ - offset (number): pagination offset (default 0)
245
+
246
+ Returns: { total, count, offset, icons: [{ name, category }] } + markdown
247
+ `,
248
+ inputSchema: {
249
+ category: z.string().optional().describe('Category filter'),
250
+ limit: z.number().int().min(1).max(200).default(50).describe('Max results'),
251
+ offset: z.number().int().min(0).default(0).describe('Offset for pagination'),
252
+ },
253
+ annotations: {
254
+ readOnlyHint: true,
255
+ destructiveHint: false,
256
+ idempotentHint: true,
257
+ openWorldHint: false,
258
+ },
259
+ }, async ({ category, limit = 50, offset = 0 }) => {
260
+ try {
261
+ const descs = loadDescriptions();
262
+ const filtered = category ? descs.filter(d => d.category === category) : descs;
263
+ const total = filtered.length;
264
+ const slice = filtered.slice(offset, offset + limit);
265
+ const structured = {
266
+ total,
267
+ count: slice.length,
268
+ offset,
269
+ has_more: offset + slice.length < total,
270
+ ...(offset + slice.length < total ? { next_offset: offset + slice.length } : {}),
271
+ icons: slice.map(d => ({ name: d.name, category: d.category })),
272
+ };
273
+ const lines = [
274
+ `# List — ${category ?? 'all'} — ${total} icons (showing ${slice.length} from ${offset})`,
275
+ '',
276
+ ];
277
+ for (const d of slice)
278
+ lines.push(`- ${d.name} — ${d.category}`);
279
+ if (structured.has_more)
280
+ lines.push('', `Has more — next offset ${structured.next_offset}`);
281
+ const text = lines.join('\n');
282
+ const { text: truncated } = truncate(text);
283
+ return {
284
+ content: [{ type: 'text', text: truncated }],
285
+ structuredContent: structured,
286
+ };
287
+ }
288
+ catch (e) {
289
+ return {
290
+ isError: true,
291
+ content: [
292
+ { type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` },
293
+ ],
294
+ };
295
+ }
296
+ });
297
+ // ---------------------------------------------------------------------------
298
+ // solar_info_icon
299
+ // ---------------------------------------------------------------------------
300
+ server.registerTool('solar_info_icon', {
301
+ title: 'Info Solar Icon',
302
+ description: `Show metadata and all import paths for one icon. Use when the user wants to see every style/framework variant for an icon.
303
+
304
+ Args:
305
+ - name (string): kebab icon name
306
+
307
+ Returns: { name, category, tags, styles, imports, rootImports, svg } + markdown
308
+ `,
309
+ inputSchema: {
310
+ name: z.string().min(1).describe('Kebab icon name'),
311
+ },
312
+ annotations: {
313
+ readOnlyHint: true,
314
+ destructiveHint: false,
315
+ idempotentHint: true,
316
+ openWorldHint: false,
317
+ },
318
+ }, async ({ name }) => {
319
+ try {
320
+ const descs = loadDescriptions();
321
+ const entry = descs.find(d => d.name === name);
322
+ if (!entry) {
323
+ return {
324
+ isError: true,
325
+ content: [{ type: 'text', text: `Icon '${name}' not found` }],
326
+ };
327
+ }
328
+ const styles = [...STYLES];
329
+ const imports = {};
330
+ for (const fw of [
331
+ 'react',
332
+ 'vue',
333
+ 'svelte',
334
+ 'solid',
335
+ 'angular',
336
+ 'react-native',
337
+ 'nuxt',
338
+ 'static',
339
+ 'js',
340
+ ]) {
341
+ imports[fw] = importSnippet(name, 'linear', fw);
342
+ }
343
+ const rootImports = {};
344
+ for (const s of styles)
345
+ rootImports[s] = rootImportSnippet(name, s, 'react');
346
+ const svg = {};
347
+ for (const s of styles)
348
+ svg[s] = resolveSvgPath(name, s) ?? cdnSvgUrl(name, s);
349
+ const structured = {
350
+ name: entry.name,
351
+ category: entry.category,
352
+ tags: entry.tags,
353
+ categoryTags: entry.categoryTags,
354
+ styles,
355
+ imports,
356
+ rootImports,
357
+ svg,
358
+ };
359
+ const lines = [
360
+ `# ${entry.name} — ${entry.category}`,
361
+ '',
362
+ `Tags: ${entry.tags.join(', ')}`,
363
+ `CategoryTags: ${entry.categoryTags.join(', ')}`,
364
+ '',
365
+ `Available styles: ${styles.join(' · ')}`,
366
+ '',
367
+ '## Imports (linear example, per-file)',
368
+ ];
369
+ for (const [fw, snippet] of Object.entries(imports))
370
+ lines.push(`- ${fw}: \`${snippet}\``);
371
+ lines.push('', '## All styles (react, root — style in name)');
372
+ for (const [s, snippet] of Object.entries(rootImports))
373
+ lines.push(`- ${s}: \`${snippet}\``);
374
+ const text = lines.join('\n');
375
+ const { text: truncated } = truncate(text);
376
+ return {
377
+ content: [{ type: 'text', text: truncated }],
378
+ structuredContent: structured,
379
+ };
380
+ }
381
+ catch (e) {
382
+ return {
383
+ isError: true,
384
+ content: [
385
+ { type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` },
386
+ ],
387
+ };
388
+ }
389
+ });
390
+ // ---------------------------------------------------------------------------
391
+ // solar_overview
392
+ // ---------------------------------------------------------------------------
393
+ server.registerTool('solar_overview', {
394
+ title: 'Solar Overview',
395
+ description: `Global overview — catalog counts, packages, Figma plugin and docs. Use to answer "how many icons?" or "what packages exist?".
396
+
397
+ Returns: { catalog: { icons, categories, styles, variations }, packages, cliVersion, figma, docs, iconsExplorer } + markdown
398
+ `,
399
+ inputSchema: {},
400
+ annotations: {
401
+ readOnlyHint: true,
402
+ destructiveHint: false,
403
+ idempotentHint: true,
404
+ openWorldHint: false,
405
+ },
406
+ }, async () => {
407
+ try {
408
+ const o = getOverview();
409
+ const structured = o;
410
+ const lines = [
411
+ '# Solar Icons',
412
+ '',
413
+ `${o.catalog.icons} icons × ${o.catalog.styles} styles = ${o.catalog.variations} variations — ${o.catalog.categories} categories`,
414
+ '',
415
+ `Packages (${o.packages.length}):`,
416
+ ...o.packages.map(p => `- ${p.name} v${p.version} — ${p.description}`),
417
+ '',
418
+ `Figma: ${o.figma}`,
419
+ `Docs: ${o.docs}`,
420
+ `Icons: ${o.iconsExplorer}`,
421
+ `CLI: ${o.cliVersion}`,
422
+ ];
423
+ const text = lines.join('\n');
424
+ const { text: truncated } = truncate(text);
425
+ return {
426
+ content: [{ type: 'text', text: truncated }],
427
+ structuredContent: structured,
428
+ };
429
+ }
430
+ catch (e) {
431
+ return {
432
+ isError: true,
433
+ content: [
434
+ { type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` },
435
+ ],
436
+ };
437
+ }
438
+ });
439
+ // ---------------------------------------------------------------------------
440
+ // solar_list_categories / solar_list_styles
441
+ // ---------------------------------------------------------------------------
442
+ server.registerTool('solar_list_categories', {
443
+ title: 'List Categories',
444
+ description: `List all 37 categories. Use to discover category values for search/list filters.`,
445
+ inputSchema: {},
446
+ annotations: {
447
+ readOnlyHint: true,
448
+ destructiveHint: false,
449
+ idempotentHint: true,
450
+ openWorldHint: false,
451
+ },
452
+ }, async () => {
453
+ try {
454
+ const cats = listCategories();
455
+ const structured = { count: cats.length, categories: cats };
456
+ const text = `# Categories — ${cats.length}\n\n${cats.map(c => `- ${c}`).join('\n')}`;
457
+ return {
458
+ content: [{ type: 'text', text }],
459
+ structuredContent: structured,
460
+ };
461
+ }
462
+ catch (e) {
463
+ return {
464
+ isError: true,
465
+ content: [
466
+ { type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` },
467
+ ],
468
+ };
469
+ }
470
+ });
471
+ server.registerTool('solar_list_styles', {
472
+ title: 'List Styles',
473
+ description: `List 6 styles + provider tokens. Use to see available style values and CSS variables.`,
474
+ inputSchema: {},
475
+ annotations: {
476
+ readOnlyHint: true,
477
+ destructiveHint: false,
478
+ idempotentHint: true,
479
+ openWorldHint: false,
480
+ },
481
+ }, async () => {
482
+ try {
483
+ const structured = {
484
+ styles: [...STYLES],
485
+ providerTokens: [
486
+ '--solar-color',
487
+ '--solar-size',
488
+ '--solar-stroke-width',
489
+ '--solar-secondary-color',
490
+ '--solar-secondary-opacity',
491
+ ],
492
+ };
493
+ const text = `# Styles — ${STYLES.length}\n\n${STYLES.map(s => `- ${s}`).join('\n')}\n\nProvider tokens: ${structured.providerTokens.join(', ')}`;
494
+ return {
495
+ content: [{ type: 'text', text }],
496
+ structuredContent: structured,
497
+ };
498
+ }
499
+ catch (e) {
500
+ return {
501
+ isError: true,
502
+ content: [
503
+ { type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` },
504
+ ],
505
+ };
506
+ }
507
+ });
508
+ // ---------------------------------------------------------------------------
509
+ // Main — stdio
510
+ // ---------------------------------------------------------------------------
511
+ async function main() {
512
+ const transport = new StdioServerTransport();
513
+ await server.connect(transport);
514
+ // Use stderr for logs (stdout is for MCP)
515
+ console.error('[solar-icons-mcp] running via stdio — tools: solar_search_icons, solar_get_icon, solar_list_icons, solar_info_icon, solar_overview, solar_list_categories, solar_list_styles');
516
+ }
517
+ main().catch(err => {
518
+ console.error('[solar-icons-mcp] error:', err);
519
+ process.exit(1);
520
+ });
521
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@solar-icons/mcp",
3
+ "version": "2.0.0",
4
+ "private": false,
5
+ "description": "MCP server for Solar Icons — search, get and list 1,268 icons × 6 styles via Model Context Protocol",
6
+ "keywords": [
7
+ "icons",
8
+ "mcp",
9
+ "model-context-protocol",
10
+ "solar"
11
+ ],
12
+ "license": "MIT",
13
+ "author": {
14
+ "name": "Saoudi Hakim",
15
+ "email": "saoudihakim@gmail.com",
16
+ "url": "https://hakimsaoudi.dev"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/saoudi-h/solar-icons.git",
21
+ "directory": "packages/mcp"
22
+ },
23
+ "bin": {
24
+ "solar-icons-mcp": "./dist/index.js"
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "README.md",
29
+ "LICENSE",
30
+ "LICENSE-THIRD-PARTY"
31
+ ],
32
+ "type": "module",
33
+ "exports": {
34
+ "./package.json": "./package.json"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "dependencies": {
40
+ "@modelcontextprotocol/sdk": "^1.12.0",
41
+ "zod": "^3.23.8",
42
+ "@solar-icons/cli": "2.2.1"
43
+ },
44
+ "devDependencies": {
45
+ "@tala-tools/tsconfig": "0.0.2",
46
+ "@types/node": "^26.1.2",
47
+ "rimraf": "^6.1.3",
48
+ "tsx": "^4.23.8",
49
+ "typescript": "7.0.2",
50
+ "vitest": "^4.1.10"
51
+ },
52
+ "engines": {
53
+ "node": ">=18"
54
+ },
55
+ "scripts": {
56
+ "build": "pnpm copy:licenses && tsc -p tsconfig.json",
57
+ "copy:licenses": "cp ../../LICENSE ./LICENSE && cp ../../LICENSE-THIRD-PARTY ./LICENSE-THIRD-PARTY",
58
+ "lint": "oxlint --deny-warnings .",
59
+ "lint:fix": "oxlint --fix .",
60
+ "format": "oxfmt --check .",
61
+ "format:fix": "oxfmt --write .",
62
+ "clean": "rimraf dist LICENSE LICENSE-THIRD-PARTY",
63
+ "test": "vitest run",
64
+ "typecheck": "tsc --noEmit",
65
+ "pre-commit": "lint-staged",
66
+ "dev": "tsx watch src/index.ts",
67
+ "start": "node dist/index.js"
68
+ }
69
+ }