vibekit-mcp 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -38
- package/dist/index.js +286 -173
- package/package.json +10 -27
package/README.md
CHANGED
|
@@ -1,68 +1,101 @@
|
|
|
1
1
|
# vibekit-mcp
|
|
2
2
|
|
|
3
|
-
MCP
|
|
3
|
+
MCP server for [VibeKit](https://vibekit.bot) — manage AI-powered apps as native tools in Claude Desktop, Cursor, Windsurf, and any MCP-compatible client.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Setup
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
npm install -g vibekit-mcp
|
|
9
|
-
```
|
|
7
|
+
### Claude Desktop
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
Add to your `claude_desktop_config.json`:
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"mcpServers": {
|
|
14
|
+
"vibekit": {
|
|
15
|
+
"command": "npx",
|
|
16
|
+
"args": ["-y", "vibekit-mcp"],
|
|
17
|
+
"env": {
|
|
18
|
+
"VIBEKIT_API_KEY": "vk_your_key_here"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Cursor
|
|
16
26
|
|
|
17
|
-
|
|
27
|
+
Add to `.cursor/mcp.json` in your project:
|
|
18
28
|
|
|
19
29
|
```json
|
|
20
30
|
{
|
|
21
31
|
"mcpServers": {
|
|
22
32
|
"vibekit": {
|
|
23
|
-
"command": "
|
|
33
|
+
"command": "npx",
|
|
34
|
+
"args": ["-y", "vibekit-mcp"],
|
|
24
35
|
"env": {
|
|
25
|
-
"VIBEKIT_API_KEY": "
|
|
36
|
+
"VIBEKIT_API_KEY": "vk_your_key_here"
|
|
26
37
|
}
|
|
27
38
|
}
|
|
28
39
|
}
|
|
29
40
|
}
|
|
30
41
|
```
|
|
31
42
|
|
|
32
|
-
|
|
43
|
+
Get your API key at [app.vibekit.bot/settings](https://app.vibekit.bot/settings).
|
|
33
44
|
|
|
34
45
|
## Available Tools
|
|
35
46
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
| `vibekit_list_tasks` | List recent tasks |
|
|
41
|
-
| `vibekit_wait_for_task` | Wait for a task to complete (polls until done) |
|
|
42
|
-
| `vibekit_create_schedule` | Create a recurring scheduled task |
|
|
43
|
-
| `vibekit_list_schedules` | List all scheduled tasks |
|
|
44
|
-
| `vibekit_delete_schedule` | Delete a scheduled task |
|
|
45
|
-
| `vibekit_account` | Get account info (plan, credits, usage) |
|
|
47
|
+
### Apps
|
|
48
|
+
- `vibekit_list_apps` — List all your hosted apps
|
|
49
|
+
- `vibekit_app_info` — Get app details
|
|
50
|
+
- `vibekit_start` / `vibekit_stop` / `vibekit_restart` — Container control
|
|
46
51
|
|
|
47
|
-
|
|
52
|
+
### AI Agent
|
|
53
|
+
- `vibekit_chat` — Send a message to your app's AI agent
|
|
54
|
+
- `vibekit_agent_status` — Agent status and model info
|
|
48
55
|
|
|
49
|
-
|
|
56
|
+
### Deploy
|
|
57
|
+
- `vibekit_deploy` — Trigger redeploy
|
|
58
|
+
- `vibekit_deploys` — Deploy history
|
|
59
|
+
- `vibekit_rollback` — Rollback to previous deploy
|
|
50
60
|
|
|
51
|
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
- "Create a weekly schedule to improve SEO on my repo"
|
|
61
|
+
### Logs & Files
|
|
62
|
+
- `vibekit_logs` — View app logs
|
|
63
|
+
- `vibekit_files` — Browse workspace files
|
|
55
64
|
|
|
56
|
-
|
|
65
|
+
### Environment
|
|
66
|
+
- `vibekit_env_list` / `vibekit_env_set` / `vibekit_env_delete` — Manage env vars
|
|
57
67
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
68
|
+
### Database
|
|
69
|
+
- `vibekit_db_status` — Database stats
|
|
70
|
+
- `vibekit_db_schema` — Tables, columns, types
|
|
71
|
+
- `vibekit_db_query` — Run read-only SQL
|
|
72
|
+
- `vibekit_db_table` — Browse table data
|
|
73
|
+
|
|
74
|
+
### Domain & QA
|
|
75
|
+
- `vibekit_set_domain` — Set custom domain
|
|
76
|
+
- `vibekit_qa` — Run QA audit
|
|
77
|
+
|
|
78
|
+
### Tasks
|
|
79
|
+
- `vibekit_submit_task` — Submit a headless coding task
|
|
80
|
+
- `vibekit_task_status` — Check task status
|
|
81
|
+
- `vibekit_account` — Plan, balance, usage
|
|
82
|
+
|
|
83
|
+
## Example Usage
|
|
84
|
+
|
|
85
|
+
Once connected, you can say things like:
|
|
86
|
+
|
|
87
|
+
- "List my VibeKit apps"
|
|
88
|
+
- "Show me the logs for my surf app"
|
|
89
|
+
- "Tell my agent to add a dark mode toggle"
|
|
90
|
+
- "Run a SQL query on my database"
|
|
91
|
+
- "Deploy my app"
|
|
62
92
|
|
|
63
93
|
## Links
|
|
64
94
|
|
|
65
|
-
-
|
|
66
|
-
-
|
|
67
|
-
-
|
|
68
|
-
|
|
95
|
+
- Website: https://vibekit.bot
|
|
96
|
+
- Dashboard: https://app.vibekit.bot
|
|
97
|
+
- CLI: https://www.npmjs.com/package/vibekit-cli
|
|
98
|
+
|
|
99
|
+
## License
|
|
100
|
+
|
|
101
|
+
MIT
|
package/dist/index.js
CHANGED
|
@@ -7,267 +7,380 @@ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
|
7
7
|
const API_BASE = process.env.VIBEKIT_API_URL || "https://vibekit.bot/api/v1";
|
|
8
8
|
const API_KEY = process.env.VIBEKIT_API_KEY || "";
|
|
9
9
|
if (!API_KEY) {
|
|
10
|
-
console.error("
|
|
11
|
-
console.error("Get one at https://t.me/the_vibe_kit_bot with /apikey command");
|
|
10
|
+
console.error("VIBEKIT_API_KEY is required. Get one at https://app.vibekit.bot/settings");
|
|
12
11
|
process.exit(1);
|
|
13
12
|
}
|
|
14
|
-
// API
|
|
15
|
-
async function
|
|
13
|
+
// ── API Helper ──────────────────────────────────────────────────────────────
|
|
14
|
+
async function api(method, path, body) {
|
|
16
15
|
try {
|
|
17
16
|
const res = await fetch(`${API_BASE}${path}`, {
|
|
18
17
|
method,
|
|
19
|
-
headers: {
|
|
20
|
-
"Authorization": `Bearer ${API_KEY}`,
|
|
21
|
-
"Content-Type": "application/json",
|
|
22
|
-
},
|
|
18
|
+
headers: { Authorization: `Bearer ${API_KEY}`, "Content-Type": "application/json" },
|
|
23
19
|
body: body ? JSON.stringify(body) : undefined,
|
|
24
20
|
});
|
|
21
|
+
if (res.status === 204)
|
|
22
|
+
return { ok: true, data: {} };
|
|
25
23
|
const data = await res.json();
|
|
26
|
-
if (!res.ok)
|
|
24
|
+
if (!res.ok)
|
|
27
25
|
return { ok: false, error: data.error || `HTTP ${res.status}` };
|
|
28
|
-
}
|
|
29
26
|
return { ok: true, data };
|
|
30
27
|
}
|
|
31
28
|
catch (err) {
|
|
32
|
-
return { ok: false, error: err
|
|
29
|
+
return { ok: false, error: err.message || "Request failed" };
|
|
33
30
|
}
|
|
34
31
|
}
|
|
35
|
-
// Tool
|
|
32
|
+
// ── Tool Definitions ────────────────────────────────────────────────────────
|
|
36
33
|
const tools = [
|
|
34
|
+
// Account
|
|
37
35
|
{
|
|
38
|
-
name: "
|
|
39
|
-
description: "
|
|
36
|
+
name: "vibekit_account",
|
|
37
|
+
description: "Get account info: plan, balance, session usage.",
|
|
38
|
+
inputSchema: { type: "object", properties: {} },
|
|
39
|
+
},
|
|
40
|
+
// Apps
|
|
41
|
+
{
|
|
42
|
+
name: "vibekit_list_apps",
|
|
43
|
+
description: "List all your hosted apps with status and URLs.",
|
|
44
|
+
inputSchema: { type: "object", properties: {} },
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "vibekit_app_info",
|
|
48
|
+
description: "Get details about a specific app.",
|
|
49
|
+
inputSchema: {
|
|
50
|
+
type: "object",
|
|
51
|
+
properties: { slug: { type: "string", description: "App subdomain slug or full UUID" } },
|
|
52
|
+
required: ["slug"],
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
// Agent Chat
|
|
56
|
+
{
|
|
57
|
+
name: "vibekit_chat",
|
|
58
|
+
description: "Send a message to an app's AI agent. The agent can modify code, deploy, fix bugs, add features.",
|
|
40
59
|
inputSchema: {
|
|
41
60
|
type: "object",
|
|
42
61
|
properties: {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
description: "What you want built or changed. Be specific about features, design, and behavior.",
|
|
46
|
-
},
|
|
47
|
-
repo: {
|
|
48
|
-
type: "string",
|
|
49
|
-
description: "GitHub repo in format 'owner/repo'. Optional — will use user's current repo if not specified.",
|
|
50
|
-
},
|
|
51
|
-
branch: {
|
|
52
|
-
type: "string",
|
|
53
|
-
description: "Git branch to work on. Default: main",
|
|
54
|
-
},
|
|
55
|
-
deploy: {
|
|
56
|
-
type: "boolean",
|
|
57
|
-
description: "Auto-deploy to Vercel when done. Default: true",
|
|
58
|
-
},
|
|
59
|
-
callbackUrl: {
|
|
60
|
-
type: "string",
|
|
61
|
-
description: "Webhook URL to receive task completion notification.",
|
|
62
|
-
},
|
|
62
|
+
slug: { type: "string", description: "App subdomain slug" },
|
|
63
|
+
message: { type: "string", description: "Message for the AI agent" },
|
|
63
64
|
},
|
|
64
|
-
required: ["
|
|
65
|
+
required: ["slug", "message"],
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: "vibekit_agent_status",
|
|
70
|
+
description: "Get the AI agent's status and model info for an app.",
|
|
71
|
+
inputSchema: {
|
|
72
|
+
type: "object",
|
|
73
|
+
properties: { slug: { type: "string", description: "App subdomain slug" } },
|
|
74
|
+
required: ["slug"],
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
// Deploy
|
|
78
|
+
{
|
|
79
|
+
name: "vibekit_deploy",
|
|
80
|
+
description: "Trigger a redeploy for an app.",
|
|
81
|
+
inputSchema: {
|
|
82
|
+
type: "object",
|
|
83
|
+
properties: { slug: { type: "string", description: "App subdomain slug" } },
|
|
84
|
+
required: ["slug"],
|
|
65
85
|
},
|
|
66
86
|
},
|
|
67
87
|
{
|
|
68
|
-
name: "
|
|
69
|
-
description: "
|
|
88
|
+
name: "vibekit_deploys",
|
|
89
|
+
description: "List deploy history for an app.",
|
|
90
|
+
inputSchema: {
|
|
91
|
+
type: "object",
|
|
92
|
+
properties: { slug: { type: "string", description: "App subdomain slug" } },
|
|
93
|
+
required: ["slug"],
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: "vibekit_rollback",
|
|
98
|
+
description: "Rollback an app to a previous deploy.",
|
|
70
99
|
inputSchema: {
|
|
71
100
|
type: "object",
|
|
72
101
|
properties: {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
description: "The task ID returned from vibekit_submit_task",
|
|
76
|
-
},
|
|
102
|
+
slug: { type: "string", description: "App subdomain slug" },
|
|
103
|
+
deployId: { type: "string", description: "Deploy ID to rollback to" },
|
|
77
104
|
},
|
|
78
|
-
required: ["
|
|
105
|
+
required: ["slug", "deployId"],
|
|
79
106
|
},
|
|
80
107
|
},
|
|
108
|
+
// Logs
|
|
81
109
|
{
|
|
82
|
-
name: "
|
|
83
|
-
description: "
|
|
110
|
+
name: "vibekit_logs",
|
|
111
|
+
description: "Get recent logs for an app.",
|
|
84
112
|
inputSchema: {
|
|
85
113
|
type: "object",
|
|
86
114
|
properties: {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
description: "Max number of tasks to return. Default: 10",
|
|
90
|
-
},
|
|
91
|
-
status: {
|
|
92
|
-
type: "string",
|
|
93
|
-
enum: ["pending", "running", "completed", "failed"],
|
|
94
|
-
description: "Filter by status",
|
|
95
|
-
},
|
|
115
|
+
slug: { type: "string", description: "App subdomain slug" },
|
|
116
|
+
lines: { type: "number", description: "Number of lines (default 50)" },
|
|
96
117
|
},
|
|
118
|
+
required: ["slug"],
|
|
97
119
|
},
|
|
98
120
|
},
|
|
121
|
+
// Container control
|
|
99
122
|
{
|
|
100
|
-
name: "
|
|
101
|
-
description: "
|
|
123
|
+
name: "vibekit_start",
|
|
124
|
+
description: "Start an app's container.",
|
|
125
|
+
inputSchema: {
|
|
126
|
+
type: "object",
|
|
127
|
+
properties: { slug: { type: "string", description: "App subdomain slug" } },
|
|
128
|
+
required: ["slug"],
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: "vibekit_stop",
|
|
133
|
+
description: "Stop an app's container.",
|
|
134
|
+
inputSchema: {
|
|
135
|
+
type: "object",
|
|
136
|
+
properties: { slug: { type: "string", description: "App subdomain slug" } },
|
|
137
|
+
required: ["slug"],
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
name: "vibekit_restart",
|
|
142
|
+
description: "Restart an app's container.",
|
|
143
|
+
inputSchema: {
|
|
144
|
+
type: "object",
|
|
145
|
+
properties: { slug: { type: "string", description: "App subdomain slug" } },
|
|
146
|
+
required: ["slug"],
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
// Env vars
|
|
150
|
+
{
|
|
151
|
+
name: "vibekit_env_list",
|
|
152
|
+
description: "List environment variables for an app.",
|
|
102
153
|
inputSchema: {
|
|
103
154
|
type: "object",
|
|
104
155
|
properties: {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
description: "The task ID to wait for",
|
|
108
|
-
},
|
|
109
|
-
timeoutSeconds: {
|
|
110
|
-
type: "number",
|
|
111
|
-
description: "Max seconds to wait. Default: 300 (5 minutes)",
|
|
112
|
-
},
|
|
156
|
+
slug: { type: "string", description: "App subdomain slug" },
|
|
157
|
+
reveal: { type: "boolean", description: "Show real values instead of masked" },
|
|
113
158
|
},
|
|
114
|
-
required: ["
|
|
159
|
+
required: ["slug"],
|
|
115
160
|
},
|
|
116
161
|
},
|
|
117
162
|
{
|
|
118
|
-
name: "
|
|
119
|
-
description: "
|
|
163
|
+
name: "vibekit_env_set",
|
|
164
|
+
description: "Set an environment variable.",
|
|
120
165
|
inputSchema: {
|
|
121
166
|
type: "object",
|
|
122
167
|
properties: {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
},
|
|
127
|
-
repo: {
|
|
128
|
-
type: "string",
|
|
129
|
-
description: "GitHub repo in format 'owner/repo'",
|
|
130
|
-
},
|
|
131
|
-
cron: {
|
|
132
|
-
type: "string",
|
|
133
|
-
description: "Cron expression. e.g., '0 9 * * 1' for every Monday at 9am UTC",
|
|
134
|
-
},
|
|
135
|
-
name: {
|
|
136
|
-
type: "string",
|
|
137
|
-
description: "Friendly name for the schedule",
|
|
138
|
-
},
|
|
168
|
+
slug: { type: "string", description: "App subdomain slug" },
|
|
169
|
+
key: { type: "string", description: "Variable name" },
|
|
170
|
+
value: { type: "string", description: "Variable value" },
|
|
139
171
|
},
|
|
140
|
-
required: ["
|
|
172
|
+
required: ["slug", "key", "value"],
|
|
141
173
|
},
|
|
142
174
|
},
|
|
143
175
|
{
|
|
144
|
-
name: "
|
|
145
|
-
description: "
|
|
176
|
+
name: "vibekit_env_delete",
|
|
177
|
+
description: "Delete an environment variable.",
|
|
146
178
|
inputSchema: {
|
|
147
179
|
type: "object",
|
|
148
|
-
properties: {
|
|
180
|
+
properties: {
|
|
181
|
+
slug: { type: "string", description: "App subdomain slug" },
|
|
182
|
+
key: { type: "string", description: "Variable name to delete" },
|
|
183
|
+
},
|
|
184
|
+
required: ["slug", "key"],
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
// Database
|
|
188
|
+
{
|
|
189
|
+
name: "vibekit_db_status",
|
|
190
|
+
description: "Get database status for an app (tables, size, connections).",
|
|
191
|
+
inputSchema: {
|
|
192
|
+
type: "object",
|
|
193
|
+
properties: { slug: { type: "string", description: "App subdomain slug" } },
|
|
194
|
+
required: ["slug"],
|
|
149
195
|
},
|
|
150
196
|
},
|
|
151
197
|
{
|
|
152
|
-
name: "
|
|
153
|
-
description: "
|
|
198
|
+
name: "vibekit_db_schema",
|
|
199
|
+
description: "Get database schema — tables, columns, types, foreign keys.",
|
|
200
|
+
inputSchema: {
|
|
201
|
+
type: "object",
|
|
202
|
+
properties: { slug: { type: "string", description: "App subdomain slug" } },
|
|
203
|
+
required: ["slug"],
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
name: "vibekit_db_query",
|
|
208
|
+
description: "Run a read-only SQL query against an app's database.",
|
|
154
209
|
inputSchema: {
|
|
155
210
|
type: "object",
|
|
156
211
|
properties: {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
description: "The schedule ID to delete",
|
|
160
|
-
},
|
|
212
|
+
slug: { type: "string", description: "App subdomain slug" },
|
|
213
|
+
sql: { type: "string", description: "SQL query (SELECT only)" },
|
|
161
214
|
},
|
|
162
|
-
required: ["
|
|
215
|
+
required: ["slug", "sql"],
|
|
163
216
|
},
|
|
164
217
|
},
|
|
165
218
|
{
|
|
166
|
-
name: "
|
|
167
|
-
description: "
|
|
219
|
+
name: "vibekit_db_table",
|
|
220
|
+
description: "Browse data in a specific table.",
|
|
221
|
+
inputSchema: {
|
|
222
|
+
type: "object",
|
|
223
|
+
properties: {
|
|
224
|
+
slug: { type: "string", description: "App subdomain slug" },
|
|
225
|
+
table: { type: "string", description: "Table name" },
|
|
226
|
+
limit: { type: "number", description: "Max rows (default 20)" },
|
|
227
|
+
},
|
|
228
|
+
required: ["slug", "table"],
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
// Files
|
|
232
|
+
{
|
|
233
|
+
name: "vibekit_files",
|
|
234
|
+
description: "Browse workspace files for an app.",
|
|
235
|
+
inputSchema: {
|
|
236
|
+
type: "object",
|
|
237
|
+
properties: {
|
|
238
|
+
slug: { type: "string", description: "App subdomain slug" },
|
|
239
|
+
path: { type: "string", description: "Directory path (default: root)" },
|
|
240
|
+
},
|
|
241
|
+
required: ["slug"],
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
// QA
|
|
245
|
+
{
|
|
246
|
+
name: "vibekit_qa",
|
|
247
|
+
description: "Run a QA audit on an app — checks for bugs, accessibility, performance issues.",
|
|
248
|
+
inputSchema: {
|
|
249
|
+
type: "object",
|
|
250
|
+
properties: { slug: { type: "string", description: "App subdomain slug" } },
|
|
251
|
+
required: ["slug"],
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
// Domain
|
|
255
|
+
{
|
|
256
|
+
name: "vibekit_set_domain",
|
|
257
|
+
description: "Set a custom domain for an app.",
|
|
168
258
|
inputSchema: {
|
|
169
259
|
type: "object",
|
|
170
|
-
properties: {
|
|
260
|
+
properties: {
|
|
261
|
+
slug: { type: "string", description: "App subdomain slug" },
|
|
262
|
+
domain: { type: "string", description: "Custom domain (e.g. myapp.com)" },
|
|
263
|
+
},
|
|
264
|
+
required: ["slug", "domain"],
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
// Tasks (headless API)
|
|
268
|
+
{
|
|
269
|
+
name: "vibekit_submit_task",
|
|
270
|
+
description: "Submit a coding task. An AI agent will build code and deploy it.",
|
|
271
|
+
inputSchema: {
|
|
272
|
+
type: "object",
|
|
273
|
+
properties: {
|
|
274
|
+
task: { type: "string", description: "What to build or change" },
|
|
275
|
+
repo: { type: "string", description: "GitHub repo (owner/repo)" },
|
|
276
|
+
branch: { type: "string", description: "Branch (default: main)" },
|
|
277
|
+
},
|
|
278
|
+
required: ["task"],
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
name: "vibekit_task_status",
|
|
283
|
+
description: "Check status of a submitted task.",
|
|
284
|
+
inputSchema: {
|
|
285
|
+
type: "object",
|
|
286
|
+
properties: { taskId: { type: "string", description: "Task ID" } },
|
|
287
|
+
required: ["taskId"],
|
|
171
288
|
},
|
|
172
289
|
},
|
|
173
290
|
];
|
|
174
|
-
// Tool
|
|
291
|
+
// ── Tool Handlers ───────────────────────────────────────────────────────────
|
|
175
292
|
async function handleTool(name, args) {
|
|
176
293
|
let result;
|
|
294
|
+
const s = args.slug;
|
|
295
|
+
const h = `/hosting/app/${s}`;
|
|
177
296
|
switch (name) {
|
|
178
|
-
case "
|
|
179
|
-
result = await
|
|
180
|
-
task: args.task,
|
|
181
|
-
repo: args.repo,
|
|
182
|
-
branch: args.branch,
|
|
183
|
-
deploy: args.deploy ?? true,
|
|
184
|
-
callbackUrl: args.callbackUrl,
|
|
185
|
-
});
|
|
297
|
+
case "vibekit_account":
|
|
298
|
+
result = await api("GET", "/account");
|
|
186
299
|
break;
|
|
187
|
-
case "
|
|
188
|
-
result = await
|
|
300
|
+
case "vibekit_list_apps":
|
|
301
|
+
result = await api("GET", "/hosting/apps");
|
|
189
302
|
break;
|
|
190
|
-
case "
|
|
191
|
-
|
|
192
|
-
const params = new URLSearchParams();
|
|
193
|
-
if (args.limit)
|
|
194
|
-
params.set("limit", String(args.limit));
|
|
195
|
-
if (args.status)
|
|
196
|
-
params.set("status", String(args.status));
|
|
197
|
-
if (params.toString())
|
|
198
|
-
path += `?${params.toString()}`;
|
|
199
|
-
result = await apiRequest("GET", path);
|
|
303
|
+
case "vibekit_app_info":
|
|
304
|
+
result = await api("GET", h);
|
|
200
305
|
break;
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
const taskId = args.taskId;
|
|
204
|
-
const timeout = (args.timeoutSeconds || 300) * 1000;
|
|
205
|
-
const start = Date.now();
|
|
206
|
-
while (Date.now() - start < timeout) {
|
|
207
|
-
result = await apiRequest("GET", `/task/${taskId}`);
|
|
208
|
-
if (!result.ok)
|
|
209
|
-
break;
|
|
210
|
-
const task = result.data;
|
|
211
|
-
if (task.status === "completed" || task.status === "failed") {
|
|
212
|
-
break;
|
|
213
|
-
}
|
|
214
|
-
await new Promise((r) => setTimeout(r, 5000));
|
|
215
|
-
}
|
|
216
|
-
if (!result) {
|
|
217
|
-
result = { ok: false, error: "Timeout waiting for task" };
|
|
218
|
-
}
|
|
306
|
+
case "vibekit_chat":
|
|
307
|
+
result = await api("POST", `${h}/agent`, { message: args.message });
|
|
219
308
|
break;
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
result = await apiRequest("POST", "/schedule", {
|
|
223
|
-
task: args.task,
|
|
224
|
-
repo: args.repo,
|
|
225
|
-
cron: args.cron,
|
|
226
|
-
name: args.name,
|
|
227
|
-
});
|
|
309
|
+
case "vibekit_agent_status":
|
|
310
|
+
result = await api("GET", `${h}/agent/status`);
|
|
228
311
|
break;
|
|
229
|
-
case "
|
|
230
|
-
result = await
|
|
312
|
+
case "vibekit_deploy":
|
|
313
|
+
result = await api("POST", `${h}/redeploy`);
|
|
231
314
|
break;
|
|
232
|
-
case "
|
|
233
|
-
result = await
|
|
315
|
+
case "vibekit_deploys":
|
|
316
|
+
result = await api("GET", `${h}/deploys`);
|
|
234
317
|
break;
|
|
235
|
-
case "
|
|
236
|
-
result = await
|
|
318
|
+
case "vibekit_rollback":
|
|
319
|
+
result = await api("POST", `${h}/deploys/${args.deployId}/rollback`);
|
|
320
|
+
break;
|
|
321
|
+
case "vibekit_logs":
|
|
322
|
+
result = await api("GET", `${h}/logs?lines=${args.lines || 50}`);
|
|
323
|
+
break;
|
|
324
|
+
case "vibekit_start":
|
|
325
|
+
result = await api("POST", `${h}/start`);
|
|
326
|
+
break;
|
|
327
|
+
case "vibekit_stop":
|
|
328
|
+
result = await api("POST", `${h}/stop`);
|
|
329
|
+
break;
|
|
330
|
+
case "vibekit_restart":
|
|
331
|
+
result = await api("POST", `${h}/restart`);
|
|
332
|
+
break;
|
|
333
|
+
case "vibekit_env_list":
|
|
334
|
+
result = await api("GET", `${h}/env${args.reveal ? '?reveal=true' : ''}`);
|
|
335
|
+
break;
|
|
336
|
+
case "vibekit_env_set":
|
|
337
|
+
result = await api("POST", `${h}/env`, { vars: { [args.key]: args.value } });
|
|
338
|
+
break;
|
|
339
|
+
case "vibekit_env_delete":
|
|
340
|
+
result = await api("DELETE", `${h}/env/${args.key}`);
|
|
237
341
|
break;
|
|
238
|
-
|
|
239
|
-
result =
|
|
342
|
+
case "vibekit_db_status":
|
|
343
|
+
result = await api("GET", `${h}/database`);
|
|
344
|
+
break;
|
|
345
|
+
case "vibekit_db_schema":
|
|
346
|
+
result = await api("GET", `${h}/database/schema`);
|
|
347
|
+
break;
|
|
348
|
+
case "vibekit_db_query":
|
|
349
|
+
result = await api("POST", `${h}/database/query`, { sql: args.sql });
|
|
350
|
+
break;
|
|
351
|
+
case "vibekit_db_table":
|
|
352
|
+
result = await api("GET", `${h}/database/tables/${args.table}?limit=${args.limit || 20}`);
|
|
353
|
+
break;
|
|
354
|
+
case "vibekit_files":
|
|
355
|
+
result = await api("GET", `${h}/agent/files${args.path ? `?path=${encodeURIComponent(args.path)}` : ''}`);
|
|
356
|
+
break;
|
|
357
|
+
case "vibekit_qa":
|
|
358
|
+
result = await api("POST", `${h}/qa`);
|
|
359
|
+
break;
|
|
360
|
+
case "vibekit_set_domain":
|
|
361
|
+
result = await api("POST", `${h}/domain`, { domain: args.domain });
|
|
362
|
+
break;
|
|
363
|
+
case "vibekit_submit_task":
|
|
364
|
+
result = await api("POST", "/task", { prompt: args.task, repo: args.repo, branch: args.branch });
|
|
365
|
+
break;
|
|
366
|
+
case "vibekit_task_status":
|
|
367
|
+
result = await api("GET", `/task/${args.taskId}`);
|
|
368
|
+
break;
|
|
369
|
+
default: result = { ok: false, error: `Unknown tool: ${name}` };
|
|
240
370
|
}
|
|
241
|
-
const text = result.ok
|
|
242
|
-
? JSON.stringify(result.data, null, 2)
|
|
243
|
-
: `Error: ${result.error}`;
|
|
371
|
+
const text = result.ok ? JSON.stringify(result.data, null, 2) : `Error: ${result.error}`;
|
|
244
372
|
return { content: [{ type: "text", text }] };
|
|
245
373
|
}
|
|
246
|
-
//
|
|
247
|
-
const server = new index_js_1.Server({
|
|
248
|
-
|
|
249
|
-
version: "0.1.0",
|
|
250
|
-
}, {
|
|
251
|
-
capabilities: {
|
|
252
|
-
tools: {},
|
|
253
|
-
},
|
|
254
|
-
});
|
|
255
|
-
// Handle tool listing
|
|
256
|
-
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
|
|
257
|
-
tools,
|
|
258
|
-
}));
|
|
259
|
-
// Handle tool calls
|
|
374
|
+
// ── Server ──────────────────────────────────────────────────────────────────
|
|
375
|
+
const server = new index_js_1.Server({ name: "vibekit-mcp", version: "0.3.0" }, { capabilities: { tools: {} } });
|
|
376
|
+
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({ tools }));
|
|
260
377
|
server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
261
378
|
const { name, arguments: args } = request.params;
|
|
262
379
|
return handleTool(name, (args || {}));
|
|
263
380
|
});
|
|
264
|
-
// Start server
|
|
265
381
|
async function main() {
|
|
266
382
|
const transport = new stdio_js_1.StdioServerTransport();
|
|
267
383
|
await server.connect(transport);
|
|
268
384
|
console.error("VibeKit MCP server running on stdio");
|
|
269
385
|
}
|
|
270
|
-
main().catch((err) => {
|
|
271
|
-
console.error("Fatal error:", err);
|
|
272
|
-
process.exit(1);
|
|
273
|
-
});
|
|
386
|
+
main().catch((err) => { console.error("Fatal:", err); process.exit(1); });
|
package/package.json
CHANGED
|
@@ -1,33 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibekit-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "MCP server for VibeKit —
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "MCP server for VibeKit — manage AI-powered apps as tools in Claude Desktop, Cursor, Windsurf, etc.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
|
-
"bin": {
|
|
7
|
-
|
|
8
|
-
},
|
|
9
|
-
"
|
|
10
|
-
|
|
11
|
-
"README.md"
|
|
12
|
-
],
|
|
13
|
-
"scripts": {
|
|
14
|
-
"build": "tsc",
|
|
15
|
-
"prepublishOnly": "npm run build"
|
|
16
|
-
},
|
|
17
|
-
"keywords": ["mcp", "vibekit", "claude", "ai", "coding", "tools", "anthropic"],
|
|
18
|
-
"author": "609.sol",
|
|
6
|
+
"bin": { "vibekit-mcp": "./dist/index.js" },
|
|
7
|
+
"files": ["dist/", "README.md"],
|
|
8
|
+
"scripts": { "build": "tsc", "prepublishOnly": "npm run build" },
|
|
9
|
+
"keywords": ["mcp", "vibekit", "claude", "cursor", "ai", "agent", "deploy", "model-context-protocol"],
|
|
10
|
+
"author": "VibeKit",
|
|
19
11
|
"license": "MIT",
|
|
20
|
-
"repository": {
|
|
21
|
-
"type": "git",
|
|
22
|
-
"url": "https://github.com/609NFT/vibekit.git",
|
|
23
|
-
"directory": "packages/mcp-server"
|
|
24
|
-
},
|
|
25
12
|
"homepage": "https://vibekit.bot",
|
|
26
|
-
"
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
"devDependencies": {
|
|
30
|
-
"@types/node": "^20.0.0",
|
|
31
|
-
"typescript": "^5.0.0"
|
|
32
|
-
}
|
|
13
|
+
"repository": { "type": "git", "url": "https://github.com/vibekit-apps/vibekit-mcp" },
|
|
14
|
+
"dependencies": { "@modelcontextprotocol/sdk": "^1.0.0" },
|
|
15
|
+
"devDependencies": { "typescript": "^5.0.0", "@types/node": "^22.0.0" }
|
|
33
16
|
}
|