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