@vibecloud/mcp-server 1.1.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 ADDED
@@ -0,0 +1,298 @@
1
+ # VibeCloud MCP Server
2
+
3
+ An [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) server that lets AI assistants like Claude Code interact with the VibeCloud API to provision cloud dev environments, create deployments, manage storage, configure domains, handle secrets, and more.
4
+
5
+ ## Installation
6
+
7
+ Install globally from npm:
8
+
9
+ ```bash
10
+ npm install -g @vibecloud/mcp-server
11
+ ```
12
+
13
+ Or, if you prefer to build from source:
14
+
15
+ ```bash
16
+ cd mcp-server
17
+ npm install
18
+ npm run build
19
+ ```
20
+
21
+ ## Prerequisites
22
+
23
+ - **Node.js 18+** (for native `fetch` support)
24
+ - **A VibeCloud account** at [remotevibecoder.com](https://remotevibecoder.com)
25
+
26
+ ## Quick Start
27
+
28
+ ### 1. Configure Claude Code
29
+
30
+ Add the VibeCloud MCP server to your Claude Code configuration. Edit the file at `~/.claude.json` (or create it) and add a `mcpServers` entry.
31
+
32
+ **Option A: API Key authentication (recommended for CI/programmatic use)**
33
+
34
+ ```json
35
+ {
36
+ "mcpServers": {
37
+ "vibecloud": {
38
+ "command": "vibecloud-mcp",
39
+ "env": {
40
+ "VIBECLOUD_API_KEY": "your-api-key-here"
41
+ }
42
+ }
43
+ }
44
+ }
45
+ ```
46
+
47
+ **Option B: JWT token authentication**
48
+
49
+ ```json
50
+ {
51
+ "mcpServers": {
52
+ "vibecloud": {
53
+ "command": "vibecloud-mcp",
54
+ "env": {
55
+ "VIBECLOUD_API_TOKEN": "your-jwt-token-here"
56
+ }
57
+ }
58
+ }
59
+ }
60
+ ```
61
+
62
+ **Option C: Automatic via CLI login (recommended for local development)**
63
+
64
+ If you have the VibeCloud CLI installed, just run `vibe login` and the MCP server will automatically pick up the JWT token from `~/.vibe/config.json`. No extra configuration needed:
65
+
66
+ ```json
67
+ {
68
+ "mcpServers": {
69
+ "vibecloud": {
70
+ "command": "vibecloud-mcp"
71
+ }
72
+ }
73
+ }
74
+ ```
75
+
76
+ If you installed from source instead of npm, use `node /absolute/path/to/mcp-server/dist/index.js` as the command instead of `vibecloud-mcp`.
77
+
78
+ ### 2. Restart Claude Code
79
+
80
+ After adding the configuration, restart Claude Code. The VibeCloud tools will appear in Claude's available tools.
81
+
82
+ ## Authentication
83
+
84
+ The MCP server resolves credentials in the following priority order:
85
+
86
+ 1. **API Key** (`VIBECLOUD_API_KEY` env var): Sent as an `X-API-Key` header. Best for CI/CD pipelines and programmatic access.
87
+
88
+ 2. **JWT token** (`VIBECLOUD_API_TOKEN` env var): Sent as a `Bearer` token in the `Authorization` header.
89
+
90
+ 3. **Shared CLI config**: If you have already run `vibe login` from the VibeCloud CLI, the MCP server automatically reads the JWT token from `~/.vibe/config.json`. No extra setup needed.
91
+
92
+ 4. **Login via tool**: Ask Claude to use the `vibecloud_login` tool with your email and password. The token is saved to `~/.vibe/config.json` for future use.
93
+
94
+ JWT tokens are automatically refreshed when they expire. If refresh fails, you'll be prompted to re-authenticate.
95
+
96
+ ## Available Tools (77 total)
97
+
98
+ ### Authentication
99
+ | Tool | Description |
100
+ |------|-------------|
101
+ | `vibecloud_login` | Authenticate with email/password and store JWT token |
102
+ | `vibecloud_register` | Create a new VibeCloud account |
103
+
104
+ ### User Profile
105
+ | Tool | Description |
106
+ |------|-------------|
107
+ | `vibecloud_whoami` | Get your account info (email, name, ID) |
108
+ | `vibecloud_update_profile` | Update your profile (name, etc.) |
109
+
110
+ ### Projects
111
+ | Tool | Description |
112
+ |------|-------------|
113
+ | `vibecloud_list_projects` | List all projects |
114
+ | `vibecloud_get_project` | Get details of a specific project |
115
+ | `vibecloud_create_project` | Create a new project |
116
+ | `vibecloud_update_project` | Update a project's name or settings |
117
+ | `vibecloud_delete_project` | Delete a project |
118
+
119
+ ### API Keys
120
+ | Tool | Description |
121
+ |------|-------------|
122
+ | `vibecloud_list_api_keys` | List all API keys |
123
+ | `vibecloud_get_api_key` | Get details of a specific API key |
124
+ | `vibecloud_create_api_key` | Create a new API key with scopes |
125
+ | `vibecloud_update_api_key` | Update an API key's name or scopes |
126
+ | `vibecloud_delete_api_key` | Revoke an API key |
127
+
128
+ ### Environments
129
+ | Tool | Description |
130
+ |------|-------------|
131
+ | `vibecloud_create_environment` | Create a new cloud dev environment |
132
+ | `vibecloud_list_environments` | List all environments |
133
+ | `vibecloud_get_environment` | Get details of a specific environment |
134
+ | `vibecloud_update_environment` | Update an environment's configuration |
135
+ | `vibecloud_start_environment` | Start a stopped environment |
136
+ | `vibecloud_stop_environment` | Stop a running environment |
137
+ | `vibecloud_delete_environment` | Delete an environment |
138
+ | `vibecloud_get_environment_status` | Get provisioning and server status |
139
+
140
+ ### Instances
141
+ | Tool | Description |
142
+ |------|-------------|
143
+ | `vibecloud_list_instances` | List all running instances |
144
+ | `vibecloud_get_instance` | Get details of a specific instance |
145
+ | `vibecloud_get_instance_metrics` | Get CPU, memory, GPU metrics |
146
+ | `vibecloud_cancel_shutdown` | Cancel an idle auto-shutdown |
147
+
148
+ ### Deployments
149
+ | Tool | Description |
150
+ |------|-------------|
151
+ | `vibecloud_deploy` | Create a new production deployment with DNS/SSL |
152
+ | `vibecloud_list_deployments` | List all deployments |
153
+ | `vibecloud_get_deployment` | Get deployment details |
154
+ | `vibecloud_update_deployment` | Update deployment settings |
155
+ | `vibecloud_delete_deployment` | Delete a deployment |
156
+ | `vibecloud_stop_deployment` | Stop a deployment (removes DNS) |
157
+ | `vibecloud_check_deployment_health` | Run a health check on a deployment |
158
+ | `vibecloud_enable_hosting` | Enable always-on hosting |
159
+ | `vibecloud_disable_hosting` | Disable always-on hosting |
160
+ | `vibecloud_connect_github` | Connect GitHub repo for auto-deploy |
161
+ | `vibecloud_disconnect_github` | Disconnect GitHub auto-deploy |
162
+
163
+ ### Secrets (Infisical)
164
+ | Tool | Description |
165
+ |------|-------------|
166
+ | `vibecloud_create_secret_identity` | Provision Infisical machine identity for secret injection |
167
+
168
+ ### Environment Variables
169
+ | Tool | Description |
170
+ |------|-------------|
171
+ | `vibecloud_set_env_var` | Set/update an environment variable |
172
+ | `vibecloud_list_env_vars` | List env vars (values masked) |
173
+ | `vibecloud_delete_env_var` | Delete an environment variable |
174
+
175
+ ### Domains
176
+ | Tool | Description |
177
+ |------|-------------|
178
+ | `vibecloud_list_domains` | List all custom domains |
179
+ | `vibecloud_setup_domain` | Set up a custom domain for a deployment |
180
+ | `vibecloud_verify_domain` | Verify DNS is configured correctly |
181
+ | `vibecloud_delete_domain` | Remove a custom domain |
182
+
183
+ ### Storage Buckets
184
+ | Tool | Description |
185
+ |------|-------------|
186
+ | `vibecloud_create_bucket` | Create an S3-compatible storage bucket |
187
+ | `vibecloud_list_buckets` | List all storage buckets |
188
+ | `vibecloud_get_bucket` | Get bucket details |
189
+ | `vibecloud_get_bucket_by_name` | Look up a bucket by name |
190
+ | `vibecloud_get_bucket_credentials` | Get S3 access credentials |
191
+ | `vibecloud_delete_bucket` | Delete a bucket |
192
+
193
+ ### Servers
194
+ | Tool | Description |
195
+ |------|-------------|
196
+ | `vibecloud_list_servers` | List all bare metal servers |
197
+ | `vibecloud_get_server` | Get server details |
198
+ | `vibecloud_create_server` | Provision a new bare metal server |
199
+ | `vibecloud_power_on_server` | Power on a server |
200
+ | `vibecloud_power_off_server` | Power off a server |
201
+ | `vibecloud_delete_server` | Delete a server |
202
+
203
+ ### SSH Keys
204
+ | Tool | Description |
205
+ |------|-------------|
206
+ | `vibecloud_list_ssh_keys` | List all registered SSH keys |
207
+ | `vibecloud_create_ssh_key` | Register a new SSH public key |
208
+ | `vibecloud_delete_ssh_key` | Remove an SSH key |
209
+
210
+ ### Organizations
211
+ | Tool | Description |
212
+ |------|-------------|
213
+ | `vibecloud_list_organizations` | List organizations you belong to |
214
+ | `vibecloud_get_organization` | Get organization details |
215
+ | `vibecloud_get_organization_members` | List organization members |
216
+ | `vibecloud_get_organization_projects` | List organization projects |
217
+
218
+ ### Billing
219
+ | Tool | Description |
220
+ |------|-------------|
221
+ | `vibecloud_billing_status` | Get subscription and billing status |
222
+ | `vibecloud_list_tiers` | List pricing tiers and features |
223
+ | `vibecloud_get_usage` | Get current billing period usage |
224
+ | `vibecloud_create_checkout` | Create a Stripe checkout session to upgrade |
225
+ | `vibecloud_create_portal` | Open the Stripe billing portal |
226
+
227
+ ### Billing Add-Ons
228
+ | Tool | Description |
229
+ |------|-------------|
230
+ | `vibecloud_list_add_ons` | List active billing add-ons |
231
+ | `vibecloud_create_add_on` | Add a billing add-on |
232
+ | `vibecloud_delete_add_on` | Remove a billing add-on |
233
+
234
+ ### Certificates
235
+ | Tool | Description |
236
+ |------|-------------|
237
+ | `vibecloud_get_certificate` | Get certificate details |
238
+ | `vibecloud_download_certificate` | Download certificate files |
239
+ | `vibecloud_create_client_cert` | Generate a client certificate |
240
+ | `vibecloud_revoke_certificate` | Revoke a certificate |
241
+
242
+ ### Network
243
+ | Tool | Description |
244
+ |------|-------------|
245
+ | `vibecloud_create_network_auth_key` | Create a VPN network auth key |
246
+
247
+ ## Example Conversations
248
+
249
+ Once configured, you can ask Claude things like:
250
+
251
+ - "Who am I on VibeCloud?" (uses `vibecloud_whoami`)
252
+ - "List my VibeCloud projects" (uses `vibecloud_list_projects`)
253
+ - "Create a new environment called 'my-saas-app' with the gpu-l40s-1x plan"
254
+ - "Deploy my app to VibeCloud with the name 'my-saas-app' on server 203.0.113.42"
255
+ - "Set up secret injection for my deployment" (uses `vibecloud_create_secret_identity`)
256
+ - "Set the DATABASE_URL environment variable on my deployment"
257
+ - "Set up the custom domain myapp.com on my deployment" (uses `vibecloud_setup_domain`)
258
+ - "Verify that my domain DNS is configured" (uses `vibecloud_verify_domain`)
259
+ - "Create a storage bucket called 'user-uploads'"
260
+ - "What's my current billing status?"
261
+ - "Show me my server metrics" (uses `vibecloud_get_instance_metrics`)
262
+ - "Cancel the auto-shutdown on my instance" (uses `vibecloud_cancel_shutdown`)
263
+ - "Connect my GitHub repo acme/myapp to my deployment for auto-deploy"
264
+ - "Create an API key with read and write access"
265
+ - "List my organization members"
266
+ - "Power off my server" (uses `vibecloud_power_off_server`)
267
+
268
+ ## Configuration
269
+
270
+ | Environment Variable | Default | Description |
271
+ |---------------------|---------|-------------|
272
+ | `VIBECLOUD_API_KEY` | _(none)_ | API key for authentication (sent as `X-API-Key` header) |
273
+ | `VIBECLOUD_API_TOKEN` | _(none)_ | JWT token for authentication (sent as `Bearer` token) |
274
+ | `VIBECLOUD_API_URL` | `https://api.remotevibecoder.com` | VibeCloud API base URL |
275
+
276
+ ## Development
277
+
278
+ ```bash
279
+ # Watch mode - recompile on changes
280
+ npm run dev
281
+
282
+ # In another terminal, test with MCP inspector
283
+ npx @modelcontextprotocol/inspector node dist/index.js
284
+ ```
285
+
286
+ ## Architecture
287
+
288
+ ```
289
+ mcp-server/
290
+ src/
291
+ index.ts # MCP server - 77 tool definitions and request handlers
292
+ api.ts # VibeCloud API client - HTTP methods for all endpoints
293
+ dist/ # Compiled JavaScript (generated by `npm run build`)
294
+ package.json
295
+ tsconfig.json
296
+ ```
297
+
298
+ The server communicates over stdio using JSON-RPC, following the MCP specification. Each tool maps to one or more VibeCloud REST API endpoints. The API client handles authentication, error formatting, JWT auto-refresh, and token persistence.
package/dist/api.d.ts ADDED
@@ -0,0 +1,149 @@
1
+ /**
2
+ * API response wrapper - VibeCloud API returns { data: ... } for success
3
+ * and { error: "..." } or { errors: {...} } for failures.
4
+ */
5
+ interface ApiResponse<T = unknown> {
6
+ data?: T;
7
+ error?: string;
8
+ errors?: Record<string, string[]>;
9
+ message?: string;
10
+ dns?: Record<string, unknown>;
11
+ credentials?: Record<string, unknown>;
12
+ github?: Record<string, unknown>;
13
+ hosting?: Record<string, unknown>;
14
+ }
15
+ /**
16
+ * VibeCloudAPI is an HTTP client for the VibeCloud REST API.
17
+ *
18
+ * It handles authentication via API keys or JWT tokens. Authentication
19
+ * is resolved in priority order:
20
+ * 1. VIBECLOUD_API_KEY env var (sent as X-API-Key header)
21
+ * 2. VIBECLOUD_API_TOKEN env var (sent as Bearer token)
22
+ * 3. ~/.vibe/config.json JWT (sent as Bearer token, shared with CLI)
23
+ *
24
+ * JWT tokens are auto-refreshed on 401 responses.
25
+ */
26
+ export declare class VibeCloudAPI {
27
+ private baseUrl;
28
+ private apiKey;
29
+ private token;
30
+ private refreshing;
31
+ constructor(baseUrl?: string);
32
+ /**
33
+ * Load JWT token from ~/.vibe/config.json (shared with the CLI).
34
+ */
35
+ private loadToken;
36
+ /**
37
+ * Save JWT token to ~/.vibe/config.json so the CLI can also use it.
38
+ */
39
+ private saveToken;
40
+ /**
41
+ * Check whether we currently have valid credentials (API key or JWT token).
42
+ */
43
+ isAuthenticated(): boolean;
44
+ private authHeaders;
45
+ /**
46
+ * Attempt to refresh the JWT token using the /auth/refresh endpoint.
47
+ * Returns true if refresh succeeded, false otherwise.
48
+ */
49
+ private refreshToken;
50
+ private request;
51
+ private get;
52
+ private post;
53
+ private put;
54
+ private patch;
55
+ private del;
56
+ private requireAuth;
57
+ /**
58
+ * Authenticate with email and password. Returns user info and stores
59
+ * the JWT token for subsequent requests.
60
+ */
61
+ login(email: string, password: string): Promise<{
62
+ token: string;
63
+ user: {
64
+ id: string;
65
+ email: string;
66
+ name: string;
67
+ };
68
+ }>;
69
+ /**
70
+ * Register a new account with email and password.
71
+ */
72
+ register(email: string, password: string, name?: string): Promise<ApiResponse>;
73
+ getMe(): Promise<ApiResponse>;
74
+ updateMe(params: Record<string, unknown>): Promise<ApiResponse>;
75
+ listProjects(): Promise<ApiResponse>;
76
+ getProject(projectId: string): Promise<ApiResponse>;
77
+ createProject(name: string): Promise<ApiResponse>;
78
+ updateProject(projectId: string, params: Record<string, unknown>): Promise<ApiResponse>;
79
+ deleteProject(projectId: string): Promise<ApiResponse>;
80
+ listApiKeys(): Promise<ApiResponse>;
81
+ getApiKey(keyId: string): Promise<ApiResponse>;
82
+ createApiKey(name: string, scopes: string[], projectId?: string): Promise<ApiResponse>;
83
+ updateApiKey(keyId: string, params: Record<string, unknown>): Promise<ApiResponse>;
84
+ deleteApiKey(keyId: string): Promise<ApiResponse>;
85
+ createEnvironment(name: string, plan?: string): Promise<ApiResponse>;
86
+ listEnvironments(): Promise<ApiResponse>;
87
+ getEnvironment(environmentId: string): Promise<ApiResponse>;
88
+ updateEnvironment(environmentId: string, params: Record<string, unknown>): Promise<ApiResponse>;
89
+ startEnvironment(environmentId: string): Promise<ApiResponse>;
90
+ stopEnvironment(environmentId: string): Promise<ApiResponse>;
91
+ deleteEnvironment(id: string): Promise<ApiResponse>;
92
+ getEnvironmentStatus(environmentId: string): Promise<ApiResponse>;
93
+ listInstances(): Promise<ApiResponse>;
94
+ getInstance(instanceId: string): Promise<ApiResponse>;
95
+ getInstanceMetrics(instanceId: string): Promise<ApiResponse>;
96
+ cancelShutdown(instanceId: string): Promise<ApiResponse>;
97
+ createDeployment(appName: string, serverIp: string, tier?: string): Promise<ApiResponse>;
98
+ listDeployments(): Promise<ApiResponse>;
99
+ getDeployment(deploymentId: string): Promise<ApiResponse>;
100
+ updateDeployment(deploymentId: string, params: Record<string, unknown>): Promise<ApiResponse>;
101
+ deleteDeployment(deploymentId: string): Promise<ApiResponse>;
102
+ enableHosting(deploymentId: string): Promise<ApiResponse>;
103
+ disableHosting(deploymentId: string): Promise<ApiResponse>;
104
+ connectGithub(deploymentId: string, repo: string, branch?: string): Promise<ApiResponse>;
105
+ disconnectGithub(deploymentId: string): Promise<ApiResponse>;
106
+ stopDeployment(deploymentId: string): Promise<ApiResponse>;
107
+ checkDeploymentHealth(deploymentId: string): Promise<ApiResponse>;
108
+ createSecretIdentity(deploymentId: string): Promise<ApiResponse>;
109
+ setEnvVar(deploymentId: string, key: string, value: string): Promise<ApiResponse>;
110
+ listEnvVars(deploymentId: string): Promise<ApiResponse>;
111
+ deleteEnvVar(deploymentId: string, key: string): Promise<ApiResponse>;
112
+ listDomains(): Promise<ApiResponse>;
113
+ setupDomain(domain: string, deploymentId: string): Promise<ApiResponse>;
114
+ verifyDomain(domain: string): Promise<ApiResponse>;
115
+ deleteDomain(domainId: string): Promise<ApiResponse>;
116
+ createBucket(name: string, provider?: string): Promise<ApiResponse>;
117
+ listBuckets(): Promise<ApiResponse>;
118
+ getBucket(bucketId: string): Promise<ApiResponse>;
119
+ getBucketByName(name: string): Promise<ApiResponse>;
120
+ getBucketCredentials(bucketId: string): Promise<ApiResponse>;
121
+ deleteBucket(bucketId: string): Promise<ApiResponse>;
122
+ listServers(): Promise<ApiResponse>;
123
+ getServer(serverId: string): Promise<ApiResponse>;
124
+ createServer(plan: string, region: string, projectId?: string): Promise<ApiResponse>;
125
+ powerOnServer(serverId: string): Promise<ApiResponse>;
126
+ powerOffServer(serverId: string): Promise<ApiResponse>;
127
+ deleteServer(serverId: string): Promise<ApiResponse>;
128
+ listSshKeys(): Promise<ApiResponse>;
129
+ createSshKey(name: string, publicKey: string): Promise<ApiResponse>;
130
+ deleteSshKey(keyId: string): Promise<ApiResponse>;
131
+ listOrganizations(): Promise<ApiResponse>;
132
+ getOrganization(orgId: string): Promise<ApiResponse>;
133
+ getOrganizationMembers(orgId: string): Promise<ApiResponse>;
134
+ getOrganizationProjects(orgId: string): Promise<ApiResponse>;
135
+ getBillingStatus(): Promise<ApiResponse>;
136
+ listTiers(): Promise<ApiResponse>;
137
+ getUsage(): Promise<ApiResponse>;
138
+ createCheckout(tier: string): Promise<ApiResponse>;
139
+ createPortal(): Promise<ApiResponse>;
140
+ listAddOns(): Promise<ApiResponse>;
141
+ createAddOn(name: string, deploymentId?: string): Promise<ApiResponse>;
142
+ deleteAddOn(addOnId: string): Promise<ApiResponse>;
143
+ getCertificate(certId: string): Promise<ApiResponse>;
144
+ downloadCertificate(certId: string): Promise<ApiResponse>;
145
+ createClientCert(): Promise<ApiResponse>;
146
+ revokeCertificate(certId: string): Promise<ApiResponse>;
147
+ createNetworkAuthKey(): Promise<ApiResponse>;
148
+ }
149
+ export {};