svgl-mcp 1.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/README.md +21 -0
- package/dist/api.js +34 -0
- package/dist/index.js +4 -0
- package/dist/server.js +38 -0
- package/package.json +44 -0
- package/server.json +20 -0
package/README.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# SVGL MCP
|
|
2
|
+
|
|
3
|
+
SVG logos from the public SVGL API. No key required.
|
|
4
|
+
|
|
5
|
+
This file is self contained. It reads public data only and never writes to the machine. All output is bounded and honest about what could not be fetched.
|
|
6
|
+
|
|
7
|
+
## Tools
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
* `logos` List logos.
|
|
11
|
+
* `categories` List categories.
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install
|
|
17
|
+
npm run build
|
|
18
|
+
node dist/index.js
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Data comes from the public SVGL API.
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const BASE = 'https://api.svgl.app';
|
|
2
|
+
const UA = 'mrfentmen-svgl-mcp/1.0';
|
|
3
|
+
export async function logos(args) {
|
|
4
|
+
const limit = Math.min(Math.max(Number(args?.limit ?? 25) || 25, 1), 50);
|
|
5
|
+
const q = (args?.category ?? '').trim();
|
|
6
|
+
const url = q ? `${BASE}/category/${encodeURIComponent(q)}` : `${BASE}/`;
|
|
7
|
+
const res = await fetch(url, {
|
|
8
|
+
headers: { 'User-Agent': UA, Accept: 'application/json' },
|
|
9
|
+
signal: AbortSignal.timeout(20000),
|
|
10
|
+
});
|
|
11
|
+
if (!res.ok)
|
|
12
|
+
throw new Error(`SVGL returned ${res.status}`);
|
|
13
|
+
const d = (await res.json());
|
|
14
|
+
if (!Array.isArray(d) || !d.length)
|
|
15
|
+
return q ? `No logos in category "${q}".` : 'No logos returned.';
|
|
16
|
+
const rows = d.slice(0, limit).map((x, i) => {
|
|
17
|
+
if (typeof x === 'string')
|
|
18
|
+
return `${i + 1}. ${x}`;
|
|
19
|
+
return `${i + 1}. ${x.title ?? '?'} [${x.category ?? '?'}] ${x.route ?? ''}`.trim();
|
|
20
|
+
});
|
|
21
|
+
return `SVGL logos (${d.length} available, showing ${rows.length}):\n${rows.join('\n')}`;
|
|
22
|
+
}
|
|
23
|
+
export async function categories(_args) {
|
|
24
|
+
const res = await fetch(`${BASE}/categories`, {
|
|
25
|
+
headers: { 'User-Agent': UA, Accept: 'application/json' },
|
|
26
|
+
signal: AbortSignal.timeout(20000),
|
|
27
|
+
});
|
|
28
|
+
if (!res.ok)
|
|
29
|
+
throw new Error(`SVGL returned ${res.status}`);
|
|
30
|
+
const d = (await res.json());
|
|
31
|
+
if (!Array.isArray(d) || !d.length)
|
|
32
|
+
return 'No categories returned.';
|
|
33
|
+
return `SVGL categories (${d.length}):\n${d.map((c, i) => `${i + 1}. ${c}`).join('\n')}`;
|
|
34
|
+
}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
2
|
+
import { createServer } from "./server.js";
|
|
3
|
+
const main = async () => { const server = createServer(); await server.connect(new StdioServerTransport()); };
|
|
4
|
+
main().catch((error) => { console.error("Fatal error:", error); process.exit(1); });
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { categories } from "./api.js";
|
|
4
|
+
import { logos } from "./api.js";
|
|
5
|
+
const text = (value) => ({ content: [{ type: "text", text: value }] });
|
|
6
|
+
const textError = (t) => ({ content: [{ type: "text", text: t }], isError: true });
|
|
7
|
+
const READ_ONLY = { readOnlyHint: true, openWorldHint: true };
|
|
8
|
+
const error = (e) => `Error: ${e instanceof Error ? e.message : String(e)}`;
|
|
9
|
+
export function createServer() {
|
|
10
|
+
const server = new McpServer({ name: "svgl-mcp", version: "1.0.0" });
|
|
11
|
+
server.registerTool("logos", {
|
|
12
|
+
title: "Logos",
|
|
13
|
+
description: "List logos.",
|
|
14
|
+
inputSchema: z.object({ category: z.string().describe("Optional category filter.").optional(), limit: z.number().describe("Max results.").optional() }),
|
|
15
|
+
annotations: READ_ONLY,
|
|
16
|
+
}, async (args) => {
|
|
17
|
+
try {
|
|
18
|
+
return text(await logos(args));
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
return textError(error(e));
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
server.registerTool("categories", {
|
|
25
|
+
title: "Categories",
|
|
26
|
+
description: "List categories.",
|
|
27
|
+
inputSchema: z.object({}),
|
|
28
|
+
annotations: READ_ONLY,
|
|
29
|
+
}, async (args) => {
|
|
30
|
+
try {
|
|
31
|
+
return text(await categories(args));
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
return textError(error(e));
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return server;
|
|
38
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/mrfentmen/svgl-mcp.git"
|
|
7
|
+
},
|
|
8
|
+
"bin": {
|
|
9
|
+
"svgl-mcp": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"server.json",
|
|
15
|
+
"README.md"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc -p tsconfig.json",
|
|
19
|
+
"start": "node dist/index.js",
|
|
20
|
+
"dev": "npm run build && node dist/index.js"
|
|
21
|
+
},
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
25
|
+
"zod": "^3.23.8"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^22.0.0",
|
|
29
|
+
"typescript": "^5.6.0"
|
|
30
|
+
},
|
|
31
|
+
"name": "svgl-mcp",
|
|
32
|
+
"description": "SVG logos from SVGL. No key required.",
|
|
33
|
+
"mcpName": "io.github.mrfentmen/svgl-mcp",
|
|
34
|
+
"keywords": [
|
|
35
|
+
"mcp",
|
|
36
|
+
"svgl",
|
|
37
|
+
"svg",
|
|
38
|
+
"logos",
|
|
39
|
+
"design"
|
|
40
|
+
],
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=20"
|
|
43
|
+
}
|
|
44
|
+
}
|
package/server.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
|
+
"name": "io.github.mrfentmen/svgl-mcp",
|
|
4
|
+
"description": "SVG logos from SVGL. No key required.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"url": "https://github.com/mrfentmen/svgl-mcp",
|
|
7
|
+
"source": "github"
|
|
8
|
+
},
|
|
9
|
+
"version": "1.0.0",
|
|
10
|
+
"packages": [
|
|
11
|
+
{
|
|
12
|
+
"registryType": "npm",
|
|
13
|
+
"identifier": "svgl-mcp",
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"transport": {
|
|
16
|
+
"type": "stdio"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|