vibekit-mcp 0.4.1 → 0.5.1

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 +420 -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,219 @@ 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" },
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" },
170
168
  },
171
169
  required: ["appId"],
172
170
  },
173
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" },
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 agent — clears sessions and restarts the agent process. Use when the agent is stuck.",
293
+ inputSchema: {
294
+ type: "object",
295
+ properties: {
296
+ appId: { type: "string", description: "App ID or subdomain slug" },
297
+ },
298
+ required: ["appId"],
299
+ },
300
+ },
301
+ {
302
+ name: "vibekit_agent_compact",
303
+ description: "Compact the agent's memory to free up context window space. Useful for long-running agents.",
304
+ inputSchema: {
305
+ type: "object",
306
+ properties: {
307
+ appId: { type: "string", description: "App ID or subdomain slug" },
308
+ },
309
+ required: ["appId"],
310
+ },
311
+ },
312
+ // ── Files ────────────────────────────────────────────────────────────────────
313
+ {
314
+ name: "vibekit_list_files",
315
+ description: "List files in an app's workspace directory.",
316
+ inputSchema: {
317
+ type: "object",
318
+ properties: {
319
+ appId: { type: "string", description: "App ID or subdomain slug" },
320
+ path: { type: "string", description: "Directory path to list (default: root)" },
321
+ },
322
+ required: ["appId"],
323
+ },
324
+ },
325
+ {
326
+ name: "vibekit_read_file",
327
+ description: "Read the contents of a file in an app's workspace.",
328
+ inputSchema: {
329
+ type: "object",
330
+ properties: {
331
+ appId: { type: "string", description: "App ID or subdomain slug" },
332
+ path: { type: "string", description: "File path relative to workspace root, e.g. 'src/index.ts'" },
333
+ },
334
+ required: ["appId", "path"],
335
+ },
336
+ },
337
+ {
338
+ name: "vibekit_write_file",
339
+ description: "Write or update a file in an app's workspace. Use this to edit code directly.",
340
+ inputSchema: {
341
+ type: "object",
342
+ properties: {
343
+ appId: { type: "string", description: "App ID or subdomain slug" },
344
+ path: { type: "string", description: "File path relative to workspace root, e.g. 'src/index.ts'" },
345
+ content: { type: "string", description: "Full file content to write" },
346
+ },
347
+ required: ["appId", "path", "content"],
348
+ },
349
+ },
350
+ {
351
+ name: "vibekit_file_changes",
352
+ description: "Get a diff of recent file changes in an app's workspace (uncommitted changes).",
353
+ inputSchema: {
354
+ type: "object",
355
+ properties: {
356
+ appId: { type: "string", description: "App ID or subdomain slug" },
267
357
  },
268
358
  required: ["appId"],
269
359
  },
270
360
  },
271
- // Database
361
+ // ── Database ─────────────────────────────────────────────────────────────────
272
362
  {
273
363
  name: "vibekit_enable_database",
274
- description: "Enable database for a hosted app.",
364
+ description: "Enable a managed Postgres database for an app. Free tier users need the database add-on.",
275
365
  inputSchema: {
276
366
  type: "object",
277
367
  properties: {
278
- appId: {
279
- type: "string",
280
- description: "The app ID to enable database for",
281
- },
368
+ appId: { type: "string", description: "App ID or subdomain slug" },
282
369
  },
283
370
  required: ["appId"],
284
371
  },
@@ -289,70 +376,131 @@ const tools = [
289
376
  inputSchema: {
290
377
  type: "object",
291
378
  properties: {
292
- appId: {
293
- type: "string",
294
- description: "The app ID to get database status for",
295
- },
379
+ appId: { type: "string", description: "App ID or subdomain slug" },
380
+ },
381
+ required: ["appId"],
382
+ },
383
+ },
384
+ {
385
+ name: "vibekit_database_schema",
386
+ description: "Get the database schema (tables and columns) for an app's database.",
387
+ inputSchema: {
388
+ type: "object",
389
+ properties: {
390
+ appId: { type: "string", description: "App ID or subdomain slug" },
391
+ },
392
+ required: ["appId"],
393
+ },
394
+ },
395
+ {
396
+ name: "vibekit_database_query",
397
+ description: "Run a SQL query against an app's database. Read-only queries are always safe; write queries modify data.",
398
+ inputSchema: {
399
+ type: "object",
400
+ properties: {
401
+ appId: { type: "string", description: "App ID or subdomain slug" },
402
+ sql: { type: "string", description: "SQL query to execute, e.g. 'SELECT * FROM users LIMIT 10'" },
403
+ },
404
+ required: ["appId", "sql"],
405
+ },
406
+ },
407
+ // ── Domain ───────────────────────────────────────────────────────────────────
408
+ {
409
+ name: "vibekit_add_domain",
410
+ description: "Add a custom domain to an app. After adding, update your DNS CNAME to point to vibekit.bot.",
411
+ inputSchema: {
412
+ type: "object",
413
+ properties: {
414
+ appId: { type: "string", description: "App ID or subdomain slug" },
415
+ domain: { type: "string", description: "Custom domain to add, e.g. 'myapp.com'" },
416
+ },
417
+ required: ["appId", "domain"],
418
+ },
419
+ },
420
+ {
421
+ name: "vibekit_remove_domain",
422
+ description: "Remove a custom domain from an app.",
423
+ inputSchema: {
424
+ type: "object",
425
+ properties: {
426
+ appId: { type: "string", description: "App ID or subdomain slug" },
296
427
  },
297
428
  required: ["appId"],
298
429
  },
299
430
  },
300
- // QA
431
+ // ── QA ───────────────────────────────────────────────────────────────────────
301
432
  {
302
433
  name: "vibekit_run_qa",
303
- description: "Run automated QA tests on a hosted app.",
434
+ description: "Run automated QA tests on a hosted app. Takes a screenshot and tests key flows.",
304
435
  inputSchema: {
305
436
  type: "object",
306
437
  properties: {
307
- appId: {
308
- type: "string",
309
- description: "The app ID to run QA tests for",
310
- },
438
+ appId: { type: "string", description: "App ID or subdomain slug" },
311
439
  },
312
440
  required: ["appId"],
313
441
  },
314
442
  },
315
443
  {
316
444
  name: "vibekit_qa_status",
317
- description: "Get QA test results and status for an app.",
445
+ description: "Get the latest QA test results for an app.",
318
446
  inputSchema: {
319
447
  type: "object",
320
448
  properties: {
321
- appId: {
322
- type: "string",
323
- description: "The app ID to get QA status for",
324
- },
449
+ appId: { type: "string", description: "App ID or subdomain slug" },
450
+ },
451
+ required: ["appId"],
452
+ },
453
+ },
454
+ // ── Schedules (app-level cron jobs) ──────────────────────────────────────────
455
+ {
456
+ name: "vibekit_app_schedules",
457
+ description: "List cron schedules configured for an app's agent.",
458
+ inputSchema: {
459
+ type: "object",
460
+ properties: {
461
+ appId: { type: "string", description: "App ID or subdomain slug" },
325
462
  },
326
463
  required: ["appId"],
327
464
  },
328
465
  },
329
- // Tasks (existing)
466
+ {
467
+ name: "vibekit_create_app_schedule",
468
+ description: "Create a cron schedule for an app's agent (e.g. daily report, nightly cleanup).",
469
+ inputSchema: {
470
+ type: "object",
471
+ properties: {
472
+ appId: { type: "string", description: "App ID or subdomain slug" },
473
+ name: { type: "string", description: "Friendly name for the schedule" },
474
+ cron: { type: "string", description: "Cron expression, e.g. '0 9 * * 1' for every Monday 9am UTC" },
475
+ task: { type: "string", description: "What the agent should do on each run" },
476
+ },
477
+ required: ["appId", "name", "cron", "task"],
478
+ },
479
+ },
480
+ {
481
+ name: "vibekit_delete_app_schedule",
482
+ description: "Delete a cron schedule from an app.",
483
+ inputSchema: {
484
+ type: "object",
485
+ properties: {
486
+ appId: { type: "string", description: "App ID or subdomain slug" },
487
+ jobId: { type: "string", description: "Schedule job ID to delete" },
488
+ },
489
+ required: ["appId", "jobId"],
490
+ },
491
+ },
492
+ // ── Tasks (async coding tasks) ───────────────────────────────────────────────
330
493
  {
331
494
  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.",
495
+ 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
496
  inputSchema: {
334
497
  type: "object",
335
498
  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
- },
499
+ task: { type: "string", description: "What you want built or changed. Be specific." },
500
+ repo: { type: "string", description: "GitHub repo in format 'owner/repo'" },
501
+ branch: { type: "string", description: "Git branch to work on (default: main)" },
502
+ deploy: { type: "boolean", description: "Auto-deploy when done (default: true)" },
503
+ callbackUrl: { type: "string", description: "Webhook URL to receive completion notification" },
356
504
  },
357
505
  required: ["task"],
358
506
  },
@@ -363,10 +511,7 @@ const tools = [
363
511
  inputSchema: {
364
512
  type: "object",
365
513
  properties: {
366
- taskId: {
367
- type: "string",
368
- description: "The task ID returned from vibekit_submit_task",
369
- },
514
+ taskId: { type: "string", description: "Task ID from vibekit_submit_task" },
370
515
  },
371
516
  required: ["taskId"],
372
517
  },
@@ -377,10 +522,7 @@ const tools = [
377
522
  inputSchema: {
378
523
  type: "object",
379
524
  properties: {
380
- limit: {
381
- type: "number",
382
- description: "Max number of tasks to return. Default: 10",
383
- },
525
+ limit: { type: "number", description: "Max tasks to return (default: 10)" },
384
526
  status: {
385
527
  type: "string",
386
528
  enum: ["pending", "running", "completed", "failed"],
@@ -391,102 +533,71 @@ const tools = [
391
533
  },
392
534
  {
393
535
  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.",
536
+ description: "Wait for a task to complete, polling every 5 seconds.",
395
537
  inputSchema: {
396
538
  type: "object",
397
539
  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
- },
540
+ taskId: { type: "string", description: "Task ID to wait for" },
541
+ timeoutSeconds: { type: "number", description: "Max seconds to wait (default: 300)" },
406
542
  },
407
543
  required: ["taskId"],
408
544
  },
409
545
  },
546
+ // ── Account-level Schedules ───────────────────────────────────────────────────
410
547
  {
411
548
  name: "vibekit_create_schedule",
412
- description: "Create a scheduled recurring task. The AI will run this task automatically on the specified schedule.",
549
+ description: "Create a recurring coding task schedule (GitHub-based, not app-agent based).",
413
550
  inputSchema: {
414
551
  type: "object",
415
552
  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
- },
553
+ task: { type: "string", description: "What to do on each run" },
554
+ repo: { type: "string", description: "GitHub repo in format 'owner/repo'" },
555
+ cron: { type: "string", description: "Cron expression, e.g. '0 9 * * 1'" },
556
+ name: { type: "string", description: "Friendly name for this schedule" },
432
557
  },
433
558
  required: ["task", "repo", "cron"],
434
559
  },
435
560
  },
436
561
  {
437
562
  name: "vibekit_list_schedules",
438
- description: "List all scheduled tasks.",
439
- inputSchema: {
440
- type: "object",
441
- properties: {},
442
- },
563
+ description: "List all account-level recurring task schedules.",
564
+ inputSchema: { type: "object", properties: {} },
443
565
  },
444
566
  {
445
567
  name: "vibekit_delete_schedule",
446
- description: "Delete a scheduled task.",
568
+ description: "Delete an account-level recurring schedule.",
447
569
  inputSchema: {
448
570
  type: "object",
449
571
  properties: {
450
- scheduleId: {
451
- type: "string",
452
- description: "The schedule ID to delete",
453
- },
572
+ scheduleId: { type: "string", description: "Schedule ID to delete" },
454
573
  },
455
574
  required: ["scheduleId"],
456
575
  },
457
576
  },
458
- // Account
577
+ // ── Account ──────────────────────────────────────────────────────────────────
459
578
  {
460
579
  name: "vibekit_account",
461
- description: "Get VibeKit account info including plan, credits balance, and usage.",
462
- inputSchema: {
463
- type: "object",
464
- properties: {},
465
- },
580
+ description: "Get VibeKit account info plan, credits balance, session usage, and limits.",
581
+ inputSchema: { type: "object", properties: {} },
466
582
  },
583
+ // ── Skills ───────────────────────────────────────────────────────────────────
467
584
  {
468
585
  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.",
586
+ description: "List available implementation skills. Skills contain code patterns and best practices for specific domains.",
470
587
  inputSchema: {
471
588
  type: "object",
472
589
  properties: {
473
- tag: {
474
- type: "string",
475
- description: "Filter skills by tag (e.g., 'react', 'database', 'security')",
476
- },
590
+ tag: { type: "string", description: "Filter by tag (e.g. 'react', 'database', 'security')" },
477
591
  },
478
592
  },
479
593
  },
480
594
  {
481
595
  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.",
596
+ description: "Fetch the full content of a specific skill. Use vibekit_list_skills to discover available skill IDs.",
483
597
  inputSchema: {
484
598
  type: "object",
485
599
  properties: {
486
- id: {
487
- type: "string",
488
- description: "Skill ID from vibekit_list_skills (e.g., 'nextjs', 'trpc', 'auth')",
489
- },
600
+ id: { type: "string", description: "Skill ID (e.g. 'nextjs', 'trpc', 'auth')" },
490
601
  },
491
602
  required: ["id"],
492
603
  },
@@ -496,7 +607,7 @@ const tools = [
496
607
  async function handleTool(name, args) {
497
608
  let result;
498
609
  switch (name) {
499
- // Hosting & Apps
610
+ // Apps
500
611
  case "vibekit_list_apps":
501
612
  result = await apiRequest("GET", "/hosting/apps");
502
613
  break;
@@ -518,15 +629,15 @@ async function handleTool(name, args) {
518
629
  case "vibekit_redeploy":
519
630
  result = await apiRequest("POST", `/hosting/app/${args.appId}/redeploy`);
520
631
  break;
632
+ case "vibekit_rollback":
633
+ result = await apiRequest("POST", `/hosting/app/${args.appId}/deploys/${args.deployId}/rollback`);
634
+ break;
635
+ case "vibekit_deploy_history":
636
+ result = await apiRequest("GET", `/hosting/app/${args.appId}/deploys`);
637
+ break;
521
638
  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);
639
+ const lines = args.lines || 100;
640
+ result = await apiRequest("GET", `/hosting/app/${args.appId}/logs?lines=${lines}`);
530
641
  break;
531
642
  }
532
643
  case "vibekit_restart_app":
@@ -538,6 +649,10 @@ async function handleTool(name, args) {
538
649
  case "vibekit_start_app":
539
650
  result = await apiRequest("POST", `/hosting/app/${args.appId}/start`);
540
651
  break;
652
+ case "vibekit_delete_app":
653
+ result = await apiRequest("DELETE", `/hosting/app/${args.appId}`);
654
+ break;
655
+ // Env
541
656
  case "vibekit_app_env":
542
657
  result = await apiRequest("GET", `/hosting/app/${args.appId}/env`);
543
658
  break;
@@ -546,10 +661,10 @@ async function handleTool(name, args) {
546
661
  vars: args.vars,
547
662
  });
548
663
  break;
549
- case "vibekit_delete_app":
550
- result = await apiRequest("DELETE", `/hosting/app/${args.appId}`);
664
+ case "vibekit_delete_env":
665
+ result = await apiRequest("DELETE", `/hosting/app/${args.appId}/env/${args.key}`);
551
666
  break;
552
- // AI Agent
667
+ // Agent
553
668
  case "vibekit_chat":
554
669
  result = await apiRequest("POST", `/hosting/app/${args.appId}/agent`, {
555
670
  message: args.message,
@@ -558,17 +673,53 @@ async function handleTool(name, args) {
558
673
  case "vibekit_agent_status":
559
674
  result = await apiRequest("GET", `/hosting/app/${args.appId}/agent/status`);
560
675
  break;
676
+ case "vibekit_agent_stop":
677
+ result = await apiRequest("POST", `/hosting/app/${args.appId}/agent/stop`);
678
+ break;
561
679
  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
- }
680
+ const limit = args.limit || 20;
681
+ result = await apiRequest("GET", `/hosting/app/${args.appId}/agent/history?limit=${limit}`);
682
+ break;
683
+ }
684
+ case "vibekit_agent_config":
685
+ result = await apiRequest("GET", `/hosting/app/${args.appId}/agent/config`);
686
+ break;
687
+ case "vibekit_agent_set_model":
688
+ result = await apiRequest("POST", `/hosting/app/${args.appId}/agent/config`, {
689
+ model: args.model,
690
+ });
691
+ break;
692
+ case "vibekit_exec":
693
+ result = await apiRequest("POST", `/hosting/app/${args.appId}/exec`, {
694
+ command: args.command,
695
+ });
696
+ break;
697
+ case "vibekit_agent_reset":
698
+ result = await apiRequest("POST", `/hosting/app/${args.appId}/agent/reset`);
699
+ break;
700
+ case "vibekit_agent_compact":
701
+ result = await apiRequest("POST", `/hosting/app/${args.appId}/agent/compact`);
702
+ break;
703
+ // Files
704
+ case "vibekit_list_files": {
705
+ let path = `/hosting/app/${args.appId}/agent/files`;
706
+ if (args.path)
707
+ path += `?path=${encodeURIComponent(args.path)}`;
569
708
  result = await apiRequest("GET", path);
570
709
  break;
571
710
  }
711
+ case "vibekit_read_file":
712
+ result = await apiRequest("GET", `/hosting/app/${args.appId}/agent/file?path=${encodeURIComponent(args.path)}`);
713
+ break;
714
+ case "vibekit_write_file":
715
+ result = await apiRequest("PUT", `/hosting/app/${args.appId}/agent/file`, {
716
+ path: args.path,
717
+ content: args.content,
718
+ });
719
+ break;
720
+ case "vibekit_file_changes":
721
+ result = await apiRequest("GET", `/hosting/app/${args.appId}/agent/changes`);
722
+ break;
572
723
  // Database
573
724
  case "vibekit_enable_database":
574
725
  result = await apiRequest("POST", `/hosting/app/${args.appId}/database`);
@@ -576,6 +727,23 @@ async function handleTool(name, args) {
576
727
  case "vibekit_database_status":
577
728
  result = await apiRequest("GET", `/hosting/app/${args.appId}/database`);
578
729
  break;
730
+ case "vibekit_database_schema":
731
+ result = await apiRequest("GET", `/hosting/app/${args.appId}/database/schema`);
732
+ break;
733
+ case "vibekit_database_query":
734
+ result = await apiRequest("POST", `/hosting/app/${args.appId}/database/query`, {
735
+ sql: args.sql,
736
+ });
737
+ break;
738
+ // Domain
739
+ case "vibekit_add_domain":
740
+ result = await apiRequest("POST", `/hosting/app/${args.appId}/domain`, {
741
+ domain: args.domain,
742
+ });
743
+ break;
744
+ case "vibekit_remove_domain":
745
+ result = await apiRequest("DELETE", `/hosting/app/${args.appId}/domain`);
746
+ break;
579
747
  // QA
580
748
  case "vibekit_run_qa":
581
749
  result = await apiRequest("POST", `/hosting/app/${args.appId}/qa`);
@@ -583,7 +751,21 @@ async function handleTool(name, args) {
583
751
  case "vibekit_qa_status":
584
752
  result = await apiRequest("GET", `/hosting/app/${args.appId}/qa`);
585
753
  break;
586
- // Tasks (existing)
754
+ // App-level schedules
755
+ case "vibekit_app_schedules":
756
+ result = await apiRequest("GET", `/hosting/app/${args.appId}/schedules`);
757
+ break;
758
+ case "vibekit_create_app_schedule":
759
+ result = await apiRequest("POST", `/hosting/app/${args.appId}/schedules`, {
760
+ name: args.name,
761
+ cron: args.cron,
762
+ task: args.task,
763
+ });
764
+ break;
765
+ case "vibekit_delete_app_schedule":
766
+ result = await apiRequest("DELETE", `/hosting/app/${args.appId}/schedules/${args.jobId}`);
767
+ break;
768
+ // Tasks
587
769
  case "vibekit_submit_task":
588
770
  result = await apiRequest("POST", "/task", {
589
771
  task: args.task,
@@ -597,36 +779,35 @@ async function handleTool(name, args) {
597
779
  result = await apiRequest("GET", `/task/${args.taskId}`);
598
780
  break;
599
781
  case "vibekit_list_tasks": {
600
- let path = "/tasks";
601
782
  const params = new URLSearchParams();
602
783
  if (args.limit)
603
784
  params.set("limit", String(args.limit));
604
785
  if (args.status)
605
786
  params.set("status", String(args.status));
606
- if (params.toString())
607
- path += `?${params.toString()}`;
608
- result = await apiRequest("GET", path);
787
+ const qs = params.toString();
788
+ result = await apiRequest("GET", `/tasks${qs ? `?${qs}` : ""}`);
609
789
  break;
610
790
  }
611
791
  case "vibekit_wait_for_task": {
612
792
  const taskId = args.taskId;
613
793
  const timeout = (args.timeoutSeconds || 300) * 1000;
614
794
  const start = Date.now();
795
+ result = { ok: false, error: "Timeout waiting for task" };
615
796
  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") {
797
+ const poll = await apiRequest("GET", `/task/${taskId}`);
798
+ if (!poll.ok) {
799
+ result = poll;
621
800
  break;
622
801
  }
802
+ const task = poll.data;
803
+ result = poll;
804
+ if (task.status === "completed" || task.status === "failed")
805
+ break;
623
806
  await new Promise((r) => setTimeout(r, 5000));
624
807
  }
625
- if (!result) {
626
- result = { ok: false, error: "Timeout waiting for task" };
627
- }
628
808
  break;
629
809
  }
810
+ // Account-level schedules
630
811
  case "vibekit_create_schedule":
631
812
  result = await apiRequest("POST", "/schedule", {
632
813
  task: args.task,
@@ -645,18 +826,16 @@ async function handleTool(name, args) {
645
826
  case "vibekit_account":
646
827
  result = await apiRequest("GET", "/account");
647
828
  break;
829
+ // Skills
648
830
  case "vibekit_list_skills": {
649
831
  try {
650
- // Check cache
651
832
  if (skillsCache && Date.now() - skillsCache.fetchedAt < CACHE_TTL) {
652
833
  let skills = skillsCache.manifest.skills;
653
- if (args.tag) {
834
+ if (args.tag)
654
835
  skills = skills.filter((s) => s.tags?.includes(args.tag));
655
- }
656
- result = { ok: true, data: { skills } };
836
+ result = { ok: true, data: { skills, count: skills.length } };
657
837
  break;
658
838
  }
659
- // Fetch manifest
660
839
  const res = await fetch(`${SKILLS_REGISTRY}/skills.json`);
661
840
  if (!res.ok) {
662
841
  result = { ok: false, error: `Failed to fetch skills: ${res.status}` };
@@ -665,9 +844,8 @@ async function handleTool(name, args) {
665
844
  const manifest = await res.json();
666
845
  skillsCache = { manifest, fetchedAt: Date.now() };
667
846
  let skills = manifest.skills;
668
- if (args.tag) {
847
+ if (args.tag)
669
848
  skills = skills.filter((s) => s.tags?.includes(args.tag));
670
- }
671
849
  result = { ok: true, data: { skills, count: skills.length } };
672
850
  }
673
851
  catch (err) {
@@ -703,25 +881,13 @@ async function handleTool(name, args) {
703
881
  : `Error: ${result.error}`;
704
882
  return { content: [{ type: "text", text }] };
705
883
  }
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
884
+ // Server setup
885
+ const server = new index_js_1.Server({ name: "vibekit-mcp", version: "0.5.0" }, { capabilities: { tools: {} } });
886
+ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({ tools }));
720
887
  server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
721
888
  const { name, arguments: args } = request.params;
722
889
  return handleTool(name, (args || {}));
723
890
  });
724
- // Start server
725
891
  async function main() {
726
892
  const transport = new stdio_js_1.StdioServerTransport();
727
893
  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.1",
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": {