vibekit-mcp 0.7.0 → 0.7.2

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 (4) hide show
  1. package/dist/index.js +42 -3
  2. package/package.json +3 -3
  3. package/tools.json +453 -135
  4. package/LICENSE +0 -21
package/dist/index.js CHANGED
@@ -10,6 +10,9 @@ const SKILLS_REGISTRY = "https://raw.githubusercontent.com/vibekit-apps/skills-r
10
10
  // Skills cache (TTL: 5 minutes)
11
11
  let skillsCache = null;
12
12
  const CACHE_TTL = 5 * 60 * 1000;
13
+ // Max time vibekit_chat blocks before returning a "still working — poll" result,
14
+ // so a long coding turn never outlasts the client timeout and triggers a retry.
15
+ const CHAT_MAX_WAIT_MS = 110_000;
13
16
  // API helper
14
17
  async function apiRequest(method, path, body) {
15
18
  // The server boots and lists its tools without a key (so MCP introspection
@@ -49,9 +52,26 @@ const path_1 = require("path");
49
52
  const TOOLS_MANIFEST_PATH = (0, path_1.join)(__dirname, "..", "tools.json");
50
53
  const tools = JSON.parse((0, fs_1.readFileSync)(TOOLS_MANIFEST_PATH, "utf8")).map((t) => ({
51
54
  name: t.name,
55
+ title: t.title,
52
56
  description: t.description,
53
57
  inputSchema: t.inputSchema,
58
+ annotations: t.annotations,
54
59
  }));
60
+ // Server-level guidance sent in the MCP `initialize` response. Tells the model
61
+ // what VibeKit is and when to reach for these tools — the single strongest
62
+ // signal (after tool descriptions) for tool selection. Keep in sync with the
63
+ // same string in src/routes/mcp.ts (the remote HTTP server).
64
+ const SERVER_INSTRUCTIONS = "VibeKit hosts, deploys, and operates web apps and AI coding agents. Each app runs in its own " +
65
+ "container at <subdomain>.vibekit.bot with optional Postgres, logs, env vars, and automated QA, " +
66
+ "plus a built-in AI agent that can edit the app's code.\n\n" +
67
+ "Use these tools whenever the user wants to: deploy a GitHub repo or starter template and get a " +
68
+ "live URL; list, inspect, restart/stop/start, or delete hosted apps; read logs to debug; manage " +
69
+ "env vars; enable and query an app's Postgres (call vibekit_db_schema before writing SQL); list " +
70
+ "or roll back deploys; run or check QA; chat with an app's AI agent to change its code; or " +
71
+ "submit/schedule autonomous coding tasks that commit to GitHub and deploy.\n\n" +
72
+ "Most tools key off an appId — call vibekit_list_apps first to resolve one. Confirm destructive " +
73
+ "actions (vibekit_delete_app, vibekit_delete_schedule, and write/DDL via vibekit_db_query) with " +
74
+ "the user before calling. Auth uses a VibeKit API key (vk_...) from the Telegram bot's /apikey command.";
55
75
  // Tool handlers
56
76
  async function handleTool(name, args) {
57
77
  let result;
@@ -113,11 +133,28 @@ async function handleTool(name, args) {
113
133
  result = await apiRequest("DELETE", `/hosting/app/${args.appId}`);
114
134
  break;
115
135
  // AI Agent
116
- case "vibekit_chat":
117
- result = await apiRequest("POST", `/hosting/app/${args.appId}/agent`, {
136
+ case "vibekit_chat": {
137
+ // The /agent endpoint runs the whole coding turn synchronously, which can
138
+ // outlast the MCP client's idle timeout → the client retries, producing a
139
+ // duplicate message and losing the reply. Disconnect doesn't abort the run
140
+ // server-side, so we race the call against a bounded wait and, on timeout,
141
+ // return a SUCCESS "still working — poll" result (never an error, so no
142
+ // retry/dupe). The loopback call is NOT aborted; the turn lands in history.
143
+ const callP = apiRequest("POST", `/hosting/app/${args.appId}/agent`, {
118
144
  message: args.message,
119
145
  });
146
+ callP.catch(() => { });
147
+ const pollP = new Promise((resolve) => setTimeout(() => resolve({
148
+ ok: true,
149
+ data: {
150
+ status: "working",
151
+ appId: args.appId,
152
+ note: "Your message was delivered and the agent is still working on it — coding turns can take a few minutes. Do NOT resend the same message. Poll vibekit_agent_status until it's idle, then vibekit_agent_history to read the agent's reply.",
153
+ },
154
+ }), CHAT_MAX_WAIT_MS));
155
+ result = await Promise.race([callP, pollP]);
120
156
  break;
157
+ }
121
158
  case "vibekit_agent_status":
122
159
  result = await apiRequest("GET", `/hosting/app/${args.appId}/agent/status`);
123
160
  break;
@@ -303,11 +340,13 @@ async function handleTool(name, args) {
303
340
  // Main server setup
304
341
  const server = new index_js_1.Server({
305
342
  name: "vibekit-mcp",
306
- version: "0.7.0",
343
+ title: "VibeKit",
344
+ version: "0.7.2",
307
345
  }, {
308
346
  capabilities: {
309
347
  tools: {},
310
348
  },
349
+ instructions: SERVER_INSTRUCTIONS,
311
350
  });
312
351
  // Handle tool listing
313
352
  server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
package/package.json CHANGED
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "name": "vibekit-mcp",
3
- "version": "0.7.0",
4
- "mcpName": "io.github.609NFT/vibekit-mcp",
3
+ "version": "0.7.2",
5
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.",
6
5
  "main": "dist/index.js",
7
6
  "bin": {
@@ -30,7 +29,8 @@
30
29
  "license": "MIT",
31
30
  "repository": {
32
31
  "type": "git",
33
- "url": "https://github.com/609NFT/vibekit-mcp.git"
32
+ "url": "https://github.com/609NFT/vibekit.git",
33
+ "directory": "packages/mcp-server"
34
34
  },
35
35
  "homepage": "https://vibekit.bot",
36
36
  "dependencies": {
package/tools.json CHANGED
@@ -2,428 +2,746 @@
2
2
  {
3
3
  "category": "Hosting & Apps",
4
4
  "name": "vibekit_list_apps",
5
- "description": "List all hosted apps in your VibeKit account.",
6
- "inputSchema": { "type": "object", "properties": {} }
5
+ "title": "VibeKit List Apps",
6
+ "description": "List all hosted apps in your VibeKit account, each with its id, subdomain, status, and live URL. Start here to get an appId for the other app tools.",
7
+ "annotations": { "title": "VibeKit List Apps", "readOnlyHint": true, "idempotentHint": true },
8
+ "inputSchema": {
9
+ "type": "object",
10
+ "properties": {}
11
+ }
7
12
  },
8
13
  {
9
14
  "category": "Hosting & Apps",
10
15
  "name": "vibekit_get_app",
11
- "description": "Get details about a specific hosted app.",
16
+ "title": "VibeKit Get App",
17
+ "description": "Get full details for one hosted app — status, subdomain/URL, repo, runtime, and database/domain config. Use the appId from vibekit_list_apps.",
18
+ "annotations": { "title": "VibeKit Get App", "readOnlyHint": true, "idempotentHint": true },
12
19
  "inputSchema": {
13
20
  "type": "object",
14
21
  "properties": {
15
- "appId": { "type": "string", "description": "The app ID to get details for" }
22
+ "appId": {
23
+ "type": "string",
24
+ "description": "App ID (from vibekit_list_apps)"
25
+ }
16
26
  },
17
- "required": ["appId"]
27
+ "required": [
28
+ "appId"
29
+ ]
18
30
  }
19
31
  },
20
32
  {
21
33
  "category": "Hosting & Apps",
22
34
  "name": "vibekit_create_app",
23
- "description": "Create a new hosted app from a template.",
35
+ "title": "VibeKit Create App",
36
+ "description": "Create a new hosted app from a starter template and deploy it live at <subdomain>.vibekit.bot. Call vibekit_list_templates first to pick a valid template. To deploy existing code from a GitHub repo instead, use vibekit_deploy.",
37
+ "annotations": { "title": "VibeKit Create App", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false },
24
38
  "inputSchema": {
25
39
  "type": "object",
26
40
  "properties": {
27
- "template": { "type": "string", "description": "Template to use (e.g., 'nextjs', 'react', 'express')" },
28
- "subdomain": { "type": "string", "description": "Subdomain for the app (will be deployed to {subdomain}.vibekit.bot)" }
41
+ "template": {
42
+ "type": "string",
43
+ "description": "Template id from vibekit_list_templates (e.g. 'landing', 'dashboard', 'blog', 'saas', 'crud-api')"
44
+ },
45
+ "subdomain": {
46
+ "type": "string",
47
+ "description": "Desired subdomain — the app goes live at <subdomain>.vibekit.bot. Lowercase letters, numbers, and hyphens."
48
+ }
29
49
  },
30
- "required": ["template", "subdomain"]
50
+ "required": [
51
+ "template",
52
+ "subdomain"
53
+ ]
31
54
  }
32
55
  },
33
56
  {
34
57
  "category": "Hosting & Apps",
35
58
  "name": "vibekit_list_templates",
36
- "description": "List available templates for vibekit_create_app (e.g. landing, dashboard, blog, saas, crud-api).",
37
- "inputSchema": { "type": "object", "properties": {} }
59
+ "title": "VibeKit List Templates",
60
+ "description": "List the starter templates available to vibekit_create_app (e.g. landing, dashboard, blog, saas, crud-api). Call this before vibekit_create_app to choose a valid template.",
61
+ "annotations": { "title": "VibeKit List Templates", "readOnlyHint": true, "idempotentHint": true },
62
+ "inputSchema": {
63
+ "type": "object",
64
+ "properties": {}
65
+ }
38
66
  },
39
67
  {
40
68
  "category": "Hosting & Apps",
41
69
  "name": "vibekit_deploy",
42
- "description": "Deploy a GitHub repo to VibeKit hosting.",
70
+ "title": "VibeKit Deploy",
71
+ "description": "Deploy a GitHub repo to VibeKit hosting, live at <subdomain>.vibekit.bot (Fargate container behind nginx, SSL automatic). Use when the code already lives in a GitHub repo; for a starter template instead use vibekit_create_app.",
72
+ "annotations": { "title": "VibeKit Deploy", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false },
43
73
  "inputSchema": {
44
74
  "type": "object",
45
75
  "properties": {
46
- "repo": { "type": "string", "description": "GitHub repo in format 'owner/repo'" },
47
- "subdomain": { "type": "string", "description": "Subdomain for the app (will be deployed to {subdomain}.vibekit.bot)" }
76
+ "repo": {
77
+ "type": "string",
78
+ "description": "GitHub repo as 'owner/repo' (e.g. '609NFT/vibekit')"
79
+ },
80
+ "subdomain": {
81
+ "type": "string",
82
+ "description": "Desired subdomain — the app goes live at <subdomain>.vibekit.bot. Lowercase letters, numbers, and hyphens."
83
+ }
48
84
  },
49
- "required": ["repo", "subdomain"]
85
+ "required": [
86
+ "repo",
87
+ "subdomain"
88
+ ]
50
89
  }
51
90
  },
52
91
  {
53
92
  "category": "Hosting & Apps",
54
93
  "name": "vibekit_redeploy",
55
- "description": "Redeploy an existing hosted app to update it with latest code.",
94
+ "title": "VibeKit Redeploy",
95
+ "description": "Redeploy an existing app to pull and ship the latest code. Use after pushing changes to the app's GitHub repo.",
96
+ "annotations": { "title": "VibeKit Redeploy", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false },
56
97
  "inputSchema": {
57
98
  "type": "object",
58
99
  "properties": {
59
- "appId": { "type": "string", "description": "The app ID to redeploy" }
100
+ "appId": {
101
+ "type": "string",
102
+ "description": "App ID (from vibekit_list_apps)"
103
+ }
60
104
  },
61
- "required": ["appId"]
105
+ "required": [
106
+ "appId"
107
+ ]
62
108
  }
63
109
  },
64
110
  {
65
111
  "category": "Hosting & Apps",
66
112
  "name": "vibekit_app_logs",
67
- "description": "Get application logs for debugging and monitoring.",
113
+ "title": "VibeKit App Logs",
114
+ "description": "Fetch recent container/application logs for an app. Use this to debug crashes, errors, or a deploy that isn't serving.",
115
+ "annotations": { "title": "VibeKit App Logs", "readOnlyHint": true },
68
116
  "inputSchema": {
69
117
  "type": "object",
70
118
  "properties": {
71
- "appId": { "type": "string", "description": "The app ID to get logs for" },
72
- "lines": { "type": "number", "description": "Number of log lines to retrieve (default: 100)" }
119
+ "appId": {
120
+ "type": "string",
121
+ "description": "App ID (from vibekit_list_apps)"
122
+ },
123
+ "lines": {
124
+ "type": "number",
125
+ "description": "Number of log lines to retrieve (default 100)"
126
+ }
73
127
  },
74
- "required": ["appId"]
128
+ "required": [
129
+ "appId"
130
+ ]
75
131
  }
76
132
  },
77
133
  {
78
134
  "category": "Hosting & Apps",
79
135
  "name": "vibekit_restart_app",
80
- "description": "Restart a hosted app.",
136
+ "title": "VibeKit Restart App",
137
+ "description": "Restart a hosted app's container. Use when an app is wedged, or to apply changed environment variables.",
138
+ "annotations": { "title": "VibeKit Restart App", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true },
81
139
  "inputSchema": {
82
140
  "type": "object",
83
141
  "properties": {
84
- "appId": { "type": "string", "description": "The app ID to restart" }
142
+ "appId": {
143
+ "type": "string",
144
+ "description": "App ID (from vibekit_list_apps)"
145
+ }
85
146
  },
86
- "required": ["appId"]
147
+ "required": [
148
+ "appId"
149
+ ]
87
150
  }
88
151
  },
89
152
  {
90
153
  "category": "Hosting & Apps",
91
154
  "name": "vibekit_stop_app",
92
- "description": "Stop a hosted app.",
155
+ "title": "VibeKit Stop App",
156
+ "description": "Stop a hosted app's container. The app stays in your account and can be brought back with vibekit_start_app. Use to take an app offline without deleting it.",
157
+ "annotations": { "title": "VibeKit Stop App", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true },
93
158
  "inputSchema": {
94
159
  "type": "object",
95
160
  "properties": {
96
- "appId": { "type": "string", "description": "The app ID to stop" }
161
+ "appId": {
162
+ "type": "string",
163
+ "description": "App ID (from vibekit_list_apps)"
164
+ }
97
165
  },
98
- "required": ["appId"]
166
+ "required": [
167
+ "appId"
168
+ ]
99
169
  }
100
170
  },
101
171
  {
102
172
  "category": "Hosting & Apps",
103
173
  "name": "vibekit_start_app",
104
- "description": "Start a stopped hosted app.",
174
+ "title": "VibeKit Start App",
175
+ "description": "Start a stopped hosted app's container. Use to bring an app stopped via vibekit_stop_app back online.",
176
+ "annotations": { "title": "VibeKit Start App", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true },
105
177
  "inputSchema": {
106
178
  "type": "object",
107
179
  "properties": {
108
- "appId": { "type": "string", "description": "The app ID to start" }
180
+ "appId": {
181
+ "type": "string",
182
+ "description": "App ID (from vibekit_list_apps)"
183
+ }
109
184
  },
110
- "required": ["appId"]
185
+ "required": [
186
+ "appId"
187
+ ]
111
188
  }
112
189
  },
113
190
  {
114
191
  "category": "Hosting & Apps",
115
192
  "name": "vibekit_app_env",
116
- "description": "Get environment variables for a hosted app.",
193
+ "title": "VibeKit Get Env Vars",
194
+ "description": "Get the environment variables configured for an app (names and values). Read-only — use vibekit_set_env to change them.",
195
+ "annotations": { "title": "VibeKit Get Env Vars", "readOnlyHint": true, "idempotentHint": true },
117
196
  "inputSchema": {
118
197
  "type": "object",
119
198
  "properties": {
120
- "appId": { "type": "string", "description": "The app ID to get environment variables for" }
199
+ "appId": {
200
+ "type": "string",
201
+ "description": "App ID (from vibekit_list_apps)"
202
+ }
121
203
  },
122
- "required": ["appId"]
204
+ "required": [
205
+ "appId"
206
+ ]
123
207
  }
124
208
  },
125
209
  {
126
210
  "category": "Hosting & Apps",
127
211
  "name": "vibekit_set_env",
128
- "description": "Set environment variables for a hosted app.",
212
+ "title": "VibeKit Set Env Vars",
213
+ "description": "Set or update environment variables for an app (merges with existing). The app must be restarted or redeployed for changes to take effect.",
214
+ "annotations": { "title": "VibeKit Set Env Vars", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true },
129
215
  "inputSchema": {
130
216
  "type": "object",
131
217
  "properties": {
132
- "appId": { "type": "string", "description": "The app ID to set environment variables for" },
133
- "vars": { "type": "object", "description": "Object of key-value pairs to set as environment variables" }
218
+ "appId": {
219
+ "type": "string",
220
+ "description": "App ID (from vibekit_list_apps)"
221
+ },
222
+ "vars": {
223
+ "type": "object",
224
+ "description": "Key-value pairs to set as environment variables, e.g. { \"API_KEY\": \"...\", \"NODE_ENV\": \"production\" }"
225
+ }
134
226
  },
135
- "required": ["appId", "vars"]
227
+ "required": [
228
+ "appId",
229
+ "vars"
230
+ ]
136
231
  }
137
232
  },
138
233
  {
139
234
  "category": "Hosting & Apps",
140
235
  "name": "vibekit_delete_app",
141
- "description": "Delete a hosted app permanently.",
236
+ "title": "VibeKit Delete App",
237
+ "description": "Permanently delete a hosted app — stops the container and removes its workspace, database, env vars, and subdomain. Irreversible (the GitHub repo is NOT touched). Confirm with the user before calling.",
238
+ "annotations": { "title": "VibeKit Delete App", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true },
142
239
  "inputSchema": {
143
240
  "type": "object",
144
241
  "properties": {
145
- "appId": { "type": "string", "description": "The app ID to delete" }
242
+ "appId": {
243
+ "type": "string",
244
+ "description": "App ID (from vibekit_list_apps)"
245
+ }
146
246
  },
147
- "required": ["appId"]
247
+ "required": [
248
+ "appId"
249
+ ]
148
250
  }
149
251
  },
150
252
  {
151
253
  "category": "AI Agent",
152
254
  "name": "vibekit_chat",
153
- "description": "Chat with an app's AI agent. The agent can read, write, and modify the app's code.",
255
+ "title": "VibeKit Chat with Agent",
256
+ "description": "Send a message to an app's built-in AI coding agent, which reads, writes, and modifies the app's code and redeploys it. Use for 'build/make a change to my app' requests. If the agent finishes quickly you get its reply directly. Otherwise you get status:'working' — do NOT resend; instead give the user LIVE progress: poll vibekit_agent_status every few seconds and relay the current step from activity.status ('editing the homepage…', 'deploying…') until activity.done, then read vibekit_agent_history for the final reply.",
257
+ "annotations": { "title": "VibeKit Chat with Agent", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": true },
154
258
  "inputSchema": {
155
259
  "type": "object",
156
260
  "properties": {
157
- "appId": { "type": "string", "description": "The app ID to chat with the agent for" },
158
- "message": { "type": "string", "description": "Message to send to the AI agent" }
261
+ "appId": {
262
+ "type": "string",
263
+ "description": "App ID (from vibekit_list_apps)"
264
+ },
265
+ "message": {
266
+ "type": "string",
267
+ "description": "What you want the agent to do or change — be specific about features, design, and behavior."
268
+ }
159
269
  },
160
- "required": ["appId", "message"]
270
+ "required": [
271
+ "appId",
272
+ "message"
273
+ ]
161
274
  }
162
275
  },
163
276
  {
164
277
  "category": "AI Agent",
165
278
  "name": "vibekit_agent_status",
166
- "description": "Get the status of an app's AI agent.",
279
+ "title": "VibeKit Agent Status",
280
+ "description": "Check whether an app's AI agent is idle or working, and get its LIVE progress. Returns activity.status = the current human-readable build step (e.g. 'editing index.html', 'deploying'), activity.steps = the steps so far, and activity.done = whether the turn finished. Poll this every few seconds while a build is running and relay activity.status to the user so they see progress. Once activity.done is true the response also includes liveCheck = a server-side fetch of the deployed page ({ url, ok, httpStatus, title }); use it to confirm the app is live and renders — do NOT curl/fetch the URL yourself, your sandbox may block it.",
281
+ "annotations": { "title": "VibeKit Agent Status", "readOnlyHint": true },
167
282
  "inputSchema": {
168
283
  "type": "object",
169
284
  "properties": {
170
- "appId": { "type": "string", "description": "The app ID to get agent status for" }
285
+ "appId": {
286
+ "type": "string",
287
+ "description": "App ID (from vibekit_list_apps)"
288
+ }
171
289
  },
172
- "required": ["appId"]
290
+ "required": [
291
+ "appId"
292
+ ]
173
293
  }
174
294
  },
175
295
  {
176
296
  "category": "AI Agent",
177
297
  "name": "vibekit_agent_history",
178
- "description": "Get chat history with an app's AI agent.",
298
+ "title": "VibeKit Agent History",
299
+ "description": "Get the recent chat history between the user and an app's AI agent.",
300
+ "annotations": { "title": "VibeKit Agent History", "readOnlyHint": true },
179
301
  "inputSchema": {
180
302
  "type": "object",
181
303
  "properties": {
182
- "appId": { "type": "string", "description": "The app ID to get agent history for" },
183
- "limit": { "type": "number", "description": "Maximum number of messages to return (default: 20)" }
304
+ "appId": {
305
+ "type": "string",
306
+ "description": "App ID (from vibekit_list_apps)"
307
+ },
308
+ "limit": {
309
+ "type": "number",
310
+ "description": "Maximum number of messages to return (default 20)"
311
+ }
184
312
  },
185
- "required": ["appId"]
313
+ "required": [
314
+ "appId"
315
+ ]
186
316
  }
187
317
  },
188
318
  {
189
319
  "category": "Database",
190
320
  "name": "vibekit_enable_database",
191
- "description": "Enable database for a hosted app.",
321
+ "title": "VibeKit Enable Database",
322
+ "description": "Provision a Postgres database for an app (idempotent — safe if already enabled). Required before the vibekit_db_* tools work. Note: free-tier apps need the $3/mo Database add-on.",
323
+ "annotations": { "title": "VibeKit Enable Database", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true },
192
324
  "inputSchema": {
193
325
  "type": "object",
194
326
  "properties": {
195
- "appId": { "type": "string", "description": "The app ID to enable database for" }
327
+ "appId": {
328
+ "type": "string",
329
+ "description": "App ID (from vibekit_list_apps)"
330
+ }
196
331
  },
197
- "required": ["appId"]
332
+ "required": [
333
+ "appId"
334
+ ]
198
335
  }
199
336
  },
200
337
  {
201
338
  "category": "Database",
202
339
  "name": "vibekit_database_status",
203
- "description": "Get database status and connection info for an app.",
340
+ "title": "VibeKit Database Status",
341
+ "description": "Get an app's database status and connection info (whether it's provisioned, frozen, etc.).",
342
+ "annotations": { "title": "VibeKit Database Status", "readOnlyHint": true, "idempotentHint": true },
204
343
  "inputSchema": {
205
344
  "type": "object",
206
345
  "properties": {
207
- "appId": { "type": "string", "description": "The app ID to get database status for" }
346
+ "appId": {
347
+ "type": "string",
348
+ "description": "App ID (from vibekit_list_apps)"
349
+ }
208
350
  },
209
- "required": ["appId"]
351
+ "required": [
352
+ "appId"
353
+ ]
210
354
  }
211
355
  },
212
356
  {
213
357
  "category": "Database",
214
358
  "name": "vibekit_db_schema",
215
- "description": "Get the database schema for an app — all tables and their columns. Use this before writing a query.",
359
+ "title": "VibeKit Database Schema",
360
+ "description": "Get an app's database schema — every table and its columns. Always call this before writing a query with vibekit_db_query.",
361
+ "annotations": { "title": "VibeKit Database Schema", "readOnlyHint": true, "idempotentHint": true },
216
362
  "inputSchema": {
217
363
  "type": "object",
218
364
  "properties": {
219
- "appId": { "type": "string", "description": "The app ID" }
365
+ "appId": {
366
+ "type": "string",
367
+ "description": "App ID (from vibekit_list_apps)"
368
+ }
220
369
  },
221
- "required": ["appId"]
370
+ "required": [
371
+ "appId"
372
+ ]
222
373
  }
223
374
  },
224
375
  {
225
376
  "category": "Database",
226
377
  "name": "vibekit_db_query",
227
- "description": "Run a SQL query against an app's Postgres database and return the result rows. Supports reads and writes. SQL string, max 5000 chars.",
378
+ "title": "VibeKit Run SQL Query",
379
+ "description": "Run a read-only SQL query against an app's Postgres database and return up to 200 result rows. SELECT only — writes and DDL (INSERT/UPDATE/DELETE/ALTER/DROP/…) are rejected server-side; use vibekit_chat or vibekit_submit_task to have the agent make data or schema changes. Call vibekit_db_schema first to learn the tables. SQL string, max 5000 chars.",
380
+ "annotations": { "title": "VibeKit Run SQL Query", "readOnlyHint": true, "idempotentHint": true },
228
381
  "inputSchema": {
229
382
  "type": "object",
230
383
  "properties": {
231
- "appId": { "type": "string", "description": "The app ID" },
232
- "sql": { "type": "string", "description": "SQL to execute (max 5000 chars)" }
384
+ "appId": {
385
+ "type": "string",
386
+ "description": "App ID (from vibekit_list_apps)"
387
+ },
388
+ "sql": {
389
+ "type": "string",
390
+ "description": "SQL to execute (max 5000 chars). Reads and writes both allowed."
391
+ }
233
392
  },
234
- "required": ["appId", "sql"]
393
+ "required": [
394
+ "appId",
395
+ "sql"
396
+ ]
235
397
  }
236
398
  },
237
399
  {
238
400
  "category": "Database",
239
401
  "name": "vibekit_db_table",
240
- "description": "Browse rows in a specific database table, with pagination and optional sorting.",
241
- "inputSchema": {
242
- "type": "object",
243
- "properties": {
244
- "appId": { "type": "string", "description": "The app ID" },
245
- "table": { "type": "string", "description": "Table name" },
246
- "limit": { "type": "number", "description": "Max rows to return (default 50, max 200)" },
247
- "offset": { "type": "number", "description": "Row offset for pagination (default 0)" }
402
+ "title": "VibeKit Browse Table",
403
+ "description": "Browse rows of one table with pagination and optional sorting — a quick read-only alternative to hand-writing a SELECT.",
404
+ "annotations": { "title": "VibeKit Browse Table", "readOnlyHint": true, "idempotentHint": true },
405
+ "inputSchema": {
406
+ "type": "object",
407
+ "properties": {
408
+ "appId": {
409
+ "type": "string",
410
+ "description": "App ID (from vibekit_list_apps)"
411
+ },
412
+ "table": {
413
+ "type": "string",
414
+ "description": "Table name (see vibekit_db_schema)"
415
+ },
416
+ "limit": {
417
+ "type": "number",
418
+ "description": "Max rows to return (default 50, max 200)"
419
+ },
420
+ "offset": {
421
+ "type": "number",
422
+ "description": "Row offset for pagination (default 0)"
423
+ }
248
424
  },
249
- "required": ["appId", "table"]
425
+ "required": [
426
+ "appId",
427
+ "table"
428
+ ]
250
429
  }
251
430
  },
252
431
  {
253
432
  "category": "Hosting & Apps",
254
433
  "name": "vibekit_list_deploys",
255
- "description": "List recent deploys for an app, most recent first, with their status and commit info. Find a deploy ID here to roll back to.",
434
+ "title": "VibeKit List Deploys",
435
+ "description": "List an app's recent deploys, newest first, with status and commit info. Find a deployId here to pass to vibekit_rollback_deploy.",
436
+ "annotations": { "title": "VibeKit List Deploys", "readOnlyHint": true, "idempotentHint": true },
256
437
  "inputSchema": {
257
438
  "type": "object",
258
439
  "properties": {
259
- "appId": { "type": "string", "description": "The app ID" },
260
- "limit": { "type": "number", "description": "Max deploys to return (default 20, max 50)" }
440
+ "appId": {
441
+ "type": "string",
442
+ "description": "App ID (from vibekit_list_apps)"
443
+ },
444
+ "limit": {
445
+ "type": "number",
446
+ "description": "Max deploys to return (default 20, max 50)"
447
+ }
261
448
  },
262
- "required": ["appId"]
449
+ "required": [
450
+ "appId"
451
+ ]
263
452
  }
264
453
  },
265
454
  {
266
455
  "category": "Hosting & Apps",
267
456
  "name": "vibekit_rollback_deploy",
268
- "description": "Roll an app back to a previous deploy. Get the deploy ID from vibekit_list_deploys. The container restarts on the rolled-back build.",
457
+ "title": "VibeKit Rollback Deploy",
458
+ "description": "Roll an app back to a previous deploy (get the deployId from vibekit_list_deploys). The container restarts on the rolled-back build; reversible by rolling forward again.",
459
+ "annotations": { "title": "VibeKit Rollback Deploy", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true },
269
460
  "inputSchema": {
270
461
  "type": "object",
271
462
  "properties": {
272
- "appId": { "type": "string", "description": "The app ID" },
273
- "deployId": { "type": "string", "description": "The deploy ID to roll back to (from vibekit_list_deploys)" }
463
+ "appId": {
464
+ "type": "string",
465
+ "description": "App ID (from vibekit_list_apps)"
466
+ },
467
+ "deployId": {
468
+ "type": "string",
469
+ "description": "Deploy ID to roll back to (from vibekit_list_deploys)"
470
+ }
274
471
  },
275
- "required": ["appId", "deployId"]
472
+ "required": [
473
+ "appId",
474
+ "deployId"
475
+ ]
276
476
  }
277
477
  },
278
478
  {
279
479
  "category": "QA",
280
480
  "name": "vibekit_run_qa",
281
- "description": "Run automated QA tests on a hosted app.",
481
+ "title": "VibeKit Run QA",
482
+ "description": "Kick off an automated QA run (headless-browser checks) against a hosted app. Poll vibekit_qa_status for results.",
483
+ "annotations": { "title": "VibeKit Run QA", "readOnlyHint": false, "destructiveHint": false },
282
484
  "inputSchema": {
283
485
  "type": "object",
284
486
  "properties": {
285
- "appId": { "type": "string", "description": "The app ID to run QA tests for" }
487
+ "appId": {
488
+ "type": "string",
489
+ "description": "App ID (from vibekit_list_apps)"
490
+ }
286
491
  },
287
- "required": ["appId"]
492
+ "required": [
493
+ "appId"
494
+ ]
288
495
  }
289
496
  },
290
497
  {
291
498
  "category": "QA",
292
499
  "name": "vibekit_qa_status",
293
- "description": "Get QA test results and status for an app.",
500
+ "title": "VibeKit QA Status",
501
+ "description": "Get the latest automated QA results and status for an app.",
502
+ "annotations": { "title": "VibeKit QA Status", "readOnlyHint": true },
294
503
  "inputSchema": {
295
504
  "type": "object",
296
505
  "properties": {
297
- "appId": { "type": "string", "description": "The app ID to get QA status for" }
506
+ "appId": {
507
+ "type": "string",
508
+ "description": "App ID (from vibekit_list_apps)"
509
+ }
298
510
  },
299
- "required": ["appId"]
511
+ "required": [
512
+ "appId"
513
+ ]
300
514
  }
301
515
  },
302
516
  {
303
517
  "category": "Tasks",
304
518
  "name": "vibekit_submit_task",
305
- "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.",
306
- "inputSchema": {
307
- "type": "object",
308
- "properties": {
309
- "task": { "type": "string", "description": "What you want built or changed. Be specific about features, design, and behavior." },
310
- "repo": { "type": "string", "description": "GitHub repo in format 'owner/repo'. Optional — will use user's current repo if not specified." },
311
- "branch": { "type": "string", "description": "Git branch to work on. Default: main" },
312
- "deploy": { "type": "boolean", "description": "Auto-deploy to Vercel when done. Default: true" },
313
- "callbackUrl": { "type": "string", "description": "Webhook URL to receive task completion notification." }
519
+ "title": "VibeKit Submit Task",
520
+ "description": "Submit an autonomous coding task. The AI writes the code, commits to GitHub, and (by default) deploys to <subdomain>.vibekit.bot. Returns a taskId — poll vibekit_get_task or block with vibekit_wait_for_task. Use for 'build X' or 'change X' work against a repo.",
521
+ "annotations": { "title": "VibeKit Submit Task", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": true },
522
+ "inputSchema": {
523
+ "type": "object",
524
+ "properties": {
525
+ "task": {
526
+ "type": "string",
527
+ "description": "What you want built or changed. Be specific about features, design, and behavior."
528
+ },
529
+ "repo": {
530
+ "type": "string",
531
+ "description": "GitHub repo as 'owner/repo'. Optional — uses the user's current repo if omitted."
532
+ },
533
+ "branch": {
534
+ "type": "string",
535
+ "description": "Git branch to work on (default 'main')"
536
+ },
537
+ "deploy": {
538
+ "type": "boolean",
539
+ "description": "Auto-deploy to <subdomain>.vibekit.bot when done (default true)"
540
+ },
541
+ "callbackUrl": {
542
+ "type": "string",
543
+ "description": "Optional webhook URL to receive a task-completion notification."
544
+ }
314
545
  },
315
- "required": ["task"]
546
+ "required": [
547
+ "task"
548
+ ]
316
549
  }
317
550
  },
318
551
  {
319
552
  "category": "Tasks",
320
553
  "name": "vibekit_get_task",
321
- "description": "Get the status and result of a previously submitted task.",
554
+ "title": "VibeKit Get Task",
555
+ "description": "Get the status and result of a task submitted via vibekit_submit_task.",
556
+ "annotations": { "title": "VibeKit Get Task", "readOnlyHint": true },
322
557
  "inputSchema": {
323
558
  "type": "object",
324
559
  "properties": {
325
- "taskId": { "type": "string", "description": "The task ID returned from vibekit_submit_task" }
560
+ "taskId": {
561
+ "type": "string",
562
+ "description": "Task ID returned from vibekit_submit_task"
563
+ }
326
564
  },
327
- "required": ["taskId"]
565
+ "required": [
566
+ "taskId"
567
+ ]
328
568
  }
329
569
  },
330
570
  {
331
571
  "category": "Tasks",
332
572
  "name": "vibekit_list_tasks",
333
- "description": "List recent tasks submitted to VibeKit.",
334
- "inputSchema": {
335
- "type": "object",
336
- "properties": {
337
- "limit": { "type": "number", "description": "Max number of tasks to return. Default: 10" },
338
- "status": { "type": "string", "enum": ["pending", "running", "completed", "failed"], "description": "Filter by status" }
573
+ "title": "VibeKit List Tasks",
574
+ "description": "List recent coding tasks, optionally filtered by status.",
575
+ "annotations": { "title": "VibeKit List Tasks", "readOnlyHint": true, "idempotentHint": true },
576
+ "inputSchema": {
577
+ "type": "object",
578
+ "properties": {
579
+ "limit": {
580
+ "type": "number",
581
+ "description": "Max number of tasks to return (default 10)"
582
+ },
583
+ "status": {
584
+ "type": "string",
585
+ "enum": [
586
+ "pending",
587
+ "running",
588
+ "completed",
589
+ "failed"
590
+ ],
591
+ "description": "Filter by task status"
592
+ }
339
593
  }
340
594
  }
341
595
  },
342
596
  {
343
597
  "category": "Tasks",
344
598
  "name": "vibekit_wait_for_task",
345
- "description": "Wait for a task to complete and return the result. Polls every 5 seconds up to the timeout.",
599
+ "title": "VibeKit Wait for Task",
600
+ "description": "Block until a submitted task finishes (or the timeout), polling every 5 seconds, then return its result. Use right after vibekit_submit_task when you want the final result inline.",
601
+ "annotations": { "title": "VibeKit Wait for Task", "readOnlyHint": true },
346
602
  "inputSchema": {
347
603
  "type": "object",
348
604
  "properties": {
349
- "taskId": { "type": "string", "description": "The task ID to wait for" },
350
- "timeoutSeconds": { "type": "number", "description": "Max seconds to wait. Default: 300 (5 minutes)" }
605
+ "taskId": {
606
+ "type": "string",
607
+ "description": "Task ID to wait for (from vibekit_submit_task)"
608
+ },
609
+ "timeoutSeconds": {
610
+ "type": "number",
611
+ "description": "Max seconds to wait (default 300; the remote connector caps this at 120)"
612
+ }
351
613
  },
352
- "required": ["taskId"]
614
+ "required": [
615
+ "taskId"
616
+ ]
353
617
  }
354
618
  },
355
619
  {
356
620
  "category": "Tasks",
357
621
  "name": "vibekit_cancel_task",
358
- "description": "Cancel a running task by ID. No-op for tasks that have already completed.",
622
+ "title": "VibeKit Cancel Task",
623
+ "description": "Cancel a running task by taskId. No-op if it has already finished.",
624
+ "annotations": { "title": "VibeKit Cancel Task", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true },
359
625
  "inputSchema": {
360
626
  "type": "object",
361
627
  "properties": {
362
- "taskId": { "type": "string", "description": "The task ID to cancel" }
628
+ "taskId": {
629
+ "type": "string",
630
+ "description": "Task ID to cancel (from vibekit_submit_task)"
631
+ }
363
632
  },
364
- "required": ["taskId"]
633
+ "required": [
634
+ "taskId"
635
+ ]
365
636
  }
366
637
  },
367
638
  {
368
639
  "category": "Schedules",
369
640
  "name": "vibekit_create_schedule",
370
- "description": "Create a scheduled recurring task. The AI will run this task automatically on the specified schedule.",
371
- "inputSchema": {
372
- "type": "object",
373
- "properties": {
374
- "task": { "type": "string", "description": "What to do on each run. e.g., 'Improve SEO and page speed'" },
375
- "repo": { "type": "string", "description": "GitHub repo in format 'owner/repo'" },
376
- "cron": { "type": "string", "description": "Cron expression. e.g., '0 9 * * 1' for every Monday at 9am UTC" },
377
- "name": { "type": "string", "description": "Friendly name for the schedule" }
641
+ "title": "VibeKit Create Schedule",
642
+ "description": "Create a recurring coding task that the AI runs automatically on a cron schedule (e.g. a weekly SEO pass). Use for 'every Monday, do X to my repo' requests.",
643
+ "annotations": { "title": "VibeKit Create Schedule", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false },
644
+ "inputSchema": {
645
+ "type": "object",
646
+ "properties": {
647
+ "task": {
648
+ "type": "string",
649
+ "description": "What to do on each run, e.g. 'Improve SEO and page speed'"
650
+ },
651
+ "repo": {
652
+ "type": "string",
653
+ "description": "GitHub repo as 'owner/repo'"
654
+ },
655
+ "cron": {
656
+ "type": "string",
657
+ "description": "Cron expression, e.g. '0 9 * * 1' for every Monday at 9am UTC"
658
+ },
659
+ "name": {
660
+ "type": "string",
661
+ "description": "Friendly name for the schedule (optional)"
662
+ }
378
663
  },
379
- "required": ["task", "repo", "cron"]
664
+ "required": [
665
+ "task",
666
+ "repo",
667
+ "cron"
668
+ ]
380
669
  }
381
670
  },
382
671
  {
383
672
  "category": "Schedules",
384
673
  "name": "vibekit_list_schedules",
385
- "description": "List all scheduled tasks.",
386
- "inputSchema": { "type": "object", "properties": {} }
674
+ "title": "VibeKit List Schedules",
675
+ "description": "List all of the account's scheduled recurring tasks.",
676
+ "annotations": { "title": "VibeKit List Schedules", "readOnlyHint": true, "idempotentHint": true },
677
+ "inputSchema": {
678
+ "type": "object",
679
+ "properties": {}
680
+ }
387
681
  },
388
682
  {
389
683
  "category": "Schedules",
390
684
  "name": "vibekit_delete_schedule",
391
- "description": "Delete a scheduled task.",
685
+ "title": "VibeKit Delete Schedule",
686
+ "description": "Delete a scheduled recurring task by scheduleId. Confirm with the user first.",
687
+ "annotations": { "title": "VibeKit Delete Schedule", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true },
392
688
  "inputSchema": {
393
689
  "type": "object",
394
690
  "properties": {
395
- "scheduleId": { "type": "string", "description": "The schedule ID to delete" }
691
+ "scheduleId": {
692
+ "type": "string",
693
+ "description": "Schedule ID to delete (from vibekit_list_schedules)"
694
+ }
396
695
  },
397
- "required": ["scheduleId"]
696
+ "required": [
697
+ "scheduleId"
698
+ ]
398
699
  }
399
700
  },
400
701
  {
401
702
  "category": "Account",
402
703
  "name": "vibekit_account",
403
- "description": "Get VibeKit account info including plan, credits balance, and usage.",
404
- "inputSchema": { "type": "object", "properties": {} }
704
+ "title": "VibeKit Account Info",
705
+ "description": "Get VibeKit account info: plan, credit balance, and usage.",
706
+ "annotations": { "title": "VibeKit Account Info", "readOnlyHint": true, "idempotentHint": true },
707
+ "inputSchema": {
708
+ "type": "object",
709
+ "properties": {}
710
+ }
405
711
  },
406
712
  {
407
713
  "category": "Skills",
408
714
  "name": "vibekit_list_skills",
409
- "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.",
715
+ "title": "VibeKit List Skills",
716
+ "description": "List available implementation skills (IDs, names, descriptions, tags) from the VibeKit skills registry. Discover skills here before fetching one with vibekit_get_skill.",
717
+ "annotations": { "title": "VibeKit List Skills", "readOnlyHint": true, "openWorldHint": true },
410
718
  "inputSchema": {
411
719
  "type": "object",
412
720
  "properties": {
413
- "tag": { "type": "string", "description": "Filter skills by tag (e.g., 'react', 'database', 'security')" }
721
+ "tag": {
722
+ "type": "string",
723
+ "description": "Filter skills by tag (e.g. 'react', 'database', 'security')"
724
+ }
414
725
  }
415
726
  }
416
727
  },
417
728
  {
418
729
  "category": "Skills",
419
730
  "name": "vibekit_get_skill",
420
- "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.",
731
+ "title": "VibeKit Get Skill",
732
+ "description": "Fetch the full content of a specific skill — implementation patterns, code examples, and best practices for a domain. Fetch on-demand when you need guidance on a specific topic.",
733
+ "annotations": { "title": "VibeKit Get Skill", "readOnlyHint": true, "openWorldHint": true },
421
734
  "inputSchema": {
422
735
  "type": "object",
423
736
  "properties": {
424
- "id": { "type": "string", "description": "Skill ID from vibekit_list_skills (e.g., 'nextjs', 'trpc', 'auth')" }
737
+ "id": {
738
+ "type": "string",
739
+ "description": "Skill ID from vibekit_list_skills (e.g. 'nextjs', 'trpc', 'auth')"
740
+ }
425
741
  },
426
- "required": ["id"]
742
+ "required": [
743
+ "id"
744
+ ]
427
745
  }
428
746
  }
429
747
  ]
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 VibeKit
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.