@skilldrunk/mcp 0.1.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 ADDED
@@ -0,0 +1,101 @@
1
+ # @skilldrunk/mcp
2
+
3
+ MCP server for [skilldrunk](https://skilldrunk.com) — search, rate, and publish AI skills from Claude Desktop, Cursor, Windsurf, and any other [Model Context Protocol](https://modelcontextprotocol.io) compatible client.
4
+
5
+ ## What it does
6
+
7
+ Exposes the skilldrunk library (Claude Skills, GPTs, MCP servers, Cursor rules, prompts, agents) as MCP tools:
8
+
9
+ | Tool | Description | Auth |
10
+ |---|---|---|
11
+ | `search_skills` | Full-text search with type/tag/sort filters | optional |
12
+ | `get_skill` | Fetch a skill by slug with full markdown body | optional |
13
+ | `list_comments` | Read the discussion thread on a skill | optional |
14
+ | `vote_skill` | Upvote, downvote, or clear a vote | write key |
15
+ | `comment_on_skill` | Post a comment (with optional parent for threads) | write key |
16
+ | `whoami` | Return the profile for the configured API key | read key |
17
+
18
+ ## Install
19
+
20
+ ```bash
21
+ npx -y @skilldrunk/mcp
22
+ ```
23
+
24
+ Or install globally:
25
+
26
+ ```bash
27
+ npm install -g @skilldrunk/mcp
28
+ ```
29
+
30
+ ## Get an API key
31
+
32
+ Read-only tools work without a key (rate-limited). For voting and commenting, create a key at **https://skilldrunk.com/settings/api-keys** and check the "write" scope.
33
+
34
+ The key is shown once — copy it and store it somewhere safe.
35
+
36
+ ## Claude Desktop
37
+
38
+ Edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
39
+
40
+ ```json
41
+ {
42
+ "mcpServers": {
43
+ "skilldrunk": {
44
+ "command": "npx",
45
+ "args": ["-y", "@skilldrunk/mcp"],
46
+ "env": {
47
+ "SKILLDRUNK_API_KEY": "sd_live_..."
48
+ }
49
+ }
50
+ }
51
+ }
52
+ ```
53
+
54
+ Restart Claude Desktop. The tools should appear in the tool picker.
55
+
56
+ ## Cursor
57
+
58
+ Edit `~/.cursor/mcp.json`:
59
+
60
+ ```json
61
+ {
62
+ "mcpServers": {
63
+ "skilldrunk": {
64
+ "command": "npx",
65
+ "args": ["-y", "@skilldrunk/mcp"],
66
+ "env": { "SKILLDRUNK_API_KEY": "sd_live_..." }
67
+ }
68
+ }
69
+ }
70
+ ```
71
+
72
+ ## Windsurf
73
+
74
+ Edit `~/.codeium/windsurf/mcp_config.json`:
75
+
76
+ ```json
77
+ {
78
+ "mcpServers": {
79
+ "skilldrunk": {
80
+ "command": "npx",
81
+ "args": ["-y", "@skilldrunk/mcp"],
82
+ "env": { "SKILLDRUNK_API_KEY": "sd_live_..." }
83
+ }
84
+ }
85
+ }
86
+ ```
87
+
88
+ ## Environment
89
+
90
+ | Variable | Required | Description |
91
+ |---|---|---|
92
+ | `SKILLDRUNK_API_KEY` | For write tools | Your `sd_live_…` API key |
93
+ | `SKILLDRUNK_API_URL` | No | Override API base URL (defaults to `https://skilldrunk.com/api/v1`) |
94
+
95
+ ## Self-hosting
96
+
97
+ Point `SKILLDRUNK_API_URL` at your own deployment. The server only needs the public REST API to be reachable.
98
+
99
+ ## License
100
+
101
+ MIT
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * skilldrunk MCP server
4
+ *
5
+ * Exposes the public skilldrunk REST API as MCP tools so Claude Desktop,
6
+ * Cursor, Windsurf and any other MCP-compatible client can search, read,
7
+ * vote on and comment on AI skills in the skilldrunk library.
8
+ *
9
+ * Config (via environment variables):
10
+ * SKILLDRUNK_API_KEY — required for write tools (vote, comment).
11
+ * Optional for reads, but gives a higher rate limit.
12
+ * SKILLDRUNK_API_URL — override for self-hosting; defaults to
13
+ * https://skilldrunk.com/api/v1
14
+ */
15
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,251 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * skilldrunk MCP server
4
+ *
5
+ * Exposes the public skilldrunk REST API as MCP tools so Claude Desktop,
6
+ * Cursor, Windsurf and any other MCP-compatible client can search, read,
7
+ * vote on and comment on AI skills in the skilldrunk library.
8
+ *
9
+ * Config (via environment variables):
10
+ * SKILLDRUNK_API_KEY — required for write tools (vote, comment).
11
+ * Optional for reads, but gives a higher rate limit.
12
+ * SKILLDRUNK_API_URL — override for self-hosting; defaults to
13
+ * https://skilldrunk.com/api/v1
14
+ */
15
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
16
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
17
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
18
+ import { z } from "zod";
19
+ const API_URL = process.env.SKILLDRUNK_API_URL?.replace(/\/$/, "") ?? "https://skilldrunk.com/api/v1";
20
+ const API_KEY = process.env.SKILLDRUNK_API_KEY ?? null;
21
+ const VERSION = "0.1.0";
22
+ async function apiFetch(path, init = {}) {
23
+ const { auth = "optional", headers, ...rest } = init;
24
+ const finalHeaders = {
25
+ "Content-Type": "application/json",
26
+ "User-Agent": `skilldrunk-mcp/${VERSION}`,
27
+ ...headers,
28
+ };
29
+ if (API_KEY) {
30
+ finalHeaders["Authorization"] = `Bearer ${API_KEY}`;
31
+ }
32
+ else if (auth === "required") {
33
+ throw new Error("This tool requires a skilldrunk API key. Set SKILLDRUNK_API_KEY in your MCP client config. Get one at https://skilldrunk.com/settings/api-keys");
34
+ }
35
+ const url = `${API_URL}${path}`;
36
+ const res = await fetch(url, { ...rest, headers: finalHeaders });
37
+ const text = await res.text();
38
+ let parsed;
39
+ try {
40
+ parsed = text ? JSON.parse(text) : null;
41
+ }
42
+ catch {
43
+ throw new Error(`API ${res.status}: non-JSON response: ${text.slice(0, 200)}`);
44
+ }
45
+ if (!res.ok) {
46
+ const err = parsed?.error;
47
+ throw new Error(err ? `${err.code}: ${err.message}` : `API ${res.status}: ${text.slice(0, 200)}`);
48
+ }
49
+ return parsed.data;
50
+ }
51
+ // ---------- Tool schemas ----------
52
+ const searchSkillsSchema = z.object({
53
+ q: z.string().optional().describe("Full-text search query, e.g. 'pdf extraction'"),
54
+ type: z
55
+ .enum(["claude_skill", "gpt", "mcp_server", "cursor_rule", "prompt", "agent"])
56
+ .optional()
57
+ .describe("Filter by skill type"),
58
+ tag: z
59
+ .array(z.string())
60
+ .optional()
61
+ .describe("Filter by tag(s) — skill must have all of the given tags"),
62
+ sort: z.enum(["trending", "new", "top"]).optional().default("trending"),
63
+ limit: z.number().int().min(1).max(100).optional().default(20),
64
+ });
65
+ const getSkillSchema = z.object({
66
+ slug: z.string().describe("Slug of the skill, e.g. 'pdf-skill'"),
67
+ });
68
+ const voteSkillSchema = z.object({
69
+ slug: z.string(),
70
+ value: z
71
+ .number()
72
+ .int()
73
+ .refine((v) => v === 1 || v === -1 || v === 0, {
74
+ message: "value must be 1, -1, or 0 (0 clears)",
75
+ })
76
+ .describe("1 = upvote, -1 = downvote, 0 = clear existing vote"),
77
+ });
78
+ const commentSkillSchema = z.object({
79
+ slug: z.string(),
80
+ body_md: z.string().min(1).max(10_000).describe("Markdown body of the comment"),
81
+ parent_id: z
82
+ .string()
83
+ .uuid()
84
+ .optional()
85
+ .describe("Optional parent comment UUID for threaded replies"),
86
+ });
87
+ const listCommentsSchema = z.object({
88
+ slug: z.string(),
89
+ });
90
+ // ---------- Server ----------
91
+ const server = new Server({
92
+ name: "skilldrunk",
93
+ version: VERSION,
94
+ }, {
95
+ capabilities: { tools: {} },
96
+ });
97
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
98
+ tools: [
99
+ {
100
+ name: "search_skills",
101
+ description: "Search the skilldrunk library for AI skills (Claude Skills, GPTs, MCP servers, Cursor rules, prompts, agents). Returns a ranked list of matching skills with titles, summaries, types, tags and vote counts.",
102
+ inputSchema: {
103
+ type: "object",
104
+ properties: {
105
+ q: { type: "string", description: "Full-text search query" },
106
+ type: {
107
+ type: "string",
108
+ enum: ["claude_skill", "gpt", "mcp_server", "cursor_rule", "prompt", "agent"],
109
+ },
110
+ tag: { type: "array", items: { type: "string" } },
111
+ sort: { type: "string", enum: ["trending", "new", "top"], default: "trending" },
112
+ limit: { type: "integer", minimum: 1, maximum: 100, default: 20 },
113
+ },
114
+ },
115
+ },
116
+ {
117
+ name: "get_skill",
118
+ description: "Fetch a single skill by slug, including the full markdown body and all metadata. Use this after search_skills when you need the details to install or use a skill.",
119
+ inputSchema: {
120
+ type: "object",
121
+ required: ["slug"],
122
+ properties: {
123
+ slug: { type: "string" },
124
+ },
125
+ },
126
+ },
127
+ {
128
+ name: "list_comments",
129
+ description: "List the discussion thread for a skill (up to 200 comments).",
130
+ inputSchema: {
131
+ type: "object",
132
+ required: ["slug"],
133
+ properties: {
134
+ slug: { type: "string" },
135
+ },
136
+ },
137
+ },
138
+ {
139
+ name: "vote_skill",
140
+ description: "Cast or clear a vote on a skill. Requires an API key with the 'write' scope set in SKILLDRUNK_API_KEY.",
141
+ inputSchema: {
142
+ type: "object",
143
+ required: ["slug", "value"],
144
+ properties: {
145
+ slug: { type: "string" },
146
+ value: { type: "integer", enum: [-1, 0, 1] },
147
+ },
148
+ },
149
+ },
150
+ {
151
+ name: "comment_on_skill",
152
+ description: "Post a comment on a skill. Requires an API key with the 'write' scope. Returns the created comment.",
153
+ inputSchema: {
154
+ type: "object",
155
+ required: ["slug", "body_md"],
156
+ properties: {
157
+ slug: { type: "string" },
158
+ body_md: { type: "string", maxLength: 10000 },
159
+ parent_id: { type: "string" },
160
+ },
161
+ },
162
+ },
163
+ {
164
+ name: "whoami",
165
+ description: "Return the profile and scopes of the API key currently configured in SKILLDRUNK_API_KEY. Use this to verify your key is valid.",
166
+ inputSchema: { type: "object", properties: {} },
167
+ },
168
+ ],
169
+ }));
170
+ server.setRequestHandler(CallToolRequestSchema, async (req) => {
171
+ const { name, arguments: args } = req.params;
172
+ try {
173
+ switch (name) {
174
+ case "search_skills": {
175
+ const parsed = searchSkillsSchema.parse(args ?? {});
176
+ const params = new URLSearchParams();
177
+ if (parsed.q)
178
+ params.set("q", parsed.q);
179
+ if (parsed.type)
180
+ params.set("type", parsed.type);
181
+ if (parsed.sort)
182
+ params.set("sort", parsed.sort);
183
+ if (parsed.limit)
184
+ params.set("limit", String(parsed.limit));
185
+ for (const tag of parsed.tag ?? [])
186
+ params.append("tag", tag);
187
+ const data = await apiFetch(`/skills?${params.toString()}`);
188
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
189
+ }
190
+ case "get_skill": {
191
+ const parsed = getSkillSchema.parse(args ?? {});
192
+ const data = await apiFetch(`/skills/${encodeURIComponent(parsed.slug)}`);
193
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
194
+ }
195
+ case "list_comments": {
196
+ const parsed = listCommentsSchema.parse(args ?? {});
197
+ const data = await apiFetch(`/skills/${encodeURIComponent(parsed.slug)}/comments`);
198
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
199
+ }
200
+ case "vote_skill": {
201
+ const parsed = voteSkillSchema.parse(args ?? {});
202
+ const data = await apiFetch(`/skills/${encodeURIComponent(parsed.slug)}/vote`, {
203
+ method: "POST",
204
+ body: JSON.stringify({ value: parsed.value }),
205
+ auth: "required",
206
+ });
207
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
208
+ }
209
+ case "comment_on_skill": {
210
+ const parsed = commentSkillSchema.parse(args ?? {});
211
+ const data = await apiFetch(`/skills/${encodeURIComponent(parsed.slug)}/comments`, {
212
+ method: "POST",
213
+ body: JSON.stringify({
214
+ body_md: parsed.body_md,
215
+ parent_id: parsed.parent_id ?? null,
216
+ }),
217
+ auth: "required",
218
+ });
219
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
220
+ }
221
+ case "whoami": {
222
+ const data = await apiFetch(`/me`, { auth: "required" });
223
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
224
+ }
225
+ default:
226
+ return {
227
+ content: [{ type: "text", text: `Unknown tool: ${name}` }],
228
+ isError: true,
229
+ };
230
+ }
231
+ }
232
+ catch (err) {
233
+ const message = err instanceof Error ? err.message : String(err);
234
+ return {
235
+ content: [{ type: "text", text: `Error: ${message}` }],
236
+ isError: true,
237
+ };
238
+ }
239
+ });
240
+ async function main() {
241
+ const transport = new StdioServerTransport();
242
+ await server.connect(transport);
243
+ // MCP servers must not write to stdout (it's the protocol channel). stderr
244
+ // is fine for banner output.
245
+ console.error(`skilldrunk-mcp v${VERSION} ready — ${API_URL}`);
246
+ }
247
+ main().catch((err) => {
248
+ console.error("skilldrunk-mcp fatal:", err);
249
+ process.exit(1);
250
+ });
251
+ //# 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,48 @@
1
+ {
2
+ "name": "@skilldrunk/mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for skilldrunk — search, rate, and publish AI skills from Claude Desktop, Cursor, Windsurf and other MCP-compatible clients.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/LuciFeRADoNiS/skilldrunk"
9
+ },
10
+ "homepage": "https://skilldrunk.com/docs/mcp",
11
+ "bugs": "https://github.com/LuciFeRADoNiS/skilldrunk/issues",
12
+ "keywords": [
13
+ "mcp",
14
+ "model-context-protocol",
15
+ "skilldrunk",
16
+ "claude",
17
+ "ai-skills",
18
+ "cursor",
19
+ "windsurf"
20
+ ],
21
+ "type": "module",
22
+ "bin": {
23
+ "skilldrunk-mcp": "./dist/index.js"
24
+ },
25
+ "main": "./dist/index.js",
26
+ "types": "./dist/index.d.ts",
27
+ "files": [
28
+ "dist",
29
+ "README.md"
30
+ ],
31
+ "scripts": {
32
+ "build": "tsc",
33
+ "dev": "tsc --watch",
34
+ "prepublishOnly": "pnpm build",
35
+ "start": "node dist/index.js"
36
+ },
37
+ "dependencies": {
38
+ "@modelcontextprotocol/sdk": "^1.0.0",
39
+ "zod": "^3.23.8"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^22.0.0",
43
+ "typescript": "^5.6.0"
44
+ },
45
+ "engines": {
46
+ "node": ">=18.17.0"
47
+ }
48
+ }