firebase-mcp 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.
Files changed (82) hide show
  1. package/README.md +119 -0
  2. package/dist/access/index.d.ts +23 -0
  3. package/dist/access/index.d.ts.map +1 -0
  4. package/dist/access/index.js +35 -0
  5. package/dist/access/index.js.map +1 -0
  6. package/dist/cli/index.d.ts +3 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +14 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/config/index.d.ts +51 -0
  11. package/dist/config/index.d.ts.map +1 -0
  12. package/dist/config/index.js +56 -0
  13. package/dist/config/index.js.map +1 -0
  14. package/dist/firebase/index.d.ts +21 -0
  15. package/dist/firebase/index.d.ts.map +1 -0
  16. package/dist/firebase/index.js +42 -0
  17. package/dist/firebase/index.js.map +1 -0
  18. package/dist/server/index.d.ts +23 -0
  19. package/dist/server/index.d.ts.map +1 -0
  20. package/dist/server/index.js +60 -0
  21. package/dist/server/index.js.map +1 -0
  22. package/dist/tools/firestore/aggregate_collection.d.ts +34 -0
  23. package/dist/tools/firestore/aggregate_collection.d.ts.map +1 -0
  24. package/dist/tools/firestore/aggregate_collection.js +86 -0
  25. package/dist/tools/firestore/aggregate_collection.js.map +1 -0
  26. package/dist/tools/firestore/count_documents.d.ts +25 -0
  27. package/dist/tools/firestore/count_documents.d.ts.map +1 -0
  28. package/dist/tools/firestore/count_documents.js +54 -0
  29. package/dist/tools/firestore/count_documents.js.map +1 -0
  30. package/dist/tools/firestore/get_collection_schema.d.ts +30 -0
  31. package/dist/tools/firestore/get_collection_schema.d.ts.map +1 -0
  32. package/dist/tools/firestore/get_collection_schema.js +129 -0
  33. package/dist/tools/firestore/get_collection_schema.js.map +1 -0
  34. package/dist/tools/firestore/get_document.d.ts +32 -0
  35. package/dist/tools/firestore/get_document.d.ts.map +1 -0
  36. package/dist/tools/firestore/get_document.js +62 -0
  37. package/dist/tools/firestore/get_document.js.map +1 -0
  38. package/dist/tools/firestore/get_many_documents.d.ts +33 -0
  39. package/dist/tools/firestore/get_many_documents.d.ts.map +1 -0
  40. package/dist/tools/firestore/get_many_documents.js +86 -0
  41. package/dist/tools/firestore/get_many_documents.js.map +1 -0
  42. package/dist/tools/firestore/index.d.ts +12 -0
  43. package/dist/tools/firestore/index.d.ts.map +1 -0
  44. package/dist/tools/firestore/index.js +28 -0
  45. package/dist/tools/firestore/index.js.map +1 -0
  46. package/dist/tools/firestore/list_collections.d.ts +24 -0
  47. package/dist/tools/firestore/list_collections.d.ts.map +1 -0
  48. package/dist/tools/firestore/list_collections.js +61 -0
  49. package/dist/tools/firestore/list_collections.js.map +1 -0
  50. package/dist/tools/firestore/list_documents.d.ts +24 -0
  51. package/dist/tools/firestore/list_documents.d.ts.map +1 -0
  52. package/dist/tools/firestore/list_documents.js +60 -0
  53. package/dist/tools/firestore/list_documents.js.map +1 -0
  54. package/dist/tools/firestore/list_indexes.d.ts +32 -0
  55. package/dist/tools/firestore/list_indexes.d.ts.map +1 -0
  56. package/dist/tools/firestore/list_indexes.js +99 -0
  57. package/dist/tools/firestore/list_indexes.js.map +1 -0
  58. package/dist/tools/firestore/normalize.d.ts +8 -0
  59. package/dist/tools/firestore/normalize.d.ts.map +1 -0
  60. package/dist/tools/firestore/normalize.js +36 -0
  61. package/dist/tools/firestore/normalize.js.map +1 -0
  62. package/dist/tools/firestore/query_collection.d.ts +34 -0
  63. package/dist/tools/firestore/query_collection.d.ts.map +1 -0
  64. package/dist/tools/firestore/query_collection.js +96 -0
  65. package/dist/tools/firestore/query_collection.js.map +1 -0
  66. package/dist/tools/firestore/query_collection_group.d.ts +34 -0
  67. package/dist/tools/firestore/query_collection_group.d.ts.map +1 -0
  68. package/dist/tools/firestore/query_collection_group.js +94 -0
  69. package/dist/tools/firestore/query_collection_group.js.map +1 -0
  70. package/dist/tools/firestore/read_collections.d.ts +44 -0
  71. package/dist/tools/firestore/read_collections.d.ts.map +1 -0
  72. package/dist/tools/firestore/read_collections.js +95 -0
  73. package/dist/tools/firestore/read_collections.js.map +1 -0
  74. package/dist/tools/firestore/types.d.ts +52 -0
  75. package/dist/tools/firestore/types.d.ts.map +1 -0
  76. package/dist/tools/firestore/types.js +75 -0
  77. package/dist/tools/firestore/types.js.map +1 -0
  78. package/dist/tools/index.d.ts +104 -0
  79. package/dist/tools/index.d.ts.map +1 -0
  80. package/dist/tools/index.js +121 -0
  81. package/dist/tools/index.js.map +1 -0
  82. package/package.json +48 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query_collection_group.js","sourceRoot":"","sources":["../../../src/tools/firestore/query_collection_group.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import { Effect } from 'effect';
3
+ import { AccessService } from '../../access';
4
+ import { ConfigService } from '../../config';
5
+ import { FirebaseService } from '../../firebase';
6
+ declare const FirestoreReadError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
7
+ readonly _tag: "FirestoreReadError";
8
+ } & Readonly<A>;
9
+ export declare class FirestoreReadError extends FirestoreReadError_base<{
10
+ readonly message: string;
11
+ readonly cause?: unknown;
12
+ }> {
13
+ }
14
+ export declare const READ_COLLECTION: "read_collection";
15
+ export interface ReadCollectionArgs {
16
+ collection: string;
17
+ limit?: number;
18
+ select?: string[];
19
+ includePhantoms?: boolean;
20
+ startAfter?: string;
21
+ }
22
+ export declare const readCollectionDefinition: Tool;
23
+ export declare const readCollection: (input: ReadCollectionArgs) => Effect.Effect<{
24
+ documents: {
25
+ id: string;
26
+ path: string;
27
+ data: unknown;
28
+ }[];
29
+ phantoms: {
30
+ id: string;
31
+ path: string;
32
+ }[];
33
+ nextPageCursor?: undefined;
34
+ } | {
35
+ documents: {
36
+ id: string;
37
+ path: string;
38
+ data: unknown;
39
+ }[];
40
+ nextPageCursor: string | null;
41
+ phantoms?: undefined;
42
+ }, import("../../access").AccessDeniedError | FirestoreReadError, ConfigService | AccessService | FirebaseService>;
43
+ export {};
44
+ //# sourceMappingURL=read_collections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read_collections.d.ts","sourceRoot":"","sources":["../../../src/tools/firestore/read_collections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAQ,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;;;;AAGjD,qBAAa,kBAAmB,SAAQ,wBAAuC;IAC7E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;CAAG;AAEL,eAAO,MAAM,eAAe,EAAG,iBAA0B,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,wBAAwB,EAAE,IAiCtC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,OAAO,kBAAkB;;;;;;;;;;;;;;;;;;;kHAqEpD,CAAC"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readCollection = exports.readCollectionDefinition = exports.READ_COLLECTION = exports.FirestoreReadError = void 0;
4
+ const effect_1 = require("effect");
5
+ const access_1 = require("../../access");
6
+ const config_1 = require("../../config");
7
+ const firebase_1 = require("../../firebase");
8
+ const types_1 = require("./types");
9
+ class FirestoreReadError extends effect_1.Data.TaggedError('FirestoreReadError') {
10
+ }
11
+ exports.FirestoreReadError = FirestoreReadError;
12
+ exports.READ_COLLECTION = 'read_collection';
13
+ exports.readCollectionDefinition = {
14
+ name: exports.READ_COLLECTION,
15
+ description: 'Read documents from a Firestore collection',
16
+ inputSchema: {
17
+ type: 'object',
18
+ properties: {
19
+ collection: {
20
+ type: 'string',
21
+ description: "Collection path, e.g. 'users' or 'users/123/posts'",
22
+ },
23
+ limit: {
24
+ type: 'number',
25
+ description: 'Max number of documents to return',
26
+ },
27
+ select: {
28
+ type: 'array',
29
+ items: { type: 'string' },
30
+ description: 'Optional list of field paths to return. Omit to return all fields.',
31
+ },
32
+ includePhantoms: {
33
+ type: 'boolean',
34
+ description: 'If true and the collection returns no documents, automatically falls back to listDocuments() to surface phantom documents (documents with no fields that exist only as parents of subcollections).',
35
+ },
36
+ startAfter: {
37
+ type: 'string',
38
+ description: 'Document ID to start after for pagination. Use the nextPageCursor value returned from a previous call.',
39
+ },
40
+ },
41
+ required: ['collection'],
42
+ },
43
+ };
44
+ const readCollection = (input) => effect_1.Effect.gen(function* () {
45
+ const access = yield* access_1.AccessService;
46
+ yield* access.check(input.collection);
47
+ const { config } = yield* config_1.ConfigService;
48
+ const { firestore } = yield* firebase_1.FirebaseService;
49
+ const maxLimit = config.firestore.maxCollectionReadSize;
50
+ const limit = Math.min(input.limit ?? maxLimit, maxLimit);
51
+ const cursorSnap = input.startAfter
52
+ ? yield* effect_1.Effect.tryPromise({
53
+ try: () => firestore()
54
+ .collection(input.collection)
55
+ .doc(input.startAfter)
56
+ .get(),
57
+ catch: (cause) => new FirestoreReadError({
58
+ message: `Failed to fetch cursor document: ${input.startAfter}`,
59
+ cause,
60
+ }),
61
+ })
62
+ : null;
63
+ const snapshot = yield* effect_1.Effect.tryPromise({
64
+ try: () => {
65
+ let query = firestore().collection(input.collection);
66
+ if (input.select?.length) {
67
+ query = query.select(...input.select);
68
+ }
69
+ if (cursorSnap) {
70
+ query = query.startAfter(cursorSnap);
71
+ }
72
+ return query.limit(limit).get();
73
+ },
74
+ catch: (cause) => new FirestoreReadError({
75
+ message: `Failed to read collection: ${input.collection}`,
76
+ cause,
77
+ }),
78
+ });
79
+ const documents = snapshot.docs.map(types_1.normalizeDocument);
80
+ if (documents.length === 0 && input.includePhantoms) {
81
+ const refs = yield* effect_1.Effect.tryPromise({
82
+ try: () => firestore().collection(input.collection).listDocuments(),
83
+ catch: (cause) => new FirestoreReadError({
84
+ message: `Failed to list phantom documents in: ${input.collection}`,
85
+ cause,
86
+ }),
87
+ });
88
+ const phantoms = refs.map((ref) => ({ id: ref.id, path: ref.path }));
89
+ return { documents, phantoms };
90
+ }
91
+ const nextPageCursor = documents.length === limit ? documents[documents.length - 1].id : null;
92
+ return { documents, nextPageCursor };
93
+ });
94
+ exports.readCollection = readCollection;
95
+ //# sourceMappingURL=read_collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read_collections.js","sourceRoot":"","sources":["../../../src/tools/firestore/read_collections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import admin from 'firebase-admin';
2
+ import { FieldPath, OrderByDirection, WhereFilterOp } from 'firebase-admin/firestore';
3
+ export declare const VALID_OPERATORS: WhereFilterOp[];
4
+ export declare const FILTER_SCHEMA_ITEM: {
5
+ readonly type: "object";
6
+ readonly properties: {
7
+ readonly field: {
8
+ readonly type: "string";
9
+ readonly description: "Field name to filter on";
10
+ };
11
+ readonly operator: {
12
+ readonly type: "string";
13
+ readonly enum: admin.firestore.WhereFilterOp[];
14
+ readonly description: "Comparison operator";
15
+ };
16
+ readonly value: {
17
+ readonly description: "Value to compare against (string, number, boolean, null, or array for in/array-contains-any/not-in)";
18
+ };
19
+ };
20
+ readonly required: readonly ["field", "operator", "value"];
21
+ };
22
+ export declare const ORDER_BY_SCHEMA_ITEM: {
23
+ readonly type: "object";
24
+ readonly properties: {
25
+ readonly field: {
26
+ readonly type: "string";
27
+ readonly description: "Field to order by";
28
+ };
29
+ readonly direction: {
30
+ readonly type: "string";
31
+ readonly enum: readonly ["asc", "desc"];
32
+ readonly description: "Sort direction (default: 'asc')";
33
+ };
34
+ };
35
+ readonly required: readonly ["field"];
36
+ };
37
+ export interface QueryFilter {
38
+ field: string | FieldPath;
39
+ operator: WhereFilterOp;
40
+ value: unknown;
41
+ }
42
+ export interface QueryOrderBy {
43
+ field: string;
44
+ direction?: OrderByDirection;
45
+ }
46
+ export declare const normalizeValue: (value: unknown) => unknown;
47
+ export declare const normalizeDocument: (doc: admin.firestore.QueryDocumentSnapshot | admin.firestore.DocumentSnapshot) => {
48
+ id: string;
49
+ path: string;
50
+ data: unknown;
51
+ };
52
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tools/firestore/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,gBAAgB,CAAC;AACnC,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,aAAa,EACd,MAAM,0BAA0B,CAAC;AAElC,eAAO,MAAM,eAAe,EAAE,aAAa,EAW1C,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;CAerB,CAAC;AAEX,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;CAWvB,CAAC;AAEX,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED,eAAO,MAAM,cAAc,GAAI,OAAO,OAAO,KAAG,OAmB/C,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,KAAK,KAAK,CAAC,SAAS,CAAC,qBAAqB,GAAG,KAAK,CAAC,SAAS,CAAC,gBAAgB;;;;CAK7E,CAAC"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.normalizeDocument = exports.normalizeValue = exports.ORDER_BY_SCHEMA_ITEM = exports.FILTER_SCHEMA_ITEM = exports.VALID_OPERATORS = void 0;
7
+ const firebase_admin_1 = __importDefault(require("firebase-admin"));
8
+ exports.VALID_OPERATORS = [
9
+ '<',
10
+ '<=',
11
+ '==',
12
+ '!=',
13
+ '>=',
14
+ '>',
15
+ 'array-contains',
16
+ 'array-contains-any',
17
+ 'in',
18
+ 'not-in',
19
+ ];
20
+ exports.FILTER_SCHEMA_ITEM = {
21
+ type: 'object',
22
+ properties: {
23
+ field: { type: 'string', description: 'Field name to filter on' },
24
+ operator: {
25
+ type: 'string',
26
+ enum: exports.VALID_OPERATORS,
27
+ description: 'Comparison operator',
28
+ },
29
+ value: {
30
+ description: 'Value to compare against (string, number, boolean, null, or array for in/array-contains-any/not-in)',
31
+ },
32
+ },
33
+ required: ['field', 'operator', 'value'],
34
+ };
35
+ exports.ORDER_BY_SCHEMA_ITEM = {
36
+ type: 'object',
37
+ properties: {
38
+ field: { type: 'string', description: 'Field to order by' },
39
+ direction: {
40
+ type: 'string',
41
+ enum: ['asc', 'desc'],
42
+ description: "Sort direction (default: 'asc')",
43
+ },
44
+ },
45
+ required: ['field'],
46
+ };
47
+ const normalizeValue = (value) => {
48
+ if (value === null || value === undefined)
49
+ return value;
50
+ if (value instanceof firebase_admin_1.default.firestore.Timestamp) {
51
+ return value.toDate().toISOString();
52
+ }
53
+ if (value instanceof firebase_admin_1.default.firestore.GeoPoint) {
54
+ return { latitude: value.latitude, longitude: value.longitude };
55
+ }
56
+ if (value instanceof firebase_admin_1.default.firestore.DocumentReference)
57
+ return value.path;
58
+ if (Array.isArray(value))
59
+ return value.map(exports.normalizeValue);
60
+ if (typeof value === 'object') {
61
+ return Object.fromEntries(Object.entries(value).map(([k, v]) => [
62
+ k,
63
+ (0, exports.normalizeValue)(v),
64
+ ]));
65
+ }
66
+ return value;
67
+ };
68
+ exports.normalizeValue = normalizeValue;
69
+ const normalizeDocument = (doc) => ({
70
+ id: doc.id,
71
+ path: doc.ref.path,
72
+ data: (0, exports.normalizeValue)(doc.data()),
73
+ });
74
+ exports.normalizeDocument = normalizeDocument;
75
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tools/firestore/types.ts"],"names":[],"mappings":";;;;;;AAAA,oEAAmC;AAOtB,QAAA,eAAe,GAAoB;IAC9C,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,gBAAgB;IAChB,oBAAoB;IACpB,IAAI;IACJ,QAAQ;CACT,CAAC;AAEW,QAAA,kBAAkB,GAAG;IAChC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;QACjE,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,uBAAe;YACrB,WAAW,EAAE,qBAAqB;SACnC;QACD,KAAK,EAAE;YACL,WAAW,EACT,qGAAqG;SACxG;KACF;IACD,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC;CAChC,CAAC;AAEE,QAAA,oBAAoB,GAAG;IAClC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;QAC3D,SAAS,EAAE;YACT,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;YACrB,WAAW,EAAE,iCAAiC;SAC/C;KACF;IACD,QAAQ,EAAE,CAAC,OAAO,CAAC;CACX,CAAC;AAaJ,MAAM,cAAc,GAAG,CAAC,KAAc,EAAW,EAAE;IACxD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxD,IAAI,KAAK,YAAY,wBAAK,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QAC/C,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC;IACD,IAAI,KAAK,YAAY,wBAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC9C,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;IAClE,CAAC;IACD,IAAI,KAAK,YAAY,wBAAK,CAAC,SAAS,CAAC,iBAAiB;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IAC1E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,sBAAc,CAAC,CAAC;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAqB,EAAE,CAAC;YACvD,CAAC;YACD,IAAA,sBAAc,EAAC,CAAC,CAAC;SAClB,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAnBW,QAAA,cAAc,kBAmBzB;AAEK,MAAM,iBAAiB,GAAG,CAC/B,GAA6E,EAC7E,EAAE,CAAC,CAAC;IACJ,EAAE,EAAE,GAAG,CAAC,EAAE;IACV,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI;IAClB,IAAI,EAAE,IAAA,sBAAc,EAAC,GAAG,CAAC,IAAI,EAAE,CAAC;CACjC,CAAC,CAAC;AANU,QAAA,iBAAiB,qBAM3B"}
@@ -0,0 +1,104 @@
1
+ import { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import { Effect } from 'effect';
3
+ import * as FirestoreTool from './firestore';
4
+ type ToolNames = typeof FirestoreTool.AGGREGATE_COLLECTION | typeof FirestoreTool.COUNT_DOCUMENTS | typeof FirestoreTool.GET_COLLECTION_SCHEMA | typeof FirestoreTool.GET_MANY_DOCUMENTS | typeof FirestoreTool.LIST_INDEXES | typeof FirestoreTool.READ_COLLECTION | typeof FirestoreTool.GET_DOCUMENT | typeof FirestoreTool.LIST_COLLECTIONS | typeof FirestoreTool.LIST_DOCUMENTS | typeof FirestoreTool.QUERY_COLLECTION | typeof FirestoreTool.QUERY_COLLECTION_GROUP;
5
+ export declare const allToolDefinitions: Tool[];
6
+ export declare const dispatchTool: (name: ToolNames | (string & {}), args: Record<string, unknown>) => Effect.Effect<{
7
+ [x: string]: unknown;
8
+ content: ({
9
+ type: "text";
10
+ text: string;
11
+ annotations?: {
12
+ audience?: ("user" | "assistant")[] | undefined;
13
+ priority?: number | undefined;
14
+ lastModified?: string | undefined;
15
+ } | undefined;
16
+ _meta?: {
17
+ [x: string]: unknown;
18
+ } | undefined;
19
+ } | {
20
+ type: "image";
21
+ data: string;
22
+ mimeType: string;
23
+ annotations?: {
24
+ audience?: ("user" | "assistant")[] | undefined;
25
+ priority?: number | undefined;
26
+ lastModified?: string | undefined;
27
+ } | undefined;
28
+ _meta?: {
29
+ [x: string]: unknown;
30
+ } | undefined;
31
+ } | {
32
+ type: "audio";
33
+ data: string;
34
+ mimeType: string;
35
+ annotations?: {
36
+ audience?: ("user" | "assistant")[] | undefined;
37
+ priority?: number | undefined;
38
+ lastModified?: string | undefined;
39
+ } | undefined;
40
+ _meta?: {
41
+ [x: string]: unknown;
42
+ } | undefined;
43
+ } | {
44
+ uri: string;
45
+ name: string;
46
+ type: "resource_link";
47
+ description?: string | undefined;
48
+ mimeType?: string | undefined;
49
+ size?: number | undefined;
50
+ annotations?: {
51
+ audience?: ("user" | "assistant")[] | undefined;
52
+ priority?: number | undefined;
53
+ lastModified?: string | undefined;
54
+ } | undefined;
55
+ _meta?: {
56
+ [x: string]: unknown;
57
+ } | undefined;
58
+ icons?: {
59
+ src: string;
60
+ mimeType?: string | undefined;
61
+ sizes?: string[] | undefined;
62
+ theme?: "light" | "dark" | undefined;
63
+ }[] | undefined;
64
+ title?: string | undefined;
65
+ } | {
66
+ type: "resource";
67
+ resource: {
68
+ uri: string;
69
+ text: string;
70
+ mimeType?: string | undefined;
71
+ _meta?: {
72
+ [x: string]: unknown;
73
+ } | undefined;
74
+ } | {
75
+ uri: string;
76
+ blob: string;
77
+ mimeType?: string | undefined;
78
+ _meta?: {
79
+ [x: string]: unknown;
80
+ } | undefined;
81
+ };
82
+ annotations?: {
83
+ audience?: ("user" | "assistant")[] | undefined;
84
+ priority?: number | undefined;
85
+ lastModified?: string | undefined;
86
+ } | undefined;
87
+ _meta?: {
88
+ [x: string]: unknown;
89
+ } | undefined;
90
+ })[];
91
+ _meta?: {
92
+ [x: string]: unknown;
93
+ progressToken?: string | number | undefined;
94
+ "io.modelcontextprotocol/related-task"?: {
95
+ taskId: string;
96
+ } | undefined;
97
+ } | undefined;
98
+ structuredContent?: {
99
+ [x: string]: unknown;
100
+ } | undefined;
101
+ isError?: boolean | undefined;
102
+ }, never, import("../config").ConfigService | import("../access").AccessService | import("../firebase").FirebaseService>;
103
+ export {};
104
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,KAAK,aAAa,MAAM,aAAa,CAAC;AAE7C,KAAK,SAAS,GACV,OAAO,aAAa,CAAC,oBAAoB,GACzC,OAAO,aAAa,CAAC,eAAe,GACpC,OAAO,aAAa,CAAC,qBAAqB,GAC1C,OAAO,aAAa,CAAC,kBAAkB,GACvC,OAAO,aAAa,CAAC,YAAY,GACjC,OAAO,aAAa,CAAC,eAAe,GACpC,OAAO,aAAa,CAAC,YAAY,GACjC,OAAO,aAAa,CAAC,gBAAgB,GACrC,OAAO,aAAa,CAAC,cAAc,GACnC,OAAO,aAAa,CAAC,gBAAgB,GACrC,OAAO,aAAa,CAAC,sBAAsB,CAAC;AAEhD,eAAO,MAAM,kBAAkB,EAAE,IAAI,EAYpC,CAAC;AAuBF,eAAO,MAAM,YAAY,GACvB,MAAM,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,EAC/B,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wHA2F5B,CAAC"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.dispatchTool = exports.allToolDefinitions = void 0;
37
+ const effect_1 = require("effect");
38
+ const FirestoreTool = __importStar(require("./firestore"));
39
+ exports.allToolDefinitions = [
40
+ FirestoreTool.aggregateCollectionDefinition,
41
+ FirestoreTool.listCollectionsDefinition,
42
+ FirestoreTool.listDocumentsDefinition,
43
+ FirestoreTool.listIndexesDefinition,
44
+ FirestoreTool.getCollectionSchemaDefinition,
45
+ FirestoreTool.countDocumentsDefinition,
46
+ FirestoreTool.readCollectionDefinition,
47
+ FirestoreTool.getDocumentDefinition,
48
+ FirestoreTool.getManyDocumentsDefinition,
49
+ FirestoreTool.queryCollectionDefinition,
50
+ FirestoreTool.queryCollectionGroupDefinition,
51
+ ];
52
+ const toErrorResult = (code, message, details) => ({
53
+ content: [
54
+ {
55
+ type: 'text',
56
+ text: JSON.stringify({
57
+ success: false,
58
+ error: { code, message, details },
59
+ }),
60
+ },
61
+ ],
62
+ isError: true,
63
+ });
64
+ const toSuccessResult = (data) => ({
65
+ content: [{ type: 'text', text: JSON.stringify({ success: true, data }) }],
66
+ });
67
+ const dispatchTool = (name, args) => effect_1.Effect.gen(function* () {
68
+ switch (name) {
69
+ case FirestoreTool.AGGREGATE_COLLECTION:
70
+ return yield* FirestoreTool.aggregateCollection(args);
71
+ case FirestoreTool.COUNT_DOCUMENTS:
72
+ return yield* FirestoreTool.countDocuments(args);
73
+ case FirestoreTool.GET_COLLECTION_SCHEMA:
74
+ return yield* FirestoreTool.getCollectionSchema(args);
75
+ case FirestoreTool.GET_MANY_DOCUMENTS:
76
+ return yield* FirestoreTool.getManyDocuments(args);
77
+ case FirestoreTool.LIST_INDEXES:
78
+ return yield* FirestoreTool.listIndexes(args);
79
+ case FirestoreTool.QUERY_COLLECTION_GROUP:
80
+ return yield* FirestoreTool.queryCollectionGroup(args);
81
+ case FirestoreTool.LIST_COLLECTIONS:
82
+ return yield* FirestoreTool.listCollections(args);
83
+ case FirestoreTool.LIST_DOCUMENTS:
84
+ return yield* FirestoreTool.listDocuments(args);
85
+ case FirestoreTool.READ_COLLECTION:
86
+ return yield* FirestoreTool.readCollection(args);
87
+ case FirestoreTool.GET_DOCUMENT:
88
+ return yield* FirestoreTool.getDocument(args);
89
+ case FirestoreTool.QUERY_COLLECTION:
90
+ return yield* FirestoreTool.queryCollection(args);
91
+ default:
92
+ return yield* effect_1.Effect.fail({ _tag: 'UnknownTool', name });
93
+ }
94
+ }).pipe(effect_1.Effect.map(toSuccessResult), effect_1.Effect.catchAll((err) => {
95
+ switch (err._tag) {
96
+ case 'AccessDeniedError':
97
+ return effect_1.Effect.succeed(toErrorResult('ACCESS_DENIED', `Access to path '${err.path}' is not allowed`, { path: err.path, suggestion: { allow: [err.path] } }));
98
+ case 'DocumentNotFoundError':
99
+ return effect_1.Effect.succeed(toErrorResult('NOT_FOUND', `Document not found: ${err.path}`, {
100
+ path: err.path,
101
+ }));
102
+ case 'FirestoreAggregateError':
103
+ case 'FirestoreReadError':
104
+ case 'FirestoreGetError':
105
+ case 'FirestoreQueryError':
106
+ case 'FirestoreListCollectionsError':
107
+ case 'FirestoreListDocumentsError':
108
+ case 'FirestoreCountError':
109
+ case 'FirestoreSchemaError':
110
+ case 'FirestoreGetManyError':
111
+ case 'FirestoreListIndexesError':
112
+ case 'FirestoreCollectionGroupQueryError':
113
+ return effect_1.Effect.succeed(toErrorResult('FIRESTORE_ERROR', err.message, {
114
+ cause: String(err.cause),
115
+ }));
116
+ case 'UnknownTool':
117
+ return effect_1.Effect.succeed(toErrorResult('UNKNOWN_TOOL', `Unknown tool: ${err.name}`));
118
+ }
119
+ }));
120
+ exports.dispatchTool = dispatchTool;
121
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "firebase-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server that exposes Firebase Firestore to AI agents (Cursor, Claude Desktop, etc.)",
5
+ "main": "dist/cli/index.js",
6
+ "bin": {
7
+ "firebase-mcp": "dist/cli/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "dev": "tsx src/cli/index.ts",
15
+ "start": "node dist/cli/index.js",
16
+ "prepublishOnly": "pnpm build"
17
+ },
18
+ "keywords": [
19
+ "mcp",
20
+ "model-context-protocol",
21
+ "firebase",
22
+ "firestore",
23
+ "ai",
24
+ "cursor",
25
+ "claude"
26
+ ],
27
+ "author": "triston.c.0186@gmail.com",
28
+ "license": "MIT",
29
+ "packageManager": "pnpm@10.33.0",
30
+ "dependencies": {
31
+ "@effect/platform": "^0.96.0",
32
+ "@effect/platform-node": "^0.106.0",
33
+ "@modelcontextprotocol/sdk": "^1.29.0",
34
+ "effect": "^3.21.0",
35
+ "firebase-admin": "^13.7.0",
36
+ "micromatch": "^4.0.8",
37
+ "minimist": "^1.2.8"
38
+ },
39
+ "devDependencies": {
40
+ "@effect/language-service": "^0.84.3",
41
+ "@types/micromatch": "^4.0.10",
42
+ "@types/minimist": "^1.2.5",
43
+ "@types/node": "^25.5.2",
44
+ "ts-node": "^10.9.2",
45
+ "tsx": "^4.21.0",
46
+ "typescript": "^6.0.2"
47
+ }
48
+ }