vibekit-mcp 0.7.1 → 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.
package/README.md CHANGED
@@ -4,18 +4,6 @@ MCP server for VibeKit, deploy apps, manage hosting, and chat with AI agents fro
4
4
 
5
5
  This package is for **VibeKit cloud/API access**. It does **not** connect your local Claude Code instance to Telegram. For local-machine remote control, use `vibekit-agent`.
6
6
 
7
- ## Use it remotely (no install)
8
-
9
- VibeKit also runs as a hosted remote server, so clients that accept a remote MCP URL (claude.ai web connectors, ChatGPT, etc.) need **no install**:
10
-
11
- ```
12
- https://mcp.vibekit.bot/mcp?api_key=vk_your_api_key_here
13
- ```
14
-
15
- Paste that URL into your client's "custom connector" / "remote MCP server" field. Clients that let you set headers can instead send `Authorization: Bearer vk_your_api_key_here` and use the bare `https://mcp.vibekit.bot/mcp`. Get a key from [@the_vibe_kit_bot](https://t.me/the_vibe_kit_bot) with `/apikey`.
16
-
17
- Prefer a local stdio install (e.g. Claude Desktop)? Use the steps below.
18
-
19
7
  ## Installation
20
8
 
21
9
  ```bash
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
@@ -52,7 +55,23 @@ const tools = JSON.parse((0, fs_1.readFileSync)(TOOLS_MANIFEST_PATH, "utf8")).ma
52
55
  title: t.title,
53
56
  description: t.description,
54
57
  inputSchema: t.inputSchema,
58
+ annotations: t.annotations,
55
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.";
56
75
  // Tool handlers
57
76
  async function handleTool(name, args) {
58
77
  let result;
@@ -114,11 +133,28 @@ async function handleTool(name, args) {
114
133
  result = await apiRequest("DELETE", `/hosting/app/${args.appId}`);
115
134
  break;
116
135
  // AI Agent
117
- case "vibekit_chat":
118
- 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`, {
119
144
  message: args.message,
120
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]);
121
156
  break;
157
+ }
122
158
  case "vibekit_agent_status":
123
159
  result = await apiRequest("GET", `/hosting/app/${args.appId}/agent/status`);
124
160
  break;
@@ -305,11 +341,12 @@ async function handleTool(name, args) {
305
341
  const server = new index_js_1.Server({
306
342
  name: "vibekit-mcp",
307
343
  title: "VibeKit",
308
- version: "0.7.1",
344
+ version: "0.7.2",
309
345
  }, {
310
346
  capabilities: {
311
347
  tools: {},
312
348
  },
349
+ instructions: SERVER_INSTRUCTIONS,
313
350
  });
314
351
  // Handle tool listing
315
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.1",
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
@@ -3,7 +3,8 @@
3
3
  "category": "Hosting & Apps",
4
4
  "name": "vibekit_list_apps",
5
5
  "title": "VibeKit List Apps",
6
- "description": "List all hosted apps in your VibeKit account.",
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 },
7
8
  "inputSchema": {
8
9
  "type": "object",
9
10
  "properties": {}
@@ -13,13 +14,14 @@
13
14
  "category": "Hosting & Apps",
14
15
  "name": "vibekit_get_app",
15
16
  "title": "VibeKit Get App",
16
- "description": "Get details about a specific hosted 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 },
17
19
  "inputSchema": {
18
20
  "type": "object",
19
21
  "properties": {
20
22
  "appId": {
21
23
  "type": "string",
22
- "description": "The app ID to get details for"
24
+ "description": "App ID (from vibekit_list_apps)"
23
25
  }
24
26
  },
25
27
  "required": [
@@ -31,17 +33,18 @@
31
33
  "category": "Hosting & Apps",
32
34
  "name": "vibekit_create_app",
33
35
  "title": "VibeKit Create App",
34
- "description": "Create a new hosted app from a template.",
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 },
35
38
  "inputSchema": {
36
39
  "type": "object",
37
40
  "properties": {
38
41
  "template": {
39
42
  "type": "string",
40
- "description": "Template to use (e.g., 'nextjs', 'react', 'express')"
43
+ "description": "Template id from vibekit_list_templates (e.g. 'landing', 'dashboard', 'blog', 'saas', 'crud-api')"
41
44
  },
42
45
  "subdomain": {
43
46
  "type": "string",
44
- "description": "Subdomain for the app (will be deployed to {subdomain}.vibekit.bot)"
47
+ "description": "Desired subdomain the app goes live at <subdomain>.vibekit.bot. Lowercase letters, numbers, and hyphens."
45
48
  }
46
49
  },
47
50
  "required": [
@@ -54,7 +57,8 @@
54
57
  "category": "Hosting & Apps",
55
58
  "name": "vibekit_list_templates",
56
59
  "title": "VibeKit List Templates",
57
- "description": "List available templates for vibekit_create_app (e.g. landing, dashboard, blog, saas, crud-api).",
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 },
58
62
  "inputSchema": {
59
63
  "type": "object",
60
64
  "properties": {}
@@ -64,17 +68,18 @@
64
68
  "category": "Hosting & Apps",
65
69
  "name": "vibekit_deploy",
66
70
  "title": "VibeKit Deploy",
67
- "description": "Deploy a GitHub repo to VibeKit hosting.",
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 },
68
73
  "inputSchema": {
69
74
  "type": "object",
70
75
  "properties": {
71
76
  "repo": {
72
77
  "type": "string",
73
- "description": "GitHub repo in format 'owner/repo'"
78
+ "description": "GitHub repo as 'owner/repo' (e.g. '609NFT/vibekit')"
74
79
  },
75
80
  "subdomain": {
76
81
  "type": "string",
77
- "description": "Subdomain for the app (will be deployed to {subdomain}.vibekit.bot)"
82
+ "description": "Desired subdomain the app goes live at <subdomain>.vibekit.bot. Lowercase letters, numbers, and hyphens."
78
83
  }
79
84
  },
80
85
  "required": [
@@ -87,13 +92,14 @@
87
92
  "category": "Hosting & Apps",
88
93
  "name": "vibekit_redeploy",
89
94
  "title": "VibeKit Redeploy",
90
- "description": "Redeploy an existing hosted app to update it with latest code.",
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 },
91
97
  "inputSchema": {
92
98
  "type": "object",
93
99
  "properties": {
94
100
  "appId": {
95
101
  "type": "string",
96
- "description": "The app ID to redeploy"
102
+ "description": "App ID (from vibekit_list_apps)"
97
103
  }
98
104
  },
99
105
  "required": [
@@ -105,17 +111,18 @@
105
111
  "category": "Hosting & Apps",
106
112
  "name": "vibekit_app_logs",
107
113
  "title": "VibeKit App Logs",
108
- "description": "Get application logs for debugging and monitoring.",
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 },
109
116
  "inputSchema": {
110
117
  "type": "object",
111
118
  "properties": {
112
119
  "appId": {
113
120
  "type": "string",
114
- "description": "The app ID to get logs for"
121
+ "description": "App ID (from vibekit_list_apps)"
115
122
  },
116
123
  "lines": {
117
124
  "type": "number",
118
- "description": "Number of log lines to retrieve (default: 100)"
125
+ "description": "Number of log lines to retrieve (default 100)"
119
126
  }
120
127
  },
121
128
  "required": [
@@ -127,13 +134,14 @@
127
134
  "category": "Hosting & Apps",
128
135
  "name": "vibekit_restart_app",
129
136
  "title": "VibeKit Restart App",
130
- "description": "Restart a hosted 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 },
131
139
  "inputSchema": {
132
140
  "type": "object",
133
141
  "properties": {
134
142
  "appId": {
135
143
  "type": "string",
136
- "description": "The app ID to restart"
144
+ "description": "App ID (from vibekit_list_apps)"
137
145
  }
138
146
  },
139
147
  "required": [
@@ -145,13 +153,14 @@
145
153
  "category": "Hosting & Apps",
146
154
  "name": "vibekit_stop_app",
147
155
  "title": "VibeKit Stop App",
148
- "description": "Stop a hosted 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 },
149
158
  "inputSchema": {
150
159
  "type": "object",
151
160
  "properties": {
152
161
  "appId": {
153
162
  "type": "string",
154
- "description": "The app ID to stop"
163
+ "description": "App ID (from vibekit_list_apps)"
155
164
  }
156
165
  },
157
166
  "required": [
@@ -163,13 +172,14 @@
163
172
  "category": "Hosting & Apps",
164
173
  "name": "vibekit_start_app",
165
174
  "title": "VibeKit Start App",
166
- "description": "Start a stopped hosted 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 },
167
177
  "inputSchema": {
168
178
  "type": "object",
169
179
  "properties": {
170
180
  "appId": {
171
181
  "type": "string",
172
- "description": "The app ID to start"
182
+ "description": "App ID (from vibekit_list_apps)"
173
183
  }
174
184
  },
175
185
  "required": [
@@ -181,13 +191,14 @@
181
191
  "category": "Hosting & Apps",
182
192
  "name": "vibekit_app_env",
183
193
  "title": "VibeKit Get Env Vars",
184
- "description": "Get environment variables for a hosted app.",
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 },
185
196
  "inputSchema": {
186
197
  "type": "object",
187
198
  "properties": {
188
199
  "appId": {
189
200
  "type": "string",
190
- "description": "The app ID to get environment variables for"
201
+ "description": "App ID (from vibekit_list_apps)"
191
202
  }
192
203
  },
193
204
  "required": [
@@ -199,17 +210,18 @@
199
210
  "category": "Hosting & Apps",
200
211
  "name": "vibekit_set_env",
201
212
  "title": "VibeKit Set Env Vars",
202
- "description": "Set environment variables for a hosted app.",
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 },
203
215
  "inputSchema": {
204
216
  "type": "object",
205
217
  "properties": {
206
218
  "appId": {
207
219
  "type": "string",
208
- "description": "The app ID to set environment variables for"
220
+ "description": "App ID (from vibekit_list_apps)"
209
221
  },
210
222
  "vars": {
211
223
  "type": "object",
212
- "description": "Object of key-value pairs to set as environment variables"
224
+ "description": "Key-value pairs to set as environment variables, e.g. { \"API_KEY\": \"...\", \"NODE_ENV\": \"production\" }"
213
225
  }
214
226
  },
215
227
  "required": [
@@ -222,13 +234,14 @@
222
234
  "category": "Hosting & Apps",
223
235
  "name": "vibekit_delete_app",
224
236
  "title": "VibeKit Delete App",
225
- "description": "Delete a hosted app permanently.",
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 },
226
239
  "inputSchema": {
227
240
  "type": "object",
228
241
  "properties": {
229
242
  "appId": {
230
243
  "type": "string",
231
- "description": "The app ID to delete"
244
+ "description": "App ID (from vibekit_list_apps)"
232
245
  }
233
246
  },
234
247
  "required": [
@@ -240,17 +253,18 @@
240
253
  "category": "AI Agent",
241
254
  "name": "vibekit_chat",
242
255
  "title": "VibeKit Chat with Agent",
243
- "description": "Chat with an app's AI agent. The agent can read, write, and modify the app's code.",
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 },
244
258
  "inputSchema": {
245
259
  "type": "object",
246
260
  "properties": {
247
261
  "appId": {
248
262
  "type": "string",
249
- "description": "The app ID to chat with the agent for"
263
+ "description": "App ID (from vibekit_list_apps)"
250
264
  },
251
265
  "message": {
252
266
  "type": "string",
253
- "description": "Message to send to the AI agent"
267
+ "description": "What you want the agent to do or change — be specific about features, design, and behavior."
254
268
  }
255
269
  },
256
270
  "required": [
@@ -263,13 +277,14 @@
263
277
  "category": "AI Agent",
264
278
  "name": "vibekit_agent_status",
265
279
  "title": "VibeKit Agent Status",
266
- "description": "Get the status of an app's AI agent.",
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 },
267
282
  "inputSchema": {
268
283
  "type": "object",
269
284
  "properties": {
270
285
  "appId": {
271
286
  "type": "string",
272
- "description": "The app ID to get agent status for"
287
+ "description": "App ID (from vibekit_list_apps)"
273
288
  }
274
289
  },
275
290
  "required": [
@@ -281,17 +296,18 @@
281
296
  "category": "AI Agent",
282
297
  "name": "vibekit_agent_history",
283
298
  "title": "VibeKit Agent History",
284
- "description": "Get chat history with an app's AI agent.",
299
+ "description": "Get the recent chat history between the user and an app's AI agent.",
300
+ "annotations": { "title": "VibeKit Agent History", "readOnlyHint": true },
285
301
  "inputSchema": {
286
302
  "type": "object",
287
303
  "properties": {
288
304
  "appId": {
289
305
  "type": "string",
290
- "description": "The app ID to get agent history for"
306
+ "description": "App ID (from vibekit_list_apps)"
291
307
  },
292
308
  "limit": {
293
309
  "type": "number",
294
- "description": "Maximum number of messages to return (default: 20)"
310
+ "description": "Maximum number of messages to return (default 20)"
295
311
  }
296
312
  },
297
313
  "required": [
@@ -303,13 +319,14 @@
303
319
  "category": "Database",
304
320
  "name": "vibekit_enable_database",
305
321
  "title": "VibeKit Enable Database",
306
- "description": "Enable database for a hosted app.",
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 },
307
324
  "inputSchema": {
308
325
  "type": "object",
309
326
  "properties": {
310
327
  "appId": {
311
328
  "type": "string",
312
- "description": "The app ID to enable database for"
329
+ "description": "App ID (from vibekit_list_apps)"
313
330
  }
314
331
  },
315
332
  "required": [
@@ -321,13 +338,14 @@
321
338
  "category": "Database",
322
339
  "name": "vibekit_database_status",
323
340
  "title": "VibeKit Database Status",
324
- "description": "Get database status and connection info for an app.",
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 },
325
343
  "inputSchema": {
326
344
  "type": "object",
327
345
  "properties": {
328
346
  "appId": {
329
347
  "type": "string",
330
- "description": "The app ID to get database status for"
348
+ "description": "App ID (from vibekit_list_apps)"
331
349
  }
332
350
  },
333
351
  "required": [
@@ -339,13 +357,14 @@
339
357
  "category": "Database",
340
358
  "name": "vibekit_db_schema",
341
359
  "title": "VibeKit Database Schema",
342
- "description": "Get the database schema for an app \u2014 all tables and their columns. Use this before writing a query.",
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 },
343
362
  "inputSchema": {
344
363
  "type": "object",
345
364
  "properties": {
346
365
  "appId": {
347
366
  "type": "string",
348
- "description": "The app ID"
367
+ "description": "App ID (from vibekit_list_apps)"
349
368
  }
350
369
  },
351
370
  "required": [
@@ -357,17 +376,18 @@
357
376
  "category": "Database",
358
377
  "name": "vibekit_db_query",
359
378
  "title": "VibeKit Run SQL Query",
360
- "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.",
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 },
361
381
  "inputSchema": {
362
382
  "type": "object",
363
383
  "properties": {
364
384
  "appId": {
365
385
  "type": "string",
366
- "description": "The app ID"
386
+ "description": "App ID (from vibekit_list_apps)"
367
387
  },
368
388
  "sql": {
369
389
  "type": "string",
370
- "description": "SQL to execute (max 5000 chars)"
390
+ "description": "SQL to execute (max 5000 chars). Reads and writes both allowed."
371
391
  }
372
392
  },
373
393
  "required": [
@@ -380,17 +400,18 @@
380
400
  "category": "Database",
381
401
  "name": "vibekit_db_table",
382
402
  "title": "VibeKit Browse Table",
383
- "description": "Browse rows in a specific database table, with pagination and optional sorting.",
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 },
384
405
  "inputSchema": {
385
406
  "type": "object",
386
407
  "properties": {
387
408
  "appId": {
388
409
  "type": "string",
389
- "description": "The app ID"
410
+ "description": "App ID (from vibekit_list_apps)"
390
411
  },
391
412
  "table": {
392
413
  "type": "string",
393
- "description": "Table name"
414
+ "description": "Table name (see vibekit_db_schema)"
394
415
  },
395
416
  "limit": {
396
417
  "type": "number",
@@ -411,13 +432,14 @@
411
432
  "category": "Hosting & Apps",
412
433
  "name": "vibekit_list_deploys",
413
434
  "title": "VibeKit List Deploys",
414
- "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.",
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 },
415
437
  "inputSchema": {
416
438
  "type": "object",
417
439
  "properties": {
418
440
  "appId": {
419
441
  "type": "string",
420
- "description": "The app ID"
442
+ "description": "App ID (from vibekit_list_apps)"
421
443
  },
422
444
  "limit": {
423
445
  "type": "number",
@@ -433,17 +455,18 @@
433
455
  "category": "Hosting & Apps",
434
456
  "name": "vibekit_rollback_deploy",
435
457
  "title": "VibeKit Rollback Deploy",
436
- "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.",
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 },
437
460
  "inputSchema": {
438
461
  "type": "object",
439
462
  "properties": {
440
463
  "appId": {
441
464
  "type": "string",
442
- "description": "The app ID"
465
+ "description": "App ID (from vibekit_list_apps)"
443
466
  },
444
467
  "deployId": {
445
468
  "type": "string",
446
- "description": "The deploy ID to roll back to (from vibekit_list_deploys)"
469
+ "description": "Deploy ID to roll back to (from vibekit_list_deploys)"
447
470
  }
448
471
  },
449
472
  "required": [
@@ -456,13 +479,14 @@
456
479
  "category": "QA",
457
480
  "name": "vibekit_run_qa",
458
481
  "title": "VibeKit Run QA",
459
- "description": "Run automated QA tests on a hosted app.",
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 },
460
484
  "inputSchema": {
461
485
  "type": "object",
462
486
  "properties": {
463
487
  "appId": {
464
488
  "type": "string",
465
- "description": "The app ID to run QA tests for"
489
+ "description": "App ID (from vibekit_list_apps)"
466
490
  }
467
491
  },
468
492
  "required": [
@@ -474,13 +498,14 @@
474
498
  "category": "QA",
475
499
  "name": "vibekit_qa_status",
476
500
  "title": "VibeKit QA Status",
477
- "description": "Get QA test results and status for an app.",
501
+ "description": "Get the latest automated QA results and status for an app.",
502
+ "annotations": { "title": "VibeKit QA Status", "readOnlyHint": true },
478
503
  "inputSchema": {
479
504
  "type": "object",
480
505
  "properties": {
481
506
  "appId": {
482
507
  "type": "string",
483
- "description": "The app ID to get QA status for"
508
+ "description": "App ID (from vibekit_list_apps)"
484
509
  }
485
510
  },
486
511
  "required": [
@@ -492,7 +517,8 @@
492
517
  "category": "Tasks",
493
518
  "name": "vibekit_submit_task",
494
519
  "title": "VibeKit Submit Task",
495
- "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.",
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 },
496
522
  "inputSchema": {
497
523
  "type": "object",
498
524
  "properties": {
@@ -502,19 +528,19 @@
502
528
  },
503
529
  "repo": {
504
530
  "type": "string",
505
- "description": "GitHub repo in format 'owner/repo'. Optional \u2014 will use user's current repo if not specified."
531
+ "description": "GitHub repo as 'owner/repo'. Optional uses the user's current repo if omitted."
506
532
  },
507
533
  "branch": {
508
534
  "type": "string",
509
- "description": "Git branch to work on. Default: main"
535
+ "description": "Git branch to work on (default 'main')"
510
536
  },
511
537
  "deploy": {
512
538
  "type": "boolean",
513
- "description": "Auto-deploy to Vercel when done. Default: true"
539
+ "description": "Auto-deploy to <subdomain>.vibekit.bot when done (default true)"
514
540
  },
515
541
  "callbackUrl": {
516
542
  "type": "string",
517
- "description": "Webhook URL to receive task completion notification."
543
+ "description": "Optional webhook URL to receive a task-completion notification."
518
544
  }
519
545
  },
520
546
  "required": [
@@ -526,13 +552,14 @@
526
552
  "category": "Tasks",
527
553
  "name": "vibekit_get_task",
528
554
  "title": "VibeKit Get Task",
529
- "description": "Get the status and result of a previously submitted task.",
555
+ "description": "Get the status and result of a task submitted via vibekit_submit_task.",
556
+ "annotations": { "title": "VibeKit Get Task", "readOnlyHint": true },
530
557
  "inputSchema": {
531
558
  "type": "object",
532
559
  "properties": {
533
560
  "taskId": {
534
561
  "type": "string",
535
- "description": "The task ID returned from vibekit_submit_task"
562
+ "description": "Task ID returned from vibekit_submit_task"
536
563
  }
537
564
  },
538
565
  "required": [
@@ -544,13 +571,14 @@
544
571
  "category": "Tasks",
545
572
  "name": "vibekit_list_tasks",
546
573
  "title": "VibeKit List Tasks",
547
- "description": "List recent tasks submitted to VibeKit.",
574
+ "description": "List recent coding tasks, optionally filtered by status.",
575
+ "annotations": { "title": "VibeKit List Tasks", "readOnlyHint": true, "idempotentHint": true },
548
576
  "inputSchema": {
549
577
  "type": "object",
550
578
  "properties": {
551
579
  "limit": {
552
580
  "type": "number",
553
- "description": "Max number of tasks to return. Default: 10"
581
+ "description": "Max number of tasks to return (default 10)"
554
582
  },
555
583
  "status": {
556
584
  "type": "string",
@@ -560,7 +588,7 @@
560
588
  "completed",
561
589
  "failed"
562
590
  ],
563
- "description": "Filter by status"
591
+ "description": "Filter by task status"
564
592
  }
565
593
  }
566
594
  }
@@ -569,17 +597,18 @@
569
597
  "category": "Tasks",
570
598
  "name": "vibekit_wait_for_task",
571
599
  "title": "VibeKit Wait for Task",
572
- "description": "Wait for a task to complete and return the result. Polls every 5 seconds up to the timeout.",
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 },
573
602
  "inputSchema": {
574
603
  "type": "object",
575
604
  "properties": {
576
605
  "taskId": {
577
606
  "type": "string",
578
- "description": "The task ID to wait for"
607
+ "description": "Task ID to wait for (from vibekit_submit_task)"
579
608
  },
580
609
  "timeoutSeconds": {
581
610
  "type": "number",
582
- "description": "Max seconds to wait. Default: 300 (5 minutes)"
611
+ "description": "Max seconds to wait (default 300; the remote connector caps this at 120)"
583
612
  }
584
613
  },
585
614
  "required": [
@@ -591,13 +620,14 @@
591
620
  "category": "Tasks",
592
621
  "name": "vibekit_cancel_task",
593
622
  "title": "VibeKit Cancel Task",
594
- "description": "Cancel a running task by ID. No-op for tasks that have already completed.",
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 },
595
625
  "inputSchema": {
596
626
  "type": "object",
597
627
  "properties": {
598
628
  "taskId": {
599
629
  "type": "string",
600
- "description": "The task ID to cancel"
630
+ "description": "Task ID to cancel (from vibekit_submit_task)"
601
631
  }
602
632
  },
603
633
  "required": [
@@ -609,25 +639,26 @@
609
639
  "category": "Schedules",
610
640
  "name": "vibekit_create_schedule",
611
641
  "title": "VibeKit Create Schedule",
612
- "description": "Create a scheduled recurring task. The AI will run this task automatically on the specified 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 },
613
644
  "inputSchema": {
614
645
  "type": "object",
615
646
  "properties": {
616
647
  "task": {
617
648
  "type": "string",
618
- "description": "What to do on each run. e.g., 'Improve SEO and page speed'"
649
+ "description": "What to do on each run, e.g. 'Improve SEO and page speed'"
619
650
  },
620
651
  "repo": {
621
652
  "type": "string",
622
- "description": "GitHub repo in format 'owner/repo'"
653
+ "description": "GitHub repo as 'owner/repo'"
623
654
  },
624
655
  "cron": {
625
656
  "type": "string",
626
- "description": "Cron expression. e.g., '0 9 * * 1' for every Monday at 9am UTC"
657
+ "description": "Cron expression, e.g. '0 9 * * 1' for every Monday at 9am UTC"
627
658
  },
628
659
  "name": {
629
660
  "type": "string",
630
- "description": "Friendly name for the schedule"
661
+ "description": "Friendly name for the schedule (optional)"
631
662
  }
632
663
  },
633
664
  "required": [
@@ -641,7 +672,8 @@
641
672
  "category": "Schedules",
642
673
  "name": "vibekit_list_schedules",
643
674
  "title": "VibeKit List Schedules",
644
- "description": "List all scheduled tasks.",
675
+ "description": "List all of the account's scheduled recurring tasks.",
676
+ "annotations": { "title": "VibeKit List Schedules", "readOnlyHint": true, "idempotentHint": true },
645
677
  "inputSchema": {
646
678
  "type": "object",
647
679
  "properties": {}
@@ -651,13 +683,14 @@
651
683
  "category": "Schedules",
652
684
  "name": "vibekit_delete_schedule",
653
685
  "title": "VibeKit Delete Schedule",
654
- "description": "Delete a scheduled task.",
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 },
655
688
  "inputSchema": {
656
689
  "type": "object",
657
690
  "properties": {
658
691
  "scheduleId": {
659
692
  "type": "string",
660
- "description": "The schedule ID to delete"
693
+ "description": "Schedule ID to delete (from vibekit_list_schedules)"
661
694
  }
662
695
  },
663
696
  "required": [
@@ -669,7 +702,8 @@
669
702
  "category": "Account",
670
703
  "name": "vibekit_account",
671
704
  "title": "VibeKit Account Info",
672
- "description": "Get VibeKit account info including plan, credits balance, and usage.",
705
+ "description": "Get VibeKit account info: plan, credit balance, and usage.",
706
+ "annotations": { "title": "VibeKit Account Info", "readOnlyHint": true, "idempotentHint": true },
673
707
  "inputSchema": {
674
708
  "type": "object",
675
709
  "properties": {}
@@ -679,13 +713,14 @@
679
713
  "category": "Skills",
680
714
  "name": "vibekit_list_skills",
681
715
  "title": "VibeKit List Skills",
682
- "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.",
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 },
683
718
  "inputSchema": {
684
719
  "type": "object",
685
720
  "properties": {
686
721
  "tag": {
687
722
  "type": "string",
688
- "description": "Filter skills by tag (e.g., 'react', 'database', 'security')"
723
+ "description": "Filter skills by tag (e.g. 'react', 'database', 'security')"
689
724
  }
690
725
  }
691
726
  }
@@ -694,13 +729,14 @@
694
729
  "category": "Skills",
695
730
  "name": "vibekit_get_skill",
696
731
  "title": "VibeKit Get Skill",
697
- "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.",
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 },
698
734
  "inputSchema": {
699
735
  "type": "object",
700
736
  "properties": {
701
737
  "id": {
702
738
  "type": "string",
703
- "description": "Skill ID from vibekit_list_skills (e.g., 'nextjs', 'trpc', 'auth')"
739
+ "description": "Skill ID from vibekit_list_skills (e.g. 'nextjs', 'trpc', 'auth')"
704
740
  }
705
741
  },
706
742
  "required": [
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.