@rebasepro/mcp-server 0.0.1-canary.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.
Files changed (64) hide show
  1. package/LICENSE +6 -0
  2. package/README.md +69 -0
  3. package/dist/api-client.d.ts +35 -0
  4. package/dist/api-client.d.ts.map +1 -0
  5. package/dist/api-client.js +118 -0
  6. package/dist/api-client.js.map +1 -0
  7. package/dist/auth.d.ts +16 -0
  8. package/dist/auth.d.ts.map +1 -0
  9. package/dist/auth.js +53 -0
  10. package/dist/auth.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +66 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +3 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/resources/project.d.ts +7 -0
  20. package/dist/resources/project.d.ts.map +1 -0
  21. package/dist/resources/project.js +57 -0
  22. package/dist/resources/project.js.map +1 -0
  23. package/dist/server.d.ts +6 -0
  24. package/dist/server.d.ts.map +1 -0
  25. package/dist/server.js +34 -0
  26. package/dist/server.js.map +1 -0
  27. package/dist/tools/auth.d.ts +6 -0
  28. package/dist/tools/auth.d.ts.map +1 -0
  29. package/dist/tools/auth.js +89 -0
  30. package/dist/tools/auth.js.map +1 -0
  31. package/dist/tools/collections.d.ts +7 -0
  32. package/dist/tools/collections.d.ts.map +1 -0
  33. package/dist/tools/collections.js +42 -0
  34. package/dist/tools/collections.js.map +1 -0
  35. package/dist/tools/documents.d.ts +8 -0
  36. package/dist/tools/documents.d.ts.map +1 -0
  37. package/dist/tools/documents.js +178 -0
  38. package/dist/tools/documents.js.map +1 -0
  39. package/dist/tools/export.d.ts +7 -0
  40. package/dist/tools/export.d.ts.map +1 -0
  41. package/dist/tools/export.js +44 -0
  42. package/dist/tools/export.js.map +1 -0
  43. package/dist/tools/projects.d.ts +7 -0
  44. package/dist/tools/projects.d.ts.map +1 -0
  45. package/dist/tools/projects.js +42 -0
  46. package/dist/tools/projects.js.map +1 -0
  47. package/dist/tools/users.d.ts +7 -0
  48. package/dist/tools/users.d.ts.map +1 -0
  49. package/dist/tools/users.js +74 -0
  50. package/dist/tools/users.js.map +1 -0
  51. package/package.json +48 -0
  52. package/src/api-client.ts +146 -0
  53. package/src/auth.ts +75 -0
  54. package/src/cli.ts +70 -0
  55. package/src/index.ts +2 -0
  56. package/src/resources/project.ts +68 -0
  57. package/src/server.ts +42 -0
  58. package/src/tools/auth.ts +110 -0
  59. package/src/tools/collections.ts +52 -0
  60. package/src/tools/documents.ts +210 -0
  61. package/src/tools/export.ts +51 -0
  62. package/src/tools/projects.ts +52 -0
  63. package/src/tools/users.ts +92 -0
  64. package/tsconfig.json +22 -0
package/LICENSE ADDED
@@ -0,0 +1,6 @@
1
+ Source code in this repository is variously licensed under the Business Source
2
+ License 1.1 (BSL), Apache version 2.0 and the MIT license. A copy of each
3
+ license can be found in each one of the packages under the folder packages
4
+ under a file called License. Source code in a given file is licensed under the
5
+ BSL and the copyright belongs to Rebase Authors unless otherwise noted at the
6
+ beginning of the file.
package/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # @rebasepro/mcp-server
2
+
3
+ MCP server for [Rebase Cloud](https://rebase.pro). Lets AI assistants manage your CMS — browse data, create/update/delete documents, manage users, and generate collection schemas with AI.
4
+
5
+ ## Setup
6
+
7
+ ```bash
8
+ cd packages/mcp_server && npm install && npm run build
9
+ ```
10
+
11
+ ## Claude Desktop
12
+
13
+ Add to `claude_desktop_config.json`:
14
+
15
+ ```json
16
+ {
17
+ "mcpServers": {
18
+ "rebase": {
19
+ "command": "node",
20
+ "args": ["/path/to/packages/mcp_server/dist/cli.js"]
21
+ }
22
+ }
23
+ }
24
+ ```
25
+
26
+ Use `rebase_login` to sign in when prompted. Tokens shared with Rebase CLI (`~/.rebase/tokens.json`).
27
+
28
+ ## Tools
29
+
30
+ ### Auth
31
+ | Tool | Description |
32
+ |------|-------------|
33
+ | `rebase_login` | Sign in via browser (Google OAuth) |
34
+ | `rebase_logout` | Sign out |
35
+ | `rebase_get_current_user` | Show current user |
36
+
37
+ ### Projects & Users
38
+ | Tool | Description |
39
+ |------|-------------|
40
+ | `list_projects` | List Rebase Cloud projects |
41
+ | `get_root_collections` | List Firestore root collections |
42
+ | `list_users` | List project users and roles |
43
+ | `add_user` | Invite a user |
44
+ | `update_user_roles` | Change user roles |
45
+ | `remove_user` | Remove a user |
46
+
47
+ ### Documents (Firestore CRUD)
48
+ | Tool | Description |
49
+ |------|-------------|
50
+ | `list_documents` | Query documents (filters, ordering, pagination) |
51
+ | `get_document` | Get a document by path |
52
+ | `create_document` | Create a new document |
53
+ | `update_document` | Partial update of a document |
54
+ | `delete_document` | Delete a document |
55
+ | `count_documents` | Count documents in a collection |
56
+
57
+ ### AI & Export
58
+ | Tool | Description |
59
+ |------|-------------|
60
+ | `generate_collection` | AI-generate a collection schema |
61
+ | `modify_collection` | AI-modify an existing schema |
62
+ | `export_collection` | Export collection data as JSON |
63
+
64
+ ## Resources
65
+
66
+ | URI | Description |
67
+ |-----|-------------|
68
+ | `rebase://projects/{id}/collections` | Project's Firestore collections |
69
+ | `rebase://projects/{id}/users` | Project users |
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Typed HTTP client for the Rebase Cloud backend REST API.
3
+ * Uses the same tokens as the Rebase CLI (from ~/.rebase/tokens.json).
4
+ */
5
+ export declare class RebaseApiClient {
6
+ private client;
7
+ constructor();
8
+ private authHeaders;
9
+ private request;
10
+ listProjects(): Promise<any>;
11
+ getRootCollections(projectId: string): Promise<any>;
12
+ listUsers(projectId: string): Promise<any>;
13
+ createUser(projectId: string, email: string, roles: string[]): Promise<any>;
14
+ updateUser(projectId: string, userId: string, roles: string[]): Promise<any>;
15
+ deleteUser(projectId: string, userId: string): Promise<any>;
16
+ generateCollection(prompt: string, existingCollections?: any[], existingCollection?: any): Promise<any>;
17
+ listDocuments(projectId: string, body: {
18
+ path: string;
19
+ limit?: number;
20
+ orderBy?: string;
21
+ orderDirection?: string;
22
+ filters?: Array<{
23
+ field: string;
24
+ op: string;
25
+ value: any;
26
+ }>;
27
+ databaseId?: string;
28
+ }): Promise<any>;
29
+ getDocument(projectId: string, path: string, documentId: string, databaseId?: string): Promise<any>;
30
+ createDocument(projectId: string, path: string, data: Record<string, any>, documentId?: string, databaseId?: string): Promise<any>;
31
+ updateDocument(projectId: string, path: string, documentId: string, data: Record<string, any>, databaseId?: string): Promise<any>;
32
+ deleteDocument(projectId: string, path: string, documentId: string, databaseId?: string): Promise<any>;
33
+ countDocuments(projectId: string, path: string, databaseId?: string): Promise<any>;
34
+ }
35
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,qBAAa,eAAe;IACxB,OAAO,CAAC,MAAM,CAAgB;;YAUhB,WAAW;YAWX,OAAO;IAWf,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC;IAI5B,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IASnD,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAI1C,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAQ3E,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAQ5E,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAM3D,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAE,GAAG,EAAO,EAAE,kBAAkB,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAU3G,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE;QACzC,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,GAAG,CAAA;SAAE,CAAC,CAAC;QAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,GAAG,CAAC;IAQV,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAQnG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAQlI,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAQjI,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAQtG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAO3F"}
@@ -0,0 +1,118 @@
1
+ import axios from "axios";
2
+ import { getValidTokens } from "./auth.js";
3
+ const API_URL = "https://api.rebase.pro";
4
+ /**
5
+ * Typed HTTP client for the Rebase Cloud backend REST API.
6
+ * Uses the same tokens as the Rebase CLI (from ~/.rebase/tokens.json).
7
+ */
8
+ export class RebaseApiClient {
9
+ client;
10
+ constructor() {
11
+ this.client = axios.create({
12
+ baseURL: API_URL,
13
+ timeout: 60_000,
14
+ headers: { "Content-Type": "application/json" },
15
+ });
16
+ }
17
+ async authHeaders() {
18
+ const tokens = await getValidTokens();
19
+ if (!tokens) {
20
+ throw new Error("Not logged in. Use the rebase_login tool first.");
21
+ }
22
+ return {
23
+ Authorization: `Bearer ${tokens.id_token}`,
24
+ "x-admin-authorization": `Bearer ${tokens.access_token}`,
25
+ };
26
+ }
27
+ async request(config) {
28
+ const headers = await this.authHeaders();
29
+ const response = await this.client.request({
30
+ ...config,
31
+ headers: { ...config.headers, ...headers },
32
+ });
33
+ return response.data;
34
+ }
35
+ // ─── Projects ──────────────────────────────────────────
36
+ async listProjects() {
37
+ return this.request({ method: "GET", url: "/projects" });
38
+ }
39
+ async getRootCollections(projectId) {
40
+ return this.request({
41
+ method: "GET",
42
+ url: `/projects/${projectId}/firestore_root_collections`,
43
+ });
44
+ }
45
+ // ─── Users ─────────────────────────────────────────────
46
+ async listUsers(projectId) {
47
+ return this.request({ method: "GET", url: `/projects/${projectId}/users` });
48
+ }
49
+ async createUser(projectId, email, roles) {
50
+ return this.request({
51
+ method: "POST",
52
+ url: `/projects/${projectId}/users`,
53
+ data: { email, roles },
54
+ });
55
+ }
56
+ async updateUser(projectId, userId, roles) {
57
+ return this.request({
58
+ method: "PATCH",
59
+ url: `/projects/${projectId}/users/${userId}`,
60
+ data: { roles },
61
+ });
62
+ }
63
+ async deleteUser(projectId, userId) {
64
+ return this.request({ method: "DELETE", url: `/projects/${projectId}/users/${userId}` });
65
+ }
66
+ // ─── Collections ───────────────────────────────────────
67
+ async generateCollection(prompt, existingCollections = [], existingCollection) {
68
+ return this.request({
69
+ method: "POST",
70
+ url: "/collections/generate",
71
+ data: { prompt, existingCollections, existingCollection },
72
+ });
73
+ }
74
+ // ─── Documents (Firestore CRUD via backend) ─────────────
75
+ async listDocuments(projectId, body) {
76
+ return this.request({
77
+ method: "POST",
78
+ url: `/projects/${projectId}/documents/list`,
79
+ data: body,
80
+ });
81
+ }
82
+ async getDocument(projectId, path, documentId, databaseId) {
83
+ return this.request({
84
+ method: "POST",
85
+ url: `/projects/${projectId}/documents/get`,
86
+ data: { path, documentId, databaseId },
87
+ });
88
+ }
89
+ async createDocument(projectId, path, data, documentId, databaseId) {
90
+ return this.request({
91
+ method: "POST",
92
+ url: `/projects/${projectId}/documents/create`,
93
+ data: { path, data, documentId, databaseId },
94
+ });
95
+ }
96
+ async updateDocument(projectId, path, documentId, data, databaseId) {
97
+ return this.request({
98
+ method: "POST",
99
+ url: `/projects/${projectId}/documents/update`,
100
+ data: { path, documentId, data, databaseId },
101
+ });
102
+ }
103
+ async deleteDocument(projectId, path, documentId, databaseId) {
104
+ return this.request({
105
+ method: "POST",
106
+ url: `/projects/${projectId}/documents/delete`,
107
+ data: { path, documentId, databaseId },
108
+ });
109
+ }
110
+ async countDocuments(projectId, path, databaseId) {
111
+ return this.request({
112
+ method: "POST",
113
+ url: `/projects/${projectId}/documents/count`,
114
+ data: { path, databaseId },
115
+ });
116
+ }
117
+ }
118
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
package/dist/auth.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ export interface StoredTokens {
2
+ access_token: string;
3
+ refresh_token: string;
4
+ id_token: string;
5
+ expiry_date: number;
6
+ scope: string;
7
+ token_type: string;
8
+ env?: string;
9
+ }
10
+ export declare function getStoredTokens(): Promise<StoredTokens | null>;
11
+ export declare function getValidTokens(): Promise<StoredTokens | null>;
12
+ export declare function getCurrentUserEmail(): string | null;
13
+ export declare function isLoggedIn(): boolean;
14
+ export declare function loginFlow(): Promise<void>;
15
+ export declare function logoutFlow(): Promise<void>;
16
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,YAAY;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAGpE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAMnE;AAID,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAgBnD;AAED,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAID,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAEhD"}
package/dist/auth.js ADDED
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Authentication module for the Rebase MCP server.
3
+ *
4
+ * Delegates to the CLI package (@rebasepro/cli) — same OAuth flow,
5
+ * same token storage at ~/.rebase/tokens.json.
6
+ */
7
+ import { login, logout, getTokens, refreshCredentials, parseJwt, } from "@rebasepro/cli";
8
+ const ENV = "prod";
9
+ const DEBUG = false;
10
+ // ─── Token access ──────────────────────────────────────────
11
+ export async function getStoredTokens() {
12
+ const tokens = await getTokens(ENV, DEBUG);
13
+ return tokens;
14
+ }
15
+ export async function getValidTokens() {
16
+ const tokens = await getStoredTokens();
17
+ if (!tokens)
18
+ return null;
19
+ const refreshed = await refreshCredentials(ENV, tokens);
20
+ return refreshed;
21
+ }
22
+ // ─── Convenience helpers ───────────────────────────────────
23
+ export function getCurrentUserEmail() {
24
+ // getTokens is async, but for a quick sync check we read the file directly.
25
+ // The CLI stores tokens at ~/.rebase/tokens.json.
26
+ try {
27
+ const fs = require("fs");
28
+ const path = require("path");
29
+ const os = require("os");
30
+ const filePath = path.join(os.homedir(), ".rebase", "tokens.json");
31
+ if (!fs.existsSync(filePath))
32
+ return null;
33
+ const tokens = JSON.parse(fs.readFileSync(filePath, "utf-8"));
34
+ if (!tokens?.id_token)
35
+ return null;
36
+ const payload = parseJwt(tokens.id_token);
37
+ return payload["email"] ?? null;
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ export function isLoggedIn() {
44
+ return getCurrentUserEmail() !== null;
45
+ }
46
+ // ─── Login / Logout ────────────────────────────────────────
47
+ export async function loginFlow() {
48
+ await login(ENV, DEBUG);
49
+ }
50
+ export async function logoutFlow() {
51
+ await logout(ENV, DEBUG);
52
+ }
53
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACH,KAAK,EACL,MAAM,EACN,SAAS,EACT,kBAAkB,EAClB,QAAQ,GACX,MAAM,gBAAgB,CAAC;AAExB,MAAM,GAAG,GAAG,MAAe,CAAC;AAC5B,MAAM,KAAK,GAAG,KAAK,CAAC;AAYpB,8DAA8D;AAE9D,MAAM,CAAC,KAAK,UAAU,eAAe;IACjC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3C,OAAO,MAA6B,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAChC,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxD,OAAO,SAAgC,CAAC;AAC5C,CAAC;AAED,8DAA8D;AAE9D,MAAM,UAAU,mBAAmB;IAC/B,4EAA4E;IAC5E,kDAAkD;IAClD,IAAI,CAAC;QACD,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;QACnE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,EAAE,QAAQ;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAQ,OAAe,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU;IACtB,OAAO,mBAAmB,EAAE,KAAK,IAAI,CAAC;AAC1C,CAAC;AAED,8DAA8D;AAE9D,MAAM,CAAC,KAAK,UAAU,SAAS;IAC3B,MAAM,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC5B,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { createRebaseMcpServer } from "./server.js";
4
+ import { getCurrentUserEmail } from "./auth.js";
5
+ /**
6
+ * Rebase MCP Server CLI
7
+ *
8
+ * Usage:
9
+ * rebase-mcp
10
+ *
11
+ * Auth is handled interactively via the rebase_login tool (browser OAuth),
12
+ * same flow as `rebase login` in the CLI. Tokens are stored at ~/.rebase/tokens.json.
13
+ *
14
+ * Claude Desktop config (claude_desktop_config.json):
15
+ * {
16
+ * "mcpServers": {
17
+ * "rebase": {
18
+ * "command": "node",
19
+ * "args": ["/path/to/packages/mcp_server/dist/cli.js"]
20
+ * }
21
+ * }
22
+ * }
23
+ */
24
+ async function main() {
25
+ const args = process.argv.slice(2);
26
+ if (args.includes("--help") || args.includes("-h")) {
27
+ console.log(`
28
+ Rebase MCP Server — Model Context Protocol server for Rebase Cloud
29
+
30
+ Usage:
31
+ rebase-mcp
32
+
33
+ No configuration needed. Authentication is handled interactively
34
+ via the rebase_login tool, which opens a browser for Google OAuth.
35
+ Tokens are stored at ~/.rebase/tokens.json (shared with the Rebase CLI).
36
+
37
+ Claude Desktop config (claude_desktop_config.json):
38
+ {
39
+ "mcpServers": {
40
+ "rebase": {
41
+ "command": "npx",
42
+ "args": ["@rebasepro/mcp-server"]
43
+ }
44
+ }
45
+ }
46
+ `);
47
+ process.exit(0);
48
+ }
49
+ const server = createRebaseMcpServer();
50
+ const transport = new StdioServerTransport();
51
+ await server.connect(transport);
52
+ // Log to stderr (stdout is reserved for MCP protocol)
53
+ const email = getCurrentUserEmail();
54
+ console.error("Rebase MCP server started");
55
+ if (email) {
56
+ console.error(` Logged in as: ${email}`);
57
+ }
58
+ else {
59
+ console.error(" Not logged in — use the rebase_login tool to sign in");
60
+ }
61
+ }
62
+ main().catch((error) => {
63
+ console.error("Fatal error:", error);
64
+ process.exit(1);
65
+ });
66
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD;;;;;;;;;;;;;;;;;;GAkBG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;CAmBf,CAAC,CAAC;QACC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,sDAAsD;IACtD,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IACpC,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC3C,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createRebaseMcpServer } from "./server.js";
2
+ export { RebaseApiClient } from "./api-client.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { createRebaseMcpServer } from "./server.js";
2
+ export { RebaseApiClient } from "./api-client.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { RebaseApiClient } from "../api-client.js";
3
+ /**
4
+ * Register MCP resources — read-only contextual data about Rebase projects.
5
+ */
6
+ export declare function registerProjectResources(server: McpServer, api: RebaseApiClient): void;
7
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/resources/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QA6D/E"}
@@ -0,0 +1,57 @@
1
+ import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Register MCP resources — read-only contextual data about Rebase projects.
4
+ */
5
+ export function registerProjectResources(server, api) {
6
+ server.registerResource("project-collections", new ResourceTemplate("rebase://projects/{projectId}/collections", { list: undefined }), {
7
+ description: "Firestore root-level collections for a Rebase project",
8
+ mimeType: "application/json",
9
+ }, async (uri, variables) => {
10
+ const projectId = variables.projectId;
11
+ try {
12
+ const collections = await api.getRootCollections(projectId);
13
+ return {
14
+ contents: [{
15
+ uri: uri.href,
16
+ mimeType: "application/json",
17
+ text: JSON.stringify(collections, null, 2),
18
+ }],
19
+ };
20
+ }
21
+ catch (error) {
22
+ return {
23
+ contents: [{
24
+ uri: uri.href,
25
+ mimeType: "application/json",
26
+ text: JSON.stringify({ error: error.message }),
27
+ }],
28
+ };
29
+ }
30
+ });
31
+ server.registerResource("project-users", new ResourceTemplate("rebase://projects/{projectId}/users", { list: undefined }), {
32
+ description: "Users with access to a Rebase project",
33
+ mimeType: "application/json",
34
+ }, async (uri, variables) => {
35
+ const projectId = variables.projectId;
36
+ try {
37
+ const users = await api.listUsers(projectId);
38
+ return {
39
+ contents: [{
40
+ uri: uri.href,
41
+ mimeType: "application/json",
42
+ text: JSON.stringify(users, null, 2),
43
+ }],
44
+ };
45
+ }
46
+ catch (error) {
47
+ return {
48
+ contents: [{
49
+ uri: uri.href,
50
+ mimeType: "application/json",
51
+ text: JSON.stringify({ error: error.message }),
52
+ }],
53
+ };
54
+ }
55
+ });
56
+ }
57
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/resources/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAGtF;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,GAAoB;IAE5E,MAAM,CAAC,gBAAgB,CACnB,qBAAqB,EACrB,IAAI,gBAAgB,CAAC,2CAA2C,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EACtF;QACI,WAAW,EAAE,uDAAuD;QACpE,QAAQ,EAAE,kBAAkB;KAC/B,EACD,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QACrB,MAAM,SAAS,GAAG,SAAS,CAAC,SAAmB,CAAC;QAChD,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAC5D,OAAO;gBACH,QAAQ,EAAE,CAAC;wBACP,GAAG,EAAE,GAAG,CAAC,IAAI;wBACb,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC7C,CAAC;aACL,CAAC;QACN,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,OAAO;gBACH,QAAQ,EAAE,CAAC;wBACP,GAAG,EAAE,GAAG,CAAC,IAAI;wBACb,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;qBACjD,CAAC;aACL,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,MAAM,CAAC,gBAAgB,CACnB,eAAe,EACf,IAAI,gBAAgB,CAAC,qCAAqC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAChF;QACI,WAAW,EAAE,uCAAuC;QACpD,QAAQ,EAAE,kBAAkB;KAC/B,EACD,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QACrB,MAAM,SAAS,GAAG,SAAS,CAAC,SAAmB,CAAC;QAChD,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC7C,OAAO;gBACH,QAAQ,EAAE,CAAC;wBACP,GAAG,EAAE,GAAG,CAAC,IAAI;wBACb,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;qBACvC,CAAC;aACL,CAAC;QACN,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,OAAO;gBACH,QAAQ,EAAE,CAAC;wBACP,GAAG,EAAE,GAAG,CAAC,IAAI;wBACb,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;qBACjD,CAAC;aACL,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;AACN,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Create and configure the Rebase MCP server with all tools and resources.
4
+ */
5
+ export declare function createRebaseMcpServer(): McpServer;
6
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUpE;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,SAAS,CA4BjD"}
package/dist/server.js ADDED
@@ -0,0 +1,34 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { RebaseApiClient } from "./api-client.js";
3
+ import { registerAuthTools } from "./tools/auth.js";
4
+ import { registerProjectTools } from "./tools/projects.js";
5
+ import { registerUserTools } from "./tools/users.js";
6
+ import { registerCollectionTools } from "./tools/collections.js";
7
+ import { registerDocumentTools } from "./tools/documents.js";
8
+ import { registerExportTools } from "./tools/export.js";
9
+ import { registerProjectResources } from "./resources/project.js";
10
+ /**
11
+ * Create and configure the Rebase MCP server with all tools and resources.
12
+ */
13
+ export function createRebaseMcpServer() {
14
+ const server = new McpServer({
15
+ name: "Rebase Cloud",
16
+ version: "0.1.0",
17
+ });
18
+ const api = new RebaseApiClient();
19
+ // Auth tools (login/logout)
20
+ registerAuthTools(server);
21
+ // Project & user management (via backend API)
22
+ registerProjectTools(server, api);
23
+ registerUserTools(server, api);
24
+ // Collection schema AI tools (via backend API)
25
+ registerCollectionTools(server, api);
26
+ // Firestore document CRUD (via backend API proxy)
27
+ registerDocumentTools(server, api);
28
+ // Data export (via backend API)
29
+ registerExportTools(server, api);
30
+ // Resources
31
+ registerProjectResources(server, api);
32
+ return server;
33
+ }
34
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAElE;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACjC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QACzB,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,OAAO;KACnB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,IAAI,eAAe,EAAE,CAAC;IAElC,4BAA4B;IAC5B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE1B,8CAA8C;IAC9C,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE/B,+CAA+C;IAC/C,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAErC,kDAAkD;IAClD,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEnC,gCAAgC;IAChC,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEjC,YAAY;IACZ,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEtC,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Register login/logout tools — same flow as `rebase login` CLI.
4
+ */
5
+ export declare function registerAuthTools(server: McpServer): void;
6
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQpE;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,QAkGlD"}
@@ -0,0 +1,89 @@
1
+ import { isLoggedIn, getCurrentUserEmail, loginFlow, logoutFlow, } from "../auth.js";
2
+ /**
3
+ * Register login/logout tools — same flow as `rebase login` CLI.
4
+ */
5
+ export function registerAuthTools(server) {
6
+ server.registerTool("rebase_login", {
7
+ description: "Sign in to Rebase Cloud. Opens a browser window for Google OAuth authentication. Required before using any other tools.",
8
+ }, async () => {
9
+ const existingEmail = getCurrentUserEmail();
10
+ if (existingEmail) {
11
+ return {
12
+ content: [{
13
+ type: "text",
14
+ text: `Already logged in as ${existingEmail}. Use rebase_logout to sign out first.`,
15
+ }],
16
+ };
17
+ }
18
+ try {
19
+ await loginFlow();
20
+ const email = getCurrentUserEmail();
21
+ return {
22
+ content: [{
23
+ type: "text",
24
+ text: `Successfully logged in as ${email ?? "unknown"}`,
25
+ }],
26
+ };
27
+ }
28
+ catch (error) {
29
+ return {
30
+ content: [{
31
+ type: "text",
32
+ text: `Login failed: ${error.message}`,
33
+ }],
34
+ isError: true,
35
+ };
36
+ }
37
+ });
38
+ server.registerTool("rebase_logout", {
39
+ description: "Sign out of Rebase Cloud. Revokes the current session.",
40
+ }, async () => {
41
+ if (!isLoggedIn()) {
42
+ return {
43
+ content: [{
44
+ type: "text",
45
+ text: "Not currently logged in.",
46
+ }],
47
+ };
48
+ }
49
+ const email = getCurrentUserEmail();
50
+ try {
51
+ await logoutFlow();
52
+ return {
53
+ content: [{
54
+ type: "text",
55
+ text: `Successfully logged out ${email ?? ""}`.trim(),
56
+ }],
57
+ };
58
+ }
59
+ catch (error) {
60
+ return {
61
+ content: [{
62
+ type: "text",
63
+ text: `Logout failed: ${error.message}`,
64
+ }],
65
+ isError: true,
66
+ };
67
+ }
68
+ });
69
+ server.registerTool("rebase_get_current_user", {
70
+ description: "Get the currently authenticated Rebase user",
71
+ }, async () => {
72
+ const email = getCurrentUserEmail();
73
+ if (!email) {
74
+ return {
75
+ content: [{
76
+ type: "text",
77
+ text: "Not logged in. Use rebase_login to sign in.",
78
+ }],
79
+ };
80
+ }
81
+ return {
82
+ content: [{
83
+ type: "text",
84
+ text: `Logged in as: ${email}`,
85
+ }],
86
+ };
87
+ });
88
+ }
89
+ //# sourceMappingURL=auth.js.map