vibekit-mcp 0.5.3 → 0.5.5

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 (3) hide show
  1. package/README.md +8 -1
  2. package/dist/index.js +256 -429
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # vibekit-mcp
2
2
 
3
- MCP server for VibeKit deploy apps, manage hosting, and chat with AI agents from any MCP client.
3
+ MCP server for VibeKit, deploy apps, manage hosting, and chat with AI agents from any MCP client.
4
+
5
+ This package is for **VibeKit cloud/API access**. It does **not** connect your local Claude Code instance to Telegram. For local-machine remote control, use `vibekit-agent`.
4
6
 
5
7
  ## Installation
6
8
 
@@ -111,6 +113,11 @@ Once configured, you can use prompts like:
111
113
  | `VIBEKIT_API_KEY` | Your VibeKit API key (required) | — |
112
114
  | `VIBEKIT_API_URL` | API base URL | `https://vibekit.bot/api/v1` |
113
115
 
116
+ ## Related Packages
117
+
118
+ - `vibekit-cli`: terminal client for VibeKit cloud workflows
119
+ - `vibekit-agent`: Telegram bridge for local Claude Code on your own machine
120
+
114
121
  ## Links
115
122
 
116
123
  - [VibeKit Website](https://vibekit.bot)
package/dist/index.js CHANGED
@@ -12,7 +12,7 @@ let skillsCache = null;
12
12
  const CACHE_TTL = 5 * 60 * 1000;
13
13
  if (!API_KEY) {
14
14
  console.error("Error: VIBEKIT_API_KEY environment variable is required");
15
- console.error("Get one at https://vibekit.bot or https://t.me/the_vibe_kit_bot with /apikey");
15
+ console.error("Get one at https://t.me/the_vibe_kit_bot with /apikey command");
16
16
  process.exit(1);
17
17
  }
18
18
  // API helper
@@ -38,19 +38,25 @@ async function apiRequest(method, path, body) {
38
38
  }
39
39
  // Tool definitions
40
40
  const tools = [
41
- // ── Hosting & Apps ──────────────────────────────────────────────────────────
41
+ // Hosting & Apps
42
42
  {
43
43
  name: "vibekit_list_apps",
44
44
  description: "List all hosted apps in your VibeKit account.",
45
- inputSchema: { type: "object", properties: {} },
45
+ inputSchema: {
46
+ type: "object",
47
+ properties: {},
48
+ },
46
49
  },
47
50
  {
48
51
  name: "vibekit_get_app",
49
- description: "Get details about a specific hosted app including status, URL, plan, and usage.",
52
+ description: "Get details about a specific hosted app.",
50
53
  inputSchema: {
51
54
  type: "object",
52
55
  properties: {
53
- appId: { type: "string", description: "App ID or subdomain slug" },
56
+ appId: {
57
+ type: "string",
58
+ description: "The app ID to get details for",
59
+ },
54
60
  },
55
61
  required: ["appId"],
56
62
  },
@@ -61,8 +67,14 @@ const tools = [
61
67
  inputSchema: {
62
68
  type: "object",
63
69
  properties: {
64
- template: { type: "string", description: "Template to use (e.g., 'nextjs', 'react', 'express', 'static')" },
65
- subdomain: { type: "string", description: "Subdomain — app will be at {subdomain}.vibekit.bot" },
70
+ template: {
71
+ type: "string",
72
+ description: "Template to use (e.g., 'nextjs', 'react', 'express')",
73
+ },
74
+ subdomain: {
75
+ type: "string",
76
+ description: "Subdomain for the app (will be deployed to {subdomain}.vibekit.bot)",
77
+ },
66
78
  },
67
79
  required: ["template", "subdomain"],
68
80
  },
@@ -73,42 +85,28 @@ const tools = [
73
85
  inputSchema: {
74
86
  type: "object",
75
87
  properties: {
76
- repo: { type: "string", description: "GitHub repo in format 'owner/repo'" },
77
- subdomain: { type: "string", description: "Subdomain — app will be at {subdomain}.vibekit.bot" },
88
+ repo: {
89
+ type: "string",
90
+ description: "GitHub repo in format 'owner/repo'",
91
+ },
92
+ subdomain: {
93
+ type: "string",
94
+ description: "Subdomain for the app (will be deployed to {subdomain}.vibekit.bot)",
95
+ },
78
96
  },
79
97
  required: ["repo", "subdomain"],
80
98
  },
81
99
  },
82
100
  {
83
101
  name: "vibekit_redeploy",
84
- description: "Redeploy an existing hosted app to pick up the latest code changes.",
102
+ description: "Redeploy an existing hosted app to update it with latest code.",
85
103
  inputSchema: {
86
104
  type: "object",
87
105
  properties: {
88
- appId: { type: "string", description: "App ID or subdomain slug" },
89
- },
90
- required: ["appId"],
91
- },
92
- },
93
- {
94
- name: "vibekit_rollback",
95
- description: "Roll back an app to a previous deployment snapshot.",
96
- inputSchema: {
97
- type: "object",
98
- properties: {
99
- appId: { type: "string", description: "App ID or subdomain slug" },
100
- deployId: { type: "string", description: "Deployment ID to roll back to. Use vibekit_deploy_history to list available deployments." },
101
- },
102
- required: ["appId", "deployId"],
103
- },
104
- },
105
- {
106
- name: "vibekit_deploy_history",
107
- description: "List deployment history for an app so you can roll back to a previous snapshot.",
108
- inputSchema: {
109
- type: "object",
110
- properties: {
111
- appId: { type: "string", description: "App ID or subdomain slug" },
106
+ appId: {
107
+ type: "string",
108
+ description: "The app ID to redeploy",
109
+ },
112
110
  },
113
111
  required: ["appId"],
114
112
  },
@@ -119,19 +117,28 @@ const tools = [
119
117
  inputSchema: {
120
118
  type: "object",
121
119
  properties: {
122
- appId: { type: "string", description: "App ID or subdomain slug" },
123
- lines: { type: "number", description: "Number of log lines to retrieve (default: 100)" },
120
+ appId: {
121
+ type: "string",
122
+ description: "The app ID to get logs for",
123
+ },
124
+ lines: {
125
+ type: "number",
126
+ description: "Number of log lines to retrieve (default: 100)",
127
+ },
124
128
  },
125
129
  required: ["appId"],
126
130
  },
127
131
  },
128
132
  {
129
133
  name: "vibekit_restart_app",
130
- description: "Restart a hosted app (zero-downtime reload).",
134
+ description: "Restart a hosted app.",
131
135
  inputSchema: {
132
136
  type: "object",
133
137
  properties: {
134
- appId: { type: "string", description: "App ID or subdomain slug" },
138
+ appId: {
139
+ type: "string",
140
+ description: "The app ID to restart",
141
+ },
135
142
  },
136
143
  required: ["appId"],
137
144
  },
@@ -142,7 +149,10 @@ const tools = [
142
149
  inputSchema: {
143
150
  type: "object",
144
151
  properties: {
145
- appId: { type: "string", description: "App ID or subdomain slug" },
152
+ appId: {
153
+ type: "string",
154
+ description: "The app ID to stop",
155
+ },
146
156
  },
147
157
  required: ["appId"],
148
158
  },
@@ -153,224 +163,122 @@ const tools = [
153
163
  inputSchema: {
154
164
  type: "object",
155
165
  properties: {
156
- appId: { type: "string", description: "App ID or subdomain slug" },
157
- },
158
- required: ["appId"],
159
- },
160
- },
161
- {
162
- name: "vibekit_delete_app",
163
- description: "Permanently delete a hosted app and all its data.",
164
- inputSchema: {
165
- type: "object",
166
- properties: {
167
- appId: { type: "string", description: "App ID or subdomain slug" },
166
+ appId: {
167
+ type: "string",
168
+ description: "The app ID to start",
169
+ },
168
170
  },
169
171
  required: ["appId"],
170
172
  },
171
173
  },
172
- // ── Environment Variables ────────────────────────────────────────────────────
173
174
  {
174
175
  name: "vibekit_app_env",
175
176
  description: "Get environment variables for a hosted app.",
176
177
  inputSchema: {
177
178
  type: "object",
178
179
  properties: {
179
- appId: { type: "string", description: "App ID or subdomain slug" },
180
+ appId: {
181
+ type: "string",
182
+ description: "The app ID to get environment variables for",
183
+ },
180
184
  },
181
185
  required: ["appId"],
182
186
  },
183
187
  },
184
188
  {
185
189
  name: "vibekit_set_env",
186
- description: "Set one or more environment variables for a hosted app. Changes take effect on next restart.",
190
+ description: "Set environment variables for a hosted app.",
187
191
  inputSchema: {
188
192
  type: "object",
189
193
  properties: {
190
- appId: { type: "string", description: "App ID or subdomain slug" },
191
- vars: { type: "object", description: "Key-value pairs to set, e.g. { \"API_KEY\": \"abc\", \"DEBUG\": \"true\" }" },
194
+ appId: {
195
+ type: "string",
196
+ description: "The app ID to set environment variables for",
197
+ },
198
+ vars: {
199
+ type: "object",
200
+ description: "Object of key-value pairs to set as environment variables",
201
+ },
192
202
  },
193
203
  required: ["appId", "vars"],
194
204
  },
195
205
  },
196
206
  {
197
- name: "vibekit_delete_env",
198
- description: "Delete a specific environment variable from a hosted app.",
207
+ name: "vibekit_delete_app",
208
+ description: "Delete a hosted app permanently.",
199
209
  inputSchema: {
200
210
  type: "object",
201
211
  properties: {
202
- appId: { type: "string", description: "App ID or subdomain slug" },
203
- key: { type: "string", description: "Environment variable name to delete" },
212
+ appId: {
213
+ type: "string",
214
+ description: "The app ID to delete",
215
+ },
204
216
  },
205
- required: ["appId", "key"],
217
+ required: ["appId"],
206
218
  },
207
219
  },
208
- // ── AI Agent ─────────────────────────────────────────────────────────────────
220
+ // AI Agent
209
221
  {
210
222
  name: "vibekit_chat",
211
- description: "Send a message to an app's AI agent. The agent can read, write, and modify the app's code, run commands, and deploy changes.",
223
+ description: "Chat with an app's AI agent. The agent can read, write, and modify the app's code.",
212
224
  inputSchema: {
213
225
  type: "object",
214
226
  properties: {
215
- appId: { type: "string", description: "App ID or subdomain slug" },
216
- message: { type: "string", description: "Message to send to the AI agent" },
227
+ appId: {
228
+ type: "string",
229
+ description: "The app ID to chat with the agent for",
230
+ },
231
+ message: {
232
+ type: "string",
233
+ description: "Message to send to the AI agent",
234
+ },
217
235
  },
218
236
  required: ["appId", "message"],
219
237
  },
220
238
  },
221
239
  {
222
240
  name: "vibekit_agent_status",
223
- description: "Get the current status of an app's AI agent (idle, running, etc.).",
241
+ description: "Get the status of an app's AI agent.",
224
242
  inputSchema: {
225
243
  type: "object",
226
244
  properties: {
227
- appId: { type: "string", description: "App ID or subdomain slug" },
228
- },
229
- required: ["appId"],
230
- },
231
- },
232
- {
233
- name: "vibekit_agent_stop",
234
- description: "Stop a currently running agent request.",
235
- inputSchema: {
236
- type: "object",
237
- properties: {
238
- appId: { type: "string", description: "App ID or subdomain slug" },
245
+ appId: {
246
+ type: "string",
247
+ description: "The app ID to get agent status for",
248
+ },
239
249
  },
240
250
  required: ["appId"],
241
251
  },
242
252
  },
243
253
  {
244
254
  name: "vibekit_agent_history",
245
- description: "Get the chat history with an app's AI agent.",
246
- inputSchema: {
247
- type: "object",
248
- properties: {
249
- appId: { type: "string", description: "App ID or subdomain slug" },
250
- limit: { type: "number", description: "Maximum number of messages to return (default: 20)" },
251
- },
252
- required: ["appId"],
253
- },
254
- },
255
- {
256
- name: "vibekit_agent_config",
257
- description: "Get the AI agent configuration for an app. Returns the current model.",
255
+ description: "Get chat history with an app's AI agent.",
258
256
  inputSchema: {
259
257
  type: "object",
260
258
  properties: {
261
- appId: { type: "string", description: "App ID or subdomain slug" },
262
- },
263
- required: ["appId"],
264
- },
265
- },
266
- {
267
- name: "vibekit_agent_set_model",
268
- description: "Change the AI model used by an app's agent.",
269
- inputSchema: {
270
- type: "object",
271
- properties: {
272
- appId: { type: "string", description: "App ID or subdomain slug" },
273
- model: { type: "string", description: "Model to use. Options: 'claude-opus-4-6', 'claude-sonnet-4-20250514', 'claude-haiku-3.5'" },
274
- },
275
- required: ["appId", "model"],
276
- },
277
- },
278
- {
279
- name: "vibekit_exec",
280
- description: "Run a shell command inside an app's container. The app must be running. Useful for inspecting state, running migrations, or debugging.",
281
- inputSchema: {
282
- type: "object",
283
- properties: {
284
- appId: { type: "string", description: "App ID or subdomain slug" },
285
- command: { type: "string", description: "Shell command to run, e.g. 'ls -la' or 'node -e \"console.log(process.env)\"'" },
286
- },
287
- required: ["appId", "command"],
288
- },
289
- },
290
- {
291
- name: "vibekit_agent_reset",
292
- description: "Reset an app's agent. Choose an action: 'clear-sessions' (wipe conversation history), 'clear-memory' (wipe memory files), 'restart-agent' (restart the gateway process), 'cleanup-disk' (free disk space).",
293
- inputSchema: {
294
- type: "object",
295
- properties: {
296
- appId: { type: "string", description: "App ID or subdomain slug" },
297
- action: {
259
+ appId: {
298
260
  type: "string",
299
- enum: ["clear-sessions", "clear-memory", "restart-agent", "cleanup-disk"],
300
- description: "Reset action to perform",
261
+ description: "The app ID to get agent history for",
262
+ },
263
+ limit: {
264
+ type: "number",
265
+ description: "Maximum number of messages to return (default: 20)",
301
266
  },
302
- },
303
- required: ["appId", "action"],
304
- },
305
- },
306
- {
307
- name: "vibekit_agent_compact",
308
- description: "Compact the agent's memory to free up context window space. Useful for long-running agents.",
309
- inputSchema: {
310
- type: "object",
311
- properties: {
312
- appId: { type: "string", description: "App ID or subdomain slug" },
313
- },
314
- required: ["appId"],
315
- },
316
- },
317
- // ── Files ────────────────────────────────────────────────────────────────────
318
- {
319
- name: "vibekit_list_files",
320
- description: "List files in an app's workspace directory.",
321
- inputSchema: {
322
- type: "object",
323
- properties: {
324
- appId: { type: "string", description: "App ID or subdomain slug" },
325
- path: { type: "string", description: "Directory path to list (default: root)" },
326
- },
327
- required: ["appId"],
328
- },
329
- },
330
- {
331
- name: "vibekit_read_file",
332
- description: "Read the contents of a file in an app's workspace.",
333
- inputSchema: {
334
- type: "object",
335
- properties: {
336
- appId: { type: "string", description: "App ID or subdomain slug" },
337
- path: { type: "string", description: "File path relative to workspace root, e.g. 'src/index.ts'" },
338
- },
339
- required: ["appId", "path"],
340
- },
341
- },
342
- {
343
- name: "vibekit_write_file",
344
- description: "Write or update a file in an app's workspace. Use this to edit code directly.",
345
- inputSchema: {
346
- type: "object",
347
- properties: {
348
- appId: { type: "string", description: "App ID or subdomain slug" },
349
- path: { type: "string", description: "File path relative to workspace root, e.g. 'src/index.ts'" },
350
- content: { type: "string", description: "Full file content to write" },
351
- },
352
- required: ["appId", "path", "content"],
353
- },
354
- },
355
- {
356
- name: "vibekit_file_changes",
357
- description: "Get a diff of recent file changes in an app's workspace (uncommitted changes).",
358
- inputSchema: {
359
- type: "object",
360
- properties: {
361
- appId: { type: "string", description: "App ID or subdomain slug" },
362
267
  },
363
268
  required: ["appId"],
364
269
  },
365
270
  },
366
- // ── Database ─────────────────────────────────────────────────────────────────
271
+ // Database
367
272
  {
368
273
  name: "vibekit_enable_database",
369
- description: "Enable a managed Postgres database for an app. Free tier users need the database add-on.",
274
+ description: "Enable database for a hosted app.",
370
275
  inputSchema: {
371
276
  type: "object",
372
277
  properties: {
373
- appId: { type: "string", description: "App ID or subdomain slug" },
278
+ appId: {
279
+ type: "string",
280
+ description: "The app ID to enable database for",
281
+ },
374
282
  },
375
283
  required: ["appId"],
376
284
  },
@@ -381,131 +289,70 @@ const tools = [
381
289
  inputSchema: {
382
290
  type: "object",
383
291
  properties: {
384
- appId: { type: "string", description: "App ID or subdomain slug" },
385
- },
386
- required: ["appId"],
387
- },
388
- },
389
- {
390
- name: "vibekit_database_schema",
391
- description: "Get the database schema (tables and columns) for an app's database.",
392
- inputSchema: {
393
- type: "object",
394
- properties: {
395
- appId: { type: "string", description: "App ID or subdomain slug" },
396
- },
397
- required: ["appId"],
398
- },
399
- },
400
- {
401
- name: "vibekit_database_query",
402
- description: "Run a SQL query against an app's database. Read-only queries are always safe; write queries modify data.",
403
- inputSchema: {
404
- type: "object",
405
- properties: {
406
- appId: { type: "string", description: "App ID or subdomain slug" },
407
- sql: { type: "string", description: "SQL query to execute, e.g. 'SELECT * FROM users LIMIT 10'" },
408
- },
409
- required: ["appId", "sql"],
410
- },
411
- },
412
- // ── Domain ───────────────────────────────────────────────────────────────────
413
- {
414
- name: "vibekit_add_domain",
415
- description: "Add a custom domain to an app. After adding, update your DNS CNAME to point to vibekit.bot.",
416
- inputSchema: {
417
- type: "object",
418
- properties: {
419
- appId: { type: "string", description: "App ID or subdomain slug" },
420
- domain: { type: "string", description: "Custom domain to add, e.g. 'myapp.com'" },
421
- },
422
- required: ["appId", "domain"],
423
- },
424
- },
425
- {
426
- name: "vibekit_remove_domain",
427
- description: "Remove a custom domain from an app.",
428
- inputSchema: {
429
- type: "object",
430
- properties: {
431
- appId: { type: "string", description: "App ID or subdomain slug" },
292
+ appId: {
293
+ type: "string",
294
+ description: "The app ID to get database status for",
295
+ },
432
296
  },
433
297
  required: ["appId"],
434
298
  },
435
299
  },
436
- // ── QA ───────────────────────────────────────────────────────────────────────
300
+ // QA
437
301
  {
438
302
  name: "vibekit_run_qa",
439
- description: "Run automated QA tests on a hosted app. Takes a screenshot and tests key flows.",
303
+ description: "Run automated QA tests on a hosted app.",
440
304
  inputSchema: {
441
305
  type: "object",
442
306
  properties: {
443
- appId: { type: "string", description: "App ID or subdomain slug" },
307
+ appId: {
308
+ type: "string",
309
+ description: "The app ID to run QA tests for",
310
+ },
444
311
  },
445
312
  required: ["appId"],
446
313
  },
447
314
  },
448
315
  {
449
316
  name: "vibekit_qa_status",
450
- description: "Get the latest QA test results for an app.",
317
+ description: "Get QA test results and status for an app.",
451
318
  inputSchema: {
452
319
  type: "object",
453
320
  properties: {
454
- appId: { type: "string", description: "App ID or subdomain slug" },
455
- },
456
- required: ["appId"],
457
- },
458
- },
459
- // ── Schedules (app-level cron jobs) ──────────────────────────────────────────
460
- {
461
- name: "vibekit_app_schedules",
462
- description: "List cron schedules configured for an app's agent.",
463
- inputSchema: {
464
- type: "object",
465
- properties: {
466
- appId: { type: "string", description: "App ID or subdomain slug" },
321
+ appId: {
322
+ type: "string",
323
+ description: "The app ID to get QA status for",
324
+ },
467
325
  },
468
326
  required: ["appId"],
469
327
  },
470
328
  },
471
- {
472
- name: "vibekit_create_app_schedule",
473
- description: "Create a cron schedule for an app's agent (e.g. daily report, nightly cleanup).",
474
- inputSchema: {
475
- type: "object",
476
- properties: {
477
- appId: { type: "string", description: "App ID or subdomain slug" },
478
- name: { type: "string", description: "Friendly name for the schedule" },
479
- cron: { type: "string", description: "Cron expression, e.g. '0 9 * * 1' for every Monday 9am UTC" },
480
- task: { type: "string", description: "What the agent should do on each run" },
481
- },
482
- required: ["appId", "name", "cron", "task"],
483
- },
484
- },
485
- {
486
- name: "vibekit_delete_app_schedule",
487
- description: "Delete a cron schedule from an app.",
488
- inputSchema: {
489
- type: "object",
490
- properties: {
491
- appId: { type: "string", description: "App ID or subdomain slug" },
492
- jobId: { type: "string", description: "Schedule job ID to delete" },
493
- },
494
- required: ["appId", "jobId"],
495
- },
496
- },
497
- // ── Tasks (async coding tasks) ───────────────────────────────────────────────
329
+ // Tasks (existing)
498
330
  {
499
331
  name: "vibekit_submit_task",
500
- description: "Submit an async coding task to VibeKit. The AI will write code, commit to GitHub, and optionally deploy. Returns a task ID to poll for results.",
332
+ description: "Submit a coding task to VibeKit. The AI will write code, commit to GitHub, and deploy to {subdomain}.vibekit.bot. Returns a task ID to poll for results.",
501
333
  inputSchema: {
502
334
  type: "object",
503
335
  properties: {
504
- task: { type: "string", description: "What you want built or changed. Be specific." },
505
- repo: { type: "string", description: "GitHub repo in format 'owner/repo'" },
506
- branch: { type: "string", description: "Git branch to work on (default: main)" },
507
- deploy: { type: "boolean", description: "Auto-deploy when done (default: true)" },
508
- callbackUrl: { type: "string", description: "Webhook URL to receive completion notification" },
336
+ task: {
337
+ type: "string",
338
+ description: "What you want built or changed. Be specific about features, design, and behavior.",
339
+ },
340
+ repo: {
341
+ type: "string",
342
+ description: "GitHub repo in format 'owner/repo'. Optional — will use user's current repo if not specified.",
343
+ },
344
+ branch: {
345
+ type: "string",
346
+ description: "Git branch to work on. Default: main",
347
+ },
348
+ deploy: {
349
+ type: "boolean",
350
+ description: "Auto-deploy to Vercel when done. Default: true",
351
+ },
352
+ callbackUrl: {
353
+ type: "string",
354
+ description: "Webhook URL to receive task completion notification.",
355
+ },
509
356
  },
510
357
  required: ["task"],
511
358
  },
@@ -516,7 +363,10 @@ const tools = [
516
363
  inputSchema: {
517
364
  type: "object",
518
365
  properties: {
519
- taskId: { type: "string", description: "Task ID from vibekit_submit_task" },
366
+ taskId: {
367
+ type: "string",
368
+ description: "The task ID returned from vibekit_submit_task",
369
+ },
520
370
  },
521
371
  required: ["taskId"],
522
372
  },
@@ -527,82 +377,116 @@ const tools = [
527
377
  inputSchema: {
528
378
  type: "object",
529
379
  properties: {
530
- limit: { type: "number", description: "Max tasks to return (default: 10)" },
380
+ limit: {
381
+ type: "number",
382
+ description: "Max number of tasks to return. Default: 10",
383
+ },
531
384
  status: {
532
385
  type: "string",
533
- enum: ["pending", "running", "complete", "failed"],
534
- description: "Filter by status. Note: completed tasks have status 'complete' (not 'completed')",
386
+ enum: ["pending", "running", "completed", "failed"],
387
+ description: "Filter by status",
535
388
  },
536
389
  },
537
390
  },
538
391
  },
539
392
  {
540
393
  name: "vibekit_wait_for_task",
541
- description: "Wait for a task to complete, polling every 5 seconds.",
394
+ description: "Wait for a task to complete and return the result. Polls every 5 seconds up to the timeout.",
542
395
  inputSchema: {
543
396
  type: "object",
544
397
  properties: {
545
- taskId: { type: "string", description: "Task ID to wait for" },
546
- timeoutSeconds: { type: "number", description: "Max seconds to wait (default: 300)" },
398
+ taskId: {
399
+ type: "string",
400
+ description: "The task ID to wait for",
401
+ },
402
+ timeoutSeconds: {
403
+ type: "number",
404
+ description: "Max seconds to wait. Default: 300 (5 minutes)",
405
+ },
547
406
  },
548
407
  required: ["taskId"],
549
408
  },
550
409
  },
551
- // ── Account-level Schedules ───────────────────────────────────────────────────
552
410
  {
553
411
  name: "vibekit_create_schedule",
554
- description: "Create a recurring coding task schedule (GitHub-based, not app-agent based).",
412
+ description: "Create a scheduled recurring task. The AI will run this task automatically on the specified schedule.",
555
413
  inputSchema: {
556
414
  type: "object",
557
415
  properties: {
558
- task: { type: "string", description: "What to do on each run" },
559
- repo: { type: "string", description: "GitHub repo in format 'owner/repo'" },
560
- cron: { type: "string", description: "Cron expression, e.g. '0 9 * * 1'" },
561
- name: { type: "string", description: "Friendly name for this schedule" },
416
+ task: {
417
+ type: "string",
418
+ description: "What to do on each run. e.g., 'Improve SEO and page speed'",
419
+ },
420
+ repo: {
421
+ type: "string",
422
+ description: "GitHub repo in format 'owner/repo'",
423
+ },
424
+ cron: {
425
+ type: "string",
426
+ description: "Cron expression. e.g., '0 9 * * 1' for every Monday at 9am UTC",
427
+ },
428
+ name: {
429
+ type: "string",
430
+ description: "Friendly name for the schedule",
431
+ },
562
432
  },
563
433
  required: ["task", "repo", "cron"],
564
434
  },
565
435
  },
566
436
  {
567
437
  name: "vibekit_list_schedules",
568
- description: "List all account-level recurring task schedules.",
569
- inputSchema: { type: "object", properties: {} },
438
+ description: "List all scheduled tasks.",
439
+ inputSchema: {
440
+ type: "object",
441
+ properties: {},
442
+ },
570
443
  },
571
444
  {
572
445
  name: "vibekit_delete_schedule",
573
- description: "Delete an account-level recurring schedule.",
446
+ description: "Delete a scheduled task.",
574
447
  inputSchema: {
575
448
  type: "object",
576
449
  properties: {
577
- scheduleId: { type: "string", description: "Schedule ID to delete" },
450
+ scheduleId: {
451
+ type: "string",
452
+ description: "The schedule ID to delete",
453
+ },
578
454
  },
579
455
  required: ["scheduleId"],
580
456
  },
581
457
  },
582
- // ── Account ──────────────────────────────────────────────────────────────────
458
+ // Account
583
459
  {
584
460
  name: "vibekit_account",
585
- description: "Get VibeKit account info plan, credits balance, session usage, and limits.",
586
- inputSchema: { type: "object", properties: {} },
461
+ description: "Get VibeKit account info including plan, credits balance, and usage.",
462
+ inputSchema: {
463
+ type: "object",
464
+ properties: {},
465
+ },
587
466
  },
588
- // ── Skills ───────────────────────────────────────────────────────────────────
589
467
  {
590
468
  name: "vibekit_list_skills",
591
- description: "List available implementation skills. Skills contain code patterns and best practices for specific domains.",
469
+ 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.",
592
470
  inputSchema: {
593
471
  type: "object",
594
472
  properties: {
595
- tag: { type: "string", description: "Filter by tag (e.g. 'react', 'database', 'security')" },
473
+ tag: {
474
+ type: "string",
475
+ description: "Filter skills by tag (e.g., 'react', 'database', 'security')",
476
+ },
596
477
  },
597
478
  },
598
479
  },
599
480
  {
600
481
  name: "vibekit_get_skill",
601
- description: "Fetch the full content of a specific skill. Use vibekit_list_skills to discover available skill IDs.",
482
+ 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.",
602
483
  inputSchema: {
603
484
  type: "object",
604
485
  properties: {
605
- id: { type: "string", description: "Skill ID (e.g. 'nextjs', 'trpc', 'auth')" },
486
+ id: {
487
+ type: "string",
488
+ description: "Skill ID from vibekit_list_skills (e.g., 'nextjs', 'trpc', 'auth')",
489
+ },
606
490
  },
607
491
  required: ["id"],
608
492
  },
@@ -612,7 +496,7 @@ const tools = [
612
496
  async function handleTool(name, args) {
613
497
  let result;
614
498
  switch (name) {
615
- // Apps
499
+ // Hosting & Apps
616
500
  case "vibekit_list_apps":
617
501
  result = await apiRequest("GET", "/hosting/apps");
618
502
  break;
@@ -634,15 +518,15 @@ async function handleTool(name, args) {
634
518
  case "vibekit_redeploy":
635
519
  result = await apiRequest("POST", `/hosting/app/${args.appId}/redeploy`);
636
520
  break;
637
- case "vibekit_rollback":
638
- result = await apiRequest("POST", `/hosting/app/${args.appId}/deploys/${args.deployId}/rollback`);
639
- break;
640
- case "vibekit_deploy_history":
641
- result = await apiRequest("GET", `/hosting/app/${args.appId}/deploys`);
642
- break;
643
521
  case "vibekit_app_logs": {
644
- const lines = args.lines || 100;
645
- result = await apiRequest("GET", `/hosting/app/${args.appId}/logs?lines=${lines}`);
522
+ let path = `/hosting/app/${args.appId}/logs`;
523
+ if (args.lines) {
524
+ path += `?lines=${args.lines}`;
525
+ }
526
+ else {
527
+ path += "?lines=100";
528
+ }
529
+ result = await apiRequest("GET", path);
646
530
  break;
647
531
  }
648
532
  case "vibekit_restart_app":
@@ -654,22 +538,18 @@ async function handleTool(name, args) {
654
538
  case "vibekit_start_app":
655
539
  result = await apiRequest("POST", `/hosting/app/${args.appId}/start`);
656
540
  break;
657
- case "vibekit_delete_app":
658
- result = await apiRequest("DELETE", `/hosting/app/${args.appId}`);
659
- break;
660
- // Env
661
541
  case "vibekit_app_env":
662
- result = await apiRequest("GET", `/hosting/app/${args.appId}/env?reveal=true`);
542
+ result = await apiRequest("GET", `/hosting/app/${args.appId}/env`);
663
543
  break;
664
544
  case "vibekit_set_env":
665
545
  result = await apiRequest("PUT", `/hosting/app/${args.appId}/env`, {
666
546
  vars: args.vars,
667
547
  });
668
548
  break;
669
- case "vibekit_delete_env":
670
- result = await apiRequest("DELETE", `/hosting/app/${args.appId}/env/${args.key}`);
549
+ case "vibekit_delete_app":
550
+ result = await apiRequest("DELETE", `/hosting/app/${args.appId}`);
671
551
  break;
672
- // Agent
552
+ // AI Agent
673
553
  case "vibekit_chat":
674
554
  result = await apiRequest("POST", `/hosting/app/${args.appId}/agent`, {
675
555
  message: args.message,
@@ -678,55 +558,17 @@ async function handleTool(name, args) {
678
558
  case "vibekit_agent_status":
679
559
  result = await apiRequest("GET", `/hosting/app/${args.appId}/agent/status`);
680
560
  break;
681
- case "vibekit_agent_stop":
682
- result = await apiRequest("POST", `/hosting/app/${args.appId}/agent/stop`);
683
- break;
684
561
  case "vibekit_agent_history": {
685
- const limit = args.limit || 20;
686
- result = await apiRequest("GET", `/hosting/app/${args.appId}/agent/history?limit=${limit}`);
687
- break;
688
- }
689
- case "vibekit_agent_config":
690
- result = await apiRequest("GET", `/hosting/app/${args.appId}/agent/config`);
691
- break;
692
- case "vibekit_agent_set_model":
693
- result = await apiRequest("POST", `/hosting/app/${args.appId}/agent/config`, {
694
- model: args.model,
695
- });
696
- break;
697
- case "vibekit_exec":
698
- result = await apiRequest("POST", `/hosting/app/${args.appId}/exec`, {
699
- command: args.command,
700
- });
701
- break;
702
- case "vibekit_agent_reset":
703
- result = await apiRequest("POST", `/hosting/app/${args.appId}/agent/reset`, {
704
- action: args.action,
705
- });
706
- break;
707
- case "vibekit_agent_compact":
708
- result = await apiRequest("POST", `/hosting/app/${args.appId}/agent/compact`);
709
- break;
710
- // Files
711
- case "vibekit_list_files": {
712
- let path = `/hosting/app/${args.appId}/agent/files`;
713
- if (args.path)
714
- path += `?path=${encodeURIComponent(args.path)}`;
562
+ let path = `/hosting/app/${args.appId}/agent/history`;
563
+ if (args.limit) {
564
+ path += `?limit=${args.limit}`;
565
+ }
566
+ else {
567
+ path += "?limit=20";
568
+ }
715
569
  result = await apiRequest("GET", path);
716
570
  break;
717
571
  }
718
- case "vibekit_read_file":
719
- result = await apiRequest("GET", `/hosting/app/${args.appId}/agent/file?path=${encodeURIComponent(args.path)}`);
720
- break;
721
- case "vibekit_write_file":
722
- result = await apiRequest("PUT", `/hosting/app/${args.appId}/agent/file`, {
723
- path: args.path,
724
- content: args.content,
725
- });
726
- break;
727
- case "vibekit_file_changes":
728
- result = await apiRequest("GET", `/hosting/app/${args.appId}/agent/changes`);
729
- break;
730
572
  // Database
731
573
  case "vibekit_enable_database":
732
574
  result = await apiRequest("POST", `/hosting/app/${args.appId}/database`);
@@ -734,23 +576,6 @@ async function handleTool(name, args) {
734
576
  case "vibekit_database_status":
735
577
  result = await apiRequest("GET", `/hosting/app/${args.appId}/database`);
736
578
  break;
737
- case "vibekit_database_schema":
738
- result = await apiRequest("GET", `/hosting/app/${args.appId}/database/schema`);
739
- break;
740
- case "vibekit_database_query":
741
- result = await apiRequest("POST", `/hosting/app/${args.appId}/database/query`, {
742
- sql: args.sql,
743
- });
744
- break;
745
- // Domain
746
- case "vibekit_add_domain":
747
- result = await apiRequest("POST", `/hosting/app/${args.appId}/domain`, {
748
- domain: args.domain,
749
- });
750
- break;
751
- case "vibekit_remove_domain":
752
- result = await apiRequest("DELETE", `/hosting/app/${args.appId}/domain`);
753
- break;
754
579
  // QA
755
580
  case "vibekit_run_qa":
756
581
  result = await apiRequest("POST", `/hosting/app/${args.appId}/qa`);
@@ -758,24 +583,10 @@ async function handleTool(name, args) {
758
583
  case "vibekit_qa_status":
759
584
  result = await apiRequest("GET", `/hosting/app/${args.appId}/qa`);
760
585
  break;
761
- // App-level schedules
762
- case "vibekit_app_schedules":
763
- result = await apiRequest("GET", `/hosting/app/${args.appId}/schedules`);
764
- break;
765
- case "vibekit_create_app_schedule":
766
- result = await apiRequest("POST", `/hosting/app/${args.appId}/schedules`, {
767
- name: args.name,
768
- cron_expression: args.cron, // API field is "cron_expression", not "cron"
769
- prompt: args.task, // API field is "prompt", not "task"
770
- });
771
- break;
772
- case "vibekit_delete_app_schedule":
773
- result = await apiRequest("DELETE", `/hosting/app/${args.appId}/schedules/${args.jobId}`);
774
- break;
775
- // Tasks
586
+ // Tasks (existing)
776
587
  case "vibekit_submit_task":
777
588
  result = await apiRequest("POST", "/task", {
778
- prompt: args.task, // API field is "prompt", not "task"
589
+ task: args.task,
779
590
  repo: args.repo,
780
591
  branch: args.branch,
781
592
  deploy: args.deploy ?? true,
@@ -786,35 +597,36 @@ async function handleTool(name, args) {
786
597
  result = await apiRequest("GET", `/task/${args.taskId}`);
787
598
  break;
788
599
  case "vibekit_list_tasks": {
600
+ let path = "/tasks";
789
601
  const params = new URLSearchParams();
790
602
  if (args.limit)
791
603
  params.set("limit", String(args.limit));
792
604
  if (args.status)
793
605
  params.set("status", String(args.status));
794
- const qs = params.toString();
795
- result = await apiRequest("GET", `/tasks${qs ? `?${qs}` : ""}`);
606
+ if (params.toString())
607
+ path += `?${params.toString()}`;
608
+ result = await apiRequest("GET", path);
796
609
  break;
797
610
  }
798
611
  case "vibekit_wait_for_task": {
799
612
  const taskId = args.taskId;
800
613
  const timeout = (args.timeoutSeconds || 300) * 1000;
801
614
  const start = Date.now();
802
- result = { ok: false, error: "Timeout waiting for task" };
803
615
  while (Date.now() - start < timeout) {
804
- const poll = await apiRequest("GET", `/task/${taskId}`);
805
- if (!poll.ok) {
806
- result = poll;
616
+ result = await apiRequest("GET", `/task/${taskId}`);
617
+ if (!result.ok)
807
618
  break;
808
- }
809
- const task = poll.data;
810
- result = poll;
811
- if (task.status === "complete" || task.status === "completed" || task.status === "failed")
619
+ const task = result.data;
620
+ if (task.status === "completed" || task.status === "failed") {
812
621
  break;
622
+ }
813
623
  await new Promise((r) => setTimeout(r, 5000));
814
624
  }
625
+ if (!result) {
626
+ result = { ok: false, error: "Timeout waiting for task" };
627
+ }
815
628
  break;
816
629
  }
817
- // Account-level schedules
818
630
  case "vibekit_create_schedule":
819
631
  result = await apiRequest("POST", "/schedule", {
820
632
  task: args.task,
@@ -833,16 +645,18 @@ async function handleTool(name, args) {
833
645
  case "vibekit_account":
834
646
  result = await apiRequest("GET", "/account");
835
647
  break;
836
- // Skills
837
648
  case "vibekit_list_skills": {
838
649
  try {
650
+ // Check cache
839
651
  if (skillsCache && Date.now() - skillsCache.fetchedAt < CACHE_TTL) {
840
652
  let skills = skillsCache.manifest.skills;
841
- if (args.tag)
653
+ if (args.tag) {
842
654
  skills = skills.filter((s) => s.tags?.includes(args.tag));
843
- result = { ok: true, data: { skills, count: skills.length } };
655
+ }
656
+ result = { ok: true, data: { skills } };
844
657
  break;
845
658
  }
659
+ // Fetch manifest
846
660
  const res = await fetch(`${SKILLS_REGISTRY}/skills.json`);
847
661
  if (!res.ok) {
848
662
  result = { ok: false, error: `Failed to fetch skills: ${res.status}` };
@@ -851,8 +665,9 @@ async function handleTool(name, args) {
851
665
  const manifest = await res.json();
852
666
  skillsCache = { manifest, fetchedAt: Date.now() };
853
667
  let skills = manifest.skills;
854
- if (args.tag)
668
+ if (args.tag) {
855
669
  skills = skills.filter((s) => s.tags?.includes(args.tag));
670
+ }
856
671
  result = { ok: true, data: { skills, count: skills.length } };
857
672
  }
858
673
  catch (err) {
@@ -888,13 +703,25 @@ async function handleTool(name, args) {
888
703
  : `Error: ${result.error}`;
889
704
  return { content: [{ type: "text", text }] };
890
705
  }
891
- // Server setup
892
- const server = new index_js_1.Server({ name: "vibekit-mcp", version: "0.5.0" }, { capabilities: { tools: {} } });
893
- server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({ tools }));
706
+ // Main server setup
707
+ const server = new index_js_1.Server({
708
+ name: "vibekit-mcp",
709
+ version: "0.5.5",
710
+ }, {
711
+ capabilities: {
712
+ tools: {},
713
+ },
714
+ });
715
+ // Handle tool listing
716
+ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
717
+ tools,
718
+ }));
719
+ // Handle tool calls
894
720
  server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
895
721
  const { name, arguments: args } = request.params;
896
722
  return handleTool(name, (args || {}));
897
723
  });
724
+ // Start server
898
725
  async function main() {
899
726
  const transport = new stdio_js_1.StdioServerTransport();
900
727
  await server.connect(transport);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibekit-mcp",
3
- "version": "0.5.3",
3
+ "version": "0.5.5",
4
4
  "description": "MCP server for VibeKit — deploy apps, manage hosting, chat with AI agents, and run coding tasks from Claude Desktop, Cursor, and other MCP clients.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -39,4 +39,4 @@
39
39
  "@types/node": "^20.0.0",
40
40
  "typescript": "^5.0.0"
41
41
  }
42
- }
42
+ }