vibevibes-mcp-server 0.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 +96 -0
- package/dist/http-client.d.ts +21 -0
- package/dist/http-client.d.ts.map +1 -0
- package/dist/http-client.js +79 -0
- package/dist/http-client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +818 -0
- package/dist/index.js.map +1 -0
- package/dist/supabase-client.d.ts +121 -0
- package/dist/supabase-client.d.ts.map +1 -0
- package/dist/supabase-client.js +420 -0
- package/dist/supabase-client.js.map +1 -0
- package/package.json +48 -0
package/README.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# @vibevibes/mcp-server
|
|
2
|
+
|
|
3
|
+
MCP server for [vibe vibes](https://github.com/o-one-run/vibe-vibes) — create and manage collaborative multiplayer AI experiences from Claude Code.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @vibevibes/mcp-server
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or use directly with `npx`:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx @vibevibes/mcp-server
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Configure in Claude Code
|
|
18
|
+
|
|
19
|
+
Add to your `.mcp.json`:
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"mcpServers": {
|
|
24
|
+
"vibevibes": {
|
|
25
|
+
"type": "stdio",
|
|
26
|
+
"command": "npx",
|
|
27
|
+
"args": ["-y", "@vibevibes/mcp-server"]
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Environment variables
|
|
34
|
+
|
|
35
|
+
| Variable | Default | Description |
|
|
36
|
+
|----------|---------|-------------|
|
|
37
|
+
| `VIBEVIBES_REALTIME_URL` | Railway production | URL of the realtime server |
|
|
38
|
+
| `VIBEVIBES_WEB_URL` | Railway production | URL of the web app |
|
|
39
|
+
| `GITHUB_TOKEN` | — | GitHub PAT for experience storage |
|
|
40
|
+
| `GITHUB_OWNER` | derived from token | GitHub org/user for repos |
|
|
41
|
+
|
|
42
|
+
For local development:
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"mcpServers": {
|
|
47
|
+
"vibevibes": {
|
|
48
|
+
"type": "stdio",
|
|
49
|
+
"command": "npx",
|
|
50
|
+
"args": ["-y", "@vibevibes/mcp-server"],
|
|
51
|
+
"env": {
|
|
52
|
+
"VIBEVIBES_REALTIME_URL": "http://localhost:4000",
|
|
53
|
+
"VIBEVIBES_WEB_URL": "http://localhost:3000"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Tools
|
|
61
|
+
|
|
62
|
+
| Tool | Description |
|
|
63
|
+
|------|-------------|
|
|
64
|
+
| `vibevibes_health` | Check realtime server health |
|
|
65
|
+
| `vibevibes_diagnostics` | Detailed server diagnostics and event log |
|
|
66
|
+
| `vibevibes_list_experiences` | List all saved experiences |
|
|
67
|
+
| `vibevibes_get_experience_source` | Get full source code of an experience |
|
|
68
|
+
| `vibevibes_get_experience_tools` | List tools exported by an experience |
|
|
69
|
+
| `vibevibes_save_experience` | Create/update a single-file experience |
|
|
70
|
+
| `vibevibes_save_experience_files` | Create/update a multi-file experience |
|
|
71
|
+
| `vibevibes_get_experience_files` | Get all files for a multi-file experience |
|
|
72
|
+
| `vibevibes_edit_experience_file` | Update/delete specific files in an experience |
|
|
73
|
+
| `vibevibes_create_room` | Create a new room for an experience |
|
|
74
|
+
| `vibevibes_join_room` | Join a room as a participant |
|
|
75
|
+
| `vibevibes_watch_room` | Long-poll for activity in a joined room |
|
|
76
|
+
| `vibevibes_leave_room` | Leave a room |
|
|
77
|
+
| `vibevibes_get_room_state` | Inspect shared state and participants |
|
|
78
|
+
| `vibevibes_room_screenshot` | Capture a PNG screenshot of a room |
|
|
79
|
+
| `vibevibes_execute_tool` | Execute a tool in a room |
|
|
80
|
+
| `vibevibes_edit_experience` | Edit an experience and hot-reload in a room |
|
|
81
|
+
| `vibevibes_sync_from_github` | Re-sync an experience from GitHub |
|
|
82
|
+
|
|
83
|
+
## How it works
|
|
84
|
+
|
|
85
|
+
The MCP server is a bridge between Claude Code and a running vibe vibes instance. It communicates with the realtime server over HTTP and exposes every operation as an MCP tool. This means Claude Code can:
|
|
86
|
+
|
|
87
|
+
- Create and edit experiences (collaborative multiplayer apps)
|
|
88
|
+
- Create rooms and execute tools inside them
|
|
89
|
+
- Join rooms alongside humans and react to their actions
|
|
90
|
+
- Take screenshots to see the current visual state
|
|
91
|
+
|
|
92
|
+
All state mutations go through the same tool gate that humans use, so the audit log and event system stay consistent.
|
|
93
|
+
|
|
94
|
+
## License
|
|
95
|
+
|
|
96
|
+
MIT
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
declare const REALTIME_URL: string;
|
|
2
|
+
declare const WEB_URL: string;
|
|
3
|
+
export type HttpResult<T = any> = {
|
|
4
|
+
ok: boolean;
|
|
5
|
+
status: number;
|
|
6
|
+
data?: T;
|
|
7
|
+
error?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function realtimeGet<T = any>(path: string, timeoutMs?: number): Promise<HttpResult<T>>;
|
|
10
|
+
export declare function realtimePost<T = any>(path: string, body: any, extraHeaders?: Record<string, string>): Promise<HttpResult<T>>;
|
|
11
|
+
export declare function realtimePatch<T = any>(path: string, body: any, extraHeaders?: Record<string, string>): Promise<HttpResult<T>>;
|
|
12
|
+
export declare function webGet<T = any>(path: string): Promise<HttpResult<T>>;
|
|
13
|
+
export declare function webPost<T = any>(path: string, body: any): Promise<HttpResult<T>>;
|
|
14
|
+
export declare function realtimeGetBinary(path: string): Promise<{
|
|
15
|
+
ok: boolean;
|
|
16
|
+
data?: Buffer;
|
|
17
|
+
contentType?: string;
|
|
18
|
+
error?: string;
|
|
19
|
+
}>;
|
|
20
|
+
export { REALTIME_URL, WEB_URL };
|
|
21
|
+
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,YAAY,QAA8F,CAAC;AACjH,QAAA,MAAM,OAAO,QAAyF,CAAC;AAEvG,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,GAAG,IAAI;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAsDF,wBAAgB,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,0BAEpE;AAED,wBAAgB,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,0BAEnG;AAED,wBAAgB,aAAa,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,0BAEpG;AAID,wBAAgB,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,0BAE3C;AAED,wBAAgB,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,0BAEvD;AAID,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBnI;AAED,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
const REALTIME_URL = process.env.VIBEVIBES_REALTIME_URL || "https://vibevibesrealtime-production.up.railway.app";
|
|
2
|
+
const WEB_URL = process.env.VIBEVIBES_WEB_URL || "https://vibevibesweb-production-e644.up.railway.app";
|
|
3
|
+
async function request(baseUrl, path, method, body, extraHeaders, timeoutMs) {
|
|
4
|
+
const url = `${baseUrl}${path}`;
|
|
5
|
+
try {
|
|
6
|
+
const headers = {
|
|
7
|
+
...(body ? { "Content-Type": "application/json" } : {}),
|
|
8
|
+
...(extraHeaders || {}),
|
|
9
|
+
};
|
|
10
|
+
const fetchOptions = {
|
|
11
|
+
method,
|
|
12
|
+
headers: Object.keys(headers).length > 0 ? headers : undefined,
|
|
13
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
14
|
+
};
|
|
15
|
+
if (timeoutMs) {
|
|
16
|
+
fetchOptions.signal = AbortSignal.timeout(timeoutMs);
|
|
17
|
+
}
|
|
18
|
+
const res = await fetch(url, fetchOptions);
|
|
19
|
+
const text = await res.text();
|
|
20
|
+
let data;
|
|
21
|
+
try {
|
|
22
|
+
data = JSON.parse(text);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
data = text;
|
|
26
|
+
}
|
|
27
|
+
if (!res.ok) {
|
|
28
|
+
return {
|
|
29
|
+
ok: false,
|
|
30
|
+
status: res.status,
|
|
31
|
+
error: data?.error || data?.message || `HTTP ${res.status}: ${text.slice(0, 200)}`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return { ok: true, status: res.status, data };
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return {
|
|
38
|
+
ok: false,
|
|
39
|
+
status: 0,
|
|
40
|
+
error: `Connection failed: ${err.message}. Is the server running at ${baseUrl}?`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function realtimeGet(path, timeoutMs) {
|
|
45
|
+
return request(REALTIME_URL, path, "GET", undefined, undefined, timeoutMs);
|
|
46
|
+
}
|
|
47
|
+
export function realtimePost(path, body, extraHeaders) {
|
|
48
|
+
return request(REALTIME_URL, path, "POST", body, extraHeaders);
|
|
49
|
+
}
|
|
50
|
+
export function realtimePatch(path, body, extraHeaders) {
|
|
51
|
+
return request(REALTIME_URL, path, "PATCH", body, extraHeaders);
|
|
52
|
+
}
|
|
53
|
+
export function webGet(path) {
|
|
54
|
+
return request(WEB_URL, path, "GET");
|
|
55
|
+
}
|
|
56
|
+
export function webPost(path, body) {
|
|
57
|
+
return request(WEB_URL, path, "POST", body);
|
|
58
|
+
}
|
|
59
|
+
export async function realtimeGetBinary(path) {
|
|
60
|
+
const url = `${REALTIME_URL}${path}`;
|
|
61
|
+
try {
|
|
62
|
+
const res = await fetch(url);
|
|
63
|
+
if (!res.ok) {
|
|
64
|
+
const text = await res.text();
|
|
65
|
+
return { ok: false, error: `HTTP ${res.status}: ${text.slice(0, 200)}` };
|
|
66
|
+
}
|
|
67
|
+
const arrayBuffer = await res.arrayBuffer();
|
|
68
|
+
return {
|
|
69
|
+
ok: true,
|
|
70
|
+
data: Buffer.from(arrayBuffer),
|
|
71
|
+
contentType: res.headers.get('content-type') || 'application/octet-stream',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
return { ok: false, error: `Connection failed: ${err.message}` };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export { REALTIME_URL, WEB_URL };
|
|
79
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"AAKA,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,qDAAqD,CAAC;AACjH,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,qDAAqD,CAAC;AASvG,KAAK,UAAU,OAAO,CACpB,OAAe,EACf,IAAY,EACZ,MAAgC,EAChC,IAAU,EACV,YAAqC,EACrC,SAAkB;IAElB,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,OAAO,GAA2B;YACtC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;SACxB,CAAC;QACF,MAAM,YAAY,GAAgB;YAChC,MAAM;YACN,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YAC9D,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC;QACF,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAE3C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,IAAS,CAAC;QACd,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;aACnF,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,sBAAsB,GAAG,CAAC,OAAO,8BAA8B,OAAO,GAAG;SACjF,CAAC;IACJ,CAAC;AACH,CAAC;AAID,MAAM,UAAU,WAAW,CAAU,IAAY,EAAE,SAAkB;IACnE,OAAO,OAAO,CAAI,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,YAAY,CAAU,IAAY,EAAE,IAAS,EAAE,YAAqC;IAClG,OAAO,OAAO,CAAI,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,aAAa,CAAU,IAAY,EAAE,IAAS,EAAE,YAAqC;IACnG,OAAO,OAAO,CAAI,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;AACrE,CAAC;AAID,MAAM,UAAU,MAAM,CAAU,IAAY;IAC1C,OAAO,OAAO,CAAI,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,OAAO,CAAU,IAAY,EAAE,IAAS;IACtD,OAAO,OAAO,CAAI,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC;AAID,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAClD,MAAM,GAAG,GAAG,GAAG,YAAY,GAAG,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;QAC3E,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO;YACL,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;YAC9B,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,0BAA0B;SAC3E,CAAC;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;IACnE,CAAC;AACH,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|