vibekit-mcp 0.1.0 → 0.2.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/dist/index.js +81 -0
- package/package.json +10 -2
package/dist/index.js
CHANGED
|
@@ -6,6 +6,10 @@ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
|
6
6
|
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
7
7
|
const API_BASE = process.env.VIBEKIT_API_URL || "https://vibekit.bot/api/v1";
|
|
8
8
|
const API_KEY = process.env.VIBEKIT_API_KEY || "";
|
|
9
|
+
const SKILLS_REGISTRY = "https://raw.githubusercontent.com/vibekit-apps/skills-registry/main";
|
|
10
|
+
// Skills cache (TTL: 5 minutes)
|
|
11
|
+
let skillsCache = null;
|
|
12
|
+
const CACHE_TTL = 5 * 60 * 1000;
|
|
9
13
|
if (!API_KEY) {
|
|
10
14
|
console.error("Error: VIBEKIT_API_KEY environment variable is required");
|
|
11
15
|
console.error("Get one at https://t.me/the_vibe_kit_bot with /apikey command");
|
|
@@ -170,6 +174,33 @@ const tools = [
|
|
|
170
174
|
properties: {},
|
|
171
175
|
},
|
|
172
176
|
},
|
|
177
|
+
{
|
|
178
|
+
name: "vibekit_list_skills",
|
|
179
|
+
description: "List all available implementation skills. Returns skill IDs, names, descriptions, and tags. Use this to discover what skills are available before fetching specific ones.",
|
|
180
|
+
inputSchema: {
|
|
181
|
+
type: "object",
|
|
182
|
+
properties: {
|
|
183
|
+
tag: {
|
|
184
|
+
type: "string",
|
|
185
|
+
description: "Filter skills by tag (e.g., 'react', 'database', 'security')",
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
name: "vibekit_get_skill",
|
|
192
|
+
description: "Fetch the full content of a specific skill. Skills contain implementation patterns, code examples, and best practices for a domain. Fetch skills on-demand when you need guidance on a specific topic.",
|
|
193
|
+
inputSchema: {
|
|
194
|
+
type: "object",
|
|
195
|
+
properties: {
|
|
196
|
+
id: {
|
|
197
|
+
type: "string",
|
|
198
|
+
description: "Skill ID from vibekit_list_skills (e.g., 'nextjs', 'trpc', 'auth')",
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
required: ["id"],
|
|
202
|
+
},
|
|
203
|
+
},
|
|
173
204
|
];
|
|
174
205
|
// Tool handlers
|
|
175
206
|
async function handleTool(name, args) {
|
|
@@ -235,6 +266,56 @@ async function handleTool(name, args) {
|
|
|
235
266
|
case "vibekit_account":
|
|
236
267
|
result = await apiRequest("GET", "/account");
|
|
237
268
|
break;
|
|
269
|
+
case "vibekit_list_skills": {
|
|
270
|
+
try {
|
|
271
|
+
// Check cache
|
|
272
|
+
if (skillsCache && Date.now() - skillsCache.fetchedAt < CACHE_TTL) {
|
|
273
|
+
let skills = skillsCache.manifest.skills;
|
|
274
|
+
if (args.tag) {
|
|
275
|
+
skills = skills.filter((s) => s.tags?.includes(args.tag));
|
|
276
|
+
}
|
|
277
|
+
result = { ok: true, data: { skills } };
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
// Fetch manifest
|
|
281
|
+
const res = await fetch(`${SKILLS_REGISTRY}/skills.json`);
|
|
282
|
+
if (!res.ok) {
|
|
283
|
+
result = { ok: false, error: `Failed to fetch skills: ${res.status}` };
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
286
|
+
const manifest = await res.json();
|
|
287
|
+
skillsCache = { manifest, fetchedAt: Date.now() };
|
|
288
|
+
let skills = manifest.skills;
|
|
289
|
+
if (args.tag) {
|
|
290
|
+
skills = skills.filter((s) => s.tags?.includes(args.tag));
|
|
291
|
+
}
|
|
292
|
+
result = { ok: true, data: { skills, count: skills.length } };
|
|
293
|
+
}
|
|
294
|
+
catch (err) {
|
|
295
|
+
result = { ok: false, error: err instanceof Error ? err.message : "Unknown error" };
|
|
296
|
+
}
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
299
|
+
case "vibekit_get_skill": {
|
|
300
|
+
try {
|
|
301
|
+
const id = args.id;
|
|
302
|
+
if (!id) {
|
|
303
|
+
result = { ok: false, error: "Skill ID is required" };
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
const res = await fetch(`${SKILLS_REGISTRY}/skills/${id}/SKILL.md`);
|
|
307
|
+
if (!res.ok) {
|
|
308
|
+
result = { ok: false, error: `Skill '${id}' not found (${res.status})` };
|
|
309
|
+
break;
|
|
310
|
+
}
|
|
311
|
+
const content = await res.text();
|
|
312
|
+
result = { ok: true, data: { id, content } };
|
|
313
|
+
}
|
|
314
|
+
catch (err) {
|
|
315
|
+
result = { ok: false, error: err instanceof Error ? err.message : "Unknown error" };
|
|
316
|
+
}
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
238
319
|
default:
|
|
239
320
|
result = { ok: false, error: `Unknown tool: ${name}` };
|
|
240
321
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibekit-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "MCP server for VibeKit — use AI coding tasks as native tools in Claude Desktop, Cursor, etc.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -14,7 +14,15 @@
|
|
|
14
14
|
"build": "tsc",
|
|
15
15
|
"prepublishOnly": "npm run build"
|
|
16
16
|
},
|
|
17
|
-
"keywords": [
|
|
17
|
+
"keywords": [
|
|
18
|
+
"mcp",
|
|
19
|
+
"vibekit",
|
|
20
|
+
"claude",
|
|
21
|
+
"ai",
|
|
22
|
+
"coding",
|
|
23
|
+
"tools",
|
|
24
|
+
"anthropic"
|
|
25
|
+
],
|
|
18
26
|
"author": "609.sol",
|
|
19
27
|
"license": "MIT",
|
|
20
28
|
"repository": {
|