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.
Files changed (2) hide show
  1. package/dist/index.js +81 -0
  2. 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.1.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": ["mcp", "vibekit", "claude", "ai", "coding", "tools", "anthropic"],
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": {