lintbase-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 (41) hide show
  1. package/dist/core/analysis.utils.d.ts +13 -0
  2. package/dist/core/analysis.utils.d.ts.map +1 -0
  3. package/dist/core/analysis.utils.js +22 -0
  4. package/dist/core/analysis.utils.js.map +1 -0
  5. package/dist/core/cost.analyzer.d.ts +4 -0
  6. package/dist/core/cost.analyzer.d.ts.map +1 -0
  7. package/dist/core/cost.analyzer.js +60 -0
  8. package/dist/core/cost.analyzer.js.map +1 -0
  9. package/dist/core/performance.analyzer.d.ts +4 -0
  10. package/dist/core/performance.analyzer.d.ts.map +1 -0
  11. package/dist/core/performance.analyzer.js +39 -0
  12. package/dist/core/performance.analyzer.js.map +1 -0
  13. package/dist/core/schema-drift.analyzer.d.ts +4 -0
  14. package/dist/core/schema-drift.analyzer.d.ts.map +1 -0
  15. package/dist/core/schema-drift.analyzer.js +52 -0
  16. package/dist/core/schema-drift.analyzer.js.map +1 -0
  17. package/dist/core/security.analyzer.d.ts +4 -0
  18. package/dist/core/security.analyzer.d.ts.map +1 -0
  19. package/dist/core/security.analyzer.js +40 -0
  20. package/dist/core/security.analyzer.js.map +1 -0
  21. package/dist/server.d.ts +3 -0
  22. package/dist/server.d.ts.map +1 -0
  23. package/dist/server.js +31 -0
  24. package/dist/server.js.map +1 -0
  25. package/dist/tools/issues.tool.d.ts +3 -0
  26. package/dist/tools/issues.tool.d.ts.map +1 -0
  27. package/dist/tools/issues.tool.js +250 -0
  28. package/dist/tools/issues.tool.js.map +1 -0
  29. package/dist/tools/scan.tool.d.ts +3 -0
  30. package/dist/tools/scan.tool.d.ts.map +1 -0
  31. package/dist/tools/scan.tool.js +207 -0
  32. package/dist/tools/scan.tool.js.map +1 -0
  33. package/dist/tools/schema.tool.d.ts +23 -0
  34. package/dist/tools/schema.tool.d.ts.map +1 -0
  35. package/dist/tools/schema.tool.js +229 -0
  36. package/dist/tools/schema.tool.js.map +1 -0
  37. package/dist/types.d.ts +38 -0
  38. package/dist/types.d.ts.map +1 -0
  39. package/dist/types.js +7 -0
  40. package/dist/types.js.map +1 -0
  41. package/package.json +53 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issues.tool.js","sourceRoot":"","sources":["../../src/tools/issues.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerScanTool(server: McpServer): void;
3
+ //# sourceMappingURL=scan.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.tool.d.ts","sourceRoot":"","sources":["../../src/tools/scan.tool.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmKpE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8BxD"}
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ // packages/lintbase-mcp/src/tools/scan.tool.ts
3
+ //
4
+ // MCP Tool: lintbase_scan
5
+ // Runs a full LintBase scan against a Firestore database and returns
6
+ // the structured report (same shape as `lintbase scan --json`).
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.registerScanTool = registerScanTool;
42
+ const zod_1 = require("zod");
43
+ const admin = __importStar(require("firebase-admin"));
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ const SchemaDrift = __importStar(require("../core/schema-drift.analyzer.js"));
47
+ const Performance = __importStar(require("../core/performance.analyzer.js"));
48
+ const Security = __importStar(require("../core/security.analyzer.js"));
49
+ const Cost = __importStar(require("../core/cost.analyzer.js"));
50
+ // ── Risk score (mirrored from CLI) ───────────────────────────────────────────
51
+ function computeRiskScore(errors, warnings, infos) {
52
+ return Math.min(100, errors * 12 + warnings * 4 + infos * 1);
53
+ }
54
+ // ── Firestore type helpers ────────────────────────────────────────────────────
55
+ function inferType(value) {
56
+ if (value === null)
57
+ return 'null';
58
+ if (value === undefined)
59
+ return 'undefined';
60
+ if (Array.isArray(value))
61
+ return 'array';
62
+ if (typeof value === 'object' && value !== null &&
63
+ 'toDate' in value && typeof value.toDate === 'function')
64
+ return 'timestamp';
65
+ if (typeof value === 'object' && value !== null &&
66
+ 'path' in value && 'id' in value)
67
+ return 'reference';
68
+ if (typeof value === 'object')
69
+ return 'map';
70
+ return typeof value;
71
+ }
72
+ function calculateDepth(obj, current = 1) {
73
+ if (typeof obj !== 'object' || obj === null || Array.isArray(obj))
74
+ return current;
75
+ const values = Object.values(obj);
76
+ if (values.length === 0)
77
+ return current;
78
+ return Math.max(...values.map((v) => calculateDepth(v, current + 1)));
79
+ }
80
+ function mapDocument(doc, collection) {
81
+ const rawData = doc.data();
82
+ const fields = {};
83
+ for (const [key, value] of Object.entries(rawData)) {
84
+ fields[key] = { value, type: inferType(value) };
85
+ }
86
+ const depth = calculateDepth(rawData);
87
+ const sizeBytes = (() => {
88
+ try {
89
+ return Buffer.byteLength(JSON.stringify(rawData), 'utf-8');
90
+ }
91
+ catch {
92
+ return 0;
93
+ }
94
+ })();
95
+ return { id: doc.id, collection, fields, depth, sizeBytes };
96
+ }
97
+ // ── Core scan function ────────────────────────────────────────────────────────
98
+ async function runScan(keyPath, sampleSize, collections) {
99
+ const resolvedKey = path.resolve(keyPath);
100
+ if (!fs.existsSync(resolvedKey)) {
101
+ throw new Error(`Service account file not found: ${resolvedKey}`);
102
+ }
103
+ const serviceAccount = JSON.parse(fs.readFileSync(resolvedKey, 'utf-8'));
104
+ // Avoid re-initializing Firebase if already running
105
+ if (!admin.apps.length) {
106
+ admin.initializeApp({ credential: admin.credential.cert(serviceAccount) });
107
+ }
108
+ const db = admin.firestore();
109
+ // Discover collections
110
+ const allCollections = (await db.listCollections()).map((c) => c.id);
111
+ const targetCollections = collections && collections.length > 0
112
+ ? allCollections.filter((c) => collections.includes(c))
113
+ : allCollections;
114
+ if (targetCollections.length === 0) {
115
+ throw new Error(collections && collections.length > 0
116
+ ? `None of the requested collections [${collections.join(', ')}] were found. Available: [${allCollections.join(', ')}]`
117
+ : 'No collections found in this Firestore database.');
118
+ }
119
+ // Sample documents
120
+ const allDocuments = [];
121
+ for (const col of targetCollections) {
122
+ const snapshot = await db.collection(col).limit(sampleSize).get();
123
+ allDocuments.push(...snapshot.docs.map((doc) => mapDocument(doc, col)));
124
+ }
125
+ const scanResult = {
126
+ connector: 'firestore',
127
+ collections: targetCollections,
128
+ documentCount: allDocuments.length,
129
+ documents: allDocuments,
130
+ scannedAt: new Date(),
131
+ };
132
+ // Run all analyzers
133
+ const analysisOptions = { limit: sampleSize };
134
+ const [schemaDriftIssues, perfIssues, securityIssues, costIssues] = await Promise.all([
135
+ Promise.resolve(SchemaDrift.analyze(scanResult, analysisOptions)),
136
+ Promise.resolve(Performance.analyze(scanResult, analysisOptions)),
137
+ Promise.resolve(Security.analyze(scanResult, analysisOptions)),
138
+ Promise.resolve(Cost.analyze(scanResult, analysisOptions)),
139
+ ]);
140
+ const issues = [
141
+ ...schemaDriftIssues,
142
+ ...perfIssues,
143
+ ...securityIssues,
144
+ ...costIssues,
145
+ ];
146
+ const errors = issues.filter((i) => i.severity === 'error').length;
147
+ const warnings = issues.filter((i) => i.severity === 'warning').length;
148
+ const infos = issues.filter((i) => i.severity === 'info').length;
149
+ const report = {
150
+ summary: {
151
+ totalCollections: targetCollections.length,
152
+ totalDocuments: allDocuments.length,
153
+ errors,
154
+ warnings,
155
+ infos,
156
+ riskScore: computeRiskScore(errors, warnings, infos),
157
+ },
158
+ issues,
159
+ scannedAt: scanResult.scannedAt,
160
+ };
161
+ return report;
162
+ }
163
+ // ── Input schema ─────────────────────────────────────────────────────────────
164
+ // NOTE: Zod 3.25.x is Zod v4 under the hood. Its types cause TS2589 ("type
165
+ // instantiation is excessively deep") when used directly with the MCP SDK's
166
+ // generic inference. The fix: annotate the shape as Record<string, z.ZodTypeAny>
167
+ // to clamp TypeScript's inference depth, then validate inputs manually.
168
+ const scanInputShape = {
169
+ keyPath: zod_1.z.string().describe('Absolute or relative path to the Firebase service account JSON file.'),
170
+ sampleSize: zod_1.z.number().int().min(1).max(500).optional().describe('Max documents to sample per collection (default: 50, max: 500).'),
171
+ collections: zod_1.z.array(zod_1.z.string()).optional().describe('Optional list of collection names to scan. Omit to scan all collections.'),
172
+ };
173
+ // Runtime validator for the handler (separate from the shape above)
174
+ const ScanInput = zod_1.z.object({
175
+ keyPath: zod_1.z.string(),
176
+ sampleSize: zod_1.z.number().int().min(1).max(500).default(50),
177
+ collections: zod_1.z.array(zod_1.z.string()).optional(),
178
+ });
179
+ // ── Register with MCP server ──────────────────────────────────────────────────
180
+ function registerScanTool(server) {
181
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
182
+ server.registerTool('lintbase_scan', {
183
+ title: 'LintBase Full Scan',
184
+ description: 'Runs a full LintBase scan against a Firestore database. ' +
185
+ 'Detects schema drift, security issues, performance problems, and cost leaks. ' +
186
+ 'Returns a structured report with a risk score and actionable issues. ' +
187
+ 'Use this before writing any database-related code to get ground-truth schema context.',
188
+ inputSchema: scanInputShape,
189
+ }, async (rawInput) => {
190
+ try {
191
+ const { keyPath, sampleSize, collections } = ScanInput.parse(rawInput);
192
+ const report = await runScan(keyPath, sampleSize, collections);
193
+ const text = JSON.stringify(report, null, 2);
194
+ return {
195
+ content: [{ type: 'text', text }],
196
+ };
197
+ }
198
+ catch (err) {
199
+ const message = err instanceof Error ? err.message : String(err);
200
+ return {
201
+ content: [{ type: 'text', text: `LintBase scan failed: ${message}` }],
202
+ isError: true,
203
+ };
204
+ }
205
+ });
206
+ }
207
+ //# sourceMappingURL=scan.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.tool.js","sourceRoot":"","sources":["../../src/tools/scan.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export interface FieldSchema {
3
+ name: string;
4
+ /** All observed types for this field (ideally just one) */
5
+ types: string[];
6
+ /** Fraction of sampled docs that contain this field (0.0–1.0) */
7
+ presenceRate: number;
8
+ /** true when presenceRate ≥ 0.8 AND only one type observed */
9
+ stable: boolean;
10
+ /** Human-readable note for unstable fields */
11
+ note?: string;
12
+ }
13
+ export interface CollectionSchema {
14
+ name: string;
15
+ sampledDocuments: number;
16
+ fields: FieldSchema[];
17
+ }
18
+ export interface SchemaReport {
19
+ collections: CollectionSchema[];
20
+ scannedAt: string;
21
+ }
22
+ export declare function registerSchemaTool(server: McpServer): void;
23
+ //# sourceMappingURL=schema.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.tool.d.ts","sourceRoot":"","sources":["../../src/tools/schema.tool.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiDpE,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,MAAM,EAAE,OAAO,CAAC;IAChB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IACzB,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;CACrB;AA0GD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2D1D"}
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ // packages/lintbase-mcp/src/tools/schema.tool.ts
3
+ //
4
+ // MCP Tool: lintbase_get_schema
5
+ //
6
+ // Returns the inferred schema for one or all Firestore collections.
7
+ // For each collection the agent gets:
8
+ // - Every field name observed across sampled documents
9
+ // - The type(s) each field holds (e.g. "string", "timestamp", "map")
10
+ // - The presence rate (0.0–1.0) — how many docs have this field
11
+ // - Whether the field is considered "stable" (≥ 80 % presence, single type)
12
+ //
13
+ // This is the killer tool for AI agents: instead of hallucinating field
14
+ // names, the agent calls this first and gets the real shape of the DB.
15
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ var desc = Object.getOwnPropertyDescriptor(m, k);
18
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
+ desc = { enumerable: true, get: function() { return m[k]; } };
20
+ }
21
+ Object.defineProperty(o, k2, desc);
22
+ }) : (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ o[k2] = m[k];
25
+ }));
26
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
27
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
28
+ }) : function(o, v) {
29
+ o["default"] = v;
30
+ });
31
+ var __importStar = (this && this.__importStar) || (function () {
32
+ var ownKeys = function(o) {
33
+ ownKeys = Object.getOwnPropertyNames || function (o) {
34
+ var ar = [];
35
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
36
+ return ar;
37
+ };
38
+ return ownKeys(o);
39
+ };
40
+ return function (mod) {
41
+ if (mod && mod.__esModule) return mod;
42
+ var result = {};
43
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
44
+ __setModuleDefault(result, mod);
45
+ return result;
46
+ };
47
+ })();
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ exports.registerSchemaTool = registerSchemaTool;
50
+ const zod_1 = require("zod");
51
+ const admin = __importStar(require("firebase-admin"));
52
+ const fs = __importStar(require("fs"));
53
+ const path = __importStar(require("path"));
54
+ // ── Firestore helpers (same as scan.tool.ts) ──────────────────────────────────
55
+ function inferType(value) {
56
+ if (value === null)
57
+ return 'null';
58
+ if (value === undefined)
59
+ return 'undefined';
60
+ if (Array.isArray(value))
61
+ return 'array';
62
+ if (typeof value === 'object' && value !== null &&
63
+ 'toDate' in value && typeof value.toDate === 'function')
64
+ return 'timestamp';
65
+ if (typeof value === 'object' && value !== null &&
66
+ 'path' in value && 'id' in value)
67
+ return 'reference';
68
+ if (typeof value === 'object')
69
+ return 'map';
70
+ return typeof value;
71
+ }
72
+ function calculateDepth(obj, current = 1) {
73
+ if (typeof obj !== 'object' || obj === null || Array.isArray(obj))
74
+ return current;
75
+ const values = Object.values(obj);
76
+ if (values.length === 0)
77
+ return current;
78
+ return Math.max(...values.map((v) => calculateDepth(v, current + 1)));
79
+ }
80
+ function mapDocument(doc, collection) {
81
+ const rawData = doc.data();
82
+ const fields = {};
83
+ for (const [key, value] of Object.entries(rawData)) {
84
+ fields[key] = { value, type: inferType(value) };
85
+ }
86
+ const depth = calculateDepth(rawData);
87
+ const sizeBytes = (() => {
88
+ try {
89
+ return Buffer.byteLength(JSON.stringify(rawData), 'utf-8');
90
+ }
91
+ catch {
92
+ return 0;
93
+ }
94
+ })();
95
+ return { id: doc.id, collection, fields, depth, sizeBytes };
96
+ }
97
+ function inferCollectionSchema(docs, collectionName) {
98
+ const fieldTypes = new Map();
99
+ const fieldCounts = new Map();
100
+ const total = docs.length;
101
+ for (const doc of docs) {
102
+ for (const [field, { type }] of Object.entries(doc.fields)) {
103
+ if (!fieldTypes.has(field))
104
+ fieldTypes.set(field, new Set());
105
+ fieldTypes.get(field).add(type);
106
+ fieldCounts.set(field, (fieldCounts.get(field) ?? 0) + 1);
107
+ }
108
+ }
109
+ const fields = [];
110
+ for (const [name, types] of fieldTypes.entries()) {
111
+ const count = fieldCounts.get(name) ?? 0;
112
+ const presenceRate = total > 0 ? count / total : 0;
113
+ const typeList = [...types];
114
+ const stable = presenceRate >= 0.8 && typeList.length === 1;
115
+ let note;
116
+ if (typeList.length > 1) {
117
+ note = `Type mismatch: field holds ${typeList.join(' | ')} — schema drift detected.`;
118
+ }
119
+ else if (presenceRate < 0.6) {
120
+ note = `Sparse field: only present in ${Math.round(presenceRate * 100)}% of documents.`;
121
+ }
122
+ else if (presenceRate < 0.8) {
123
+ note = `Inconsistent field: present in ${Math.round(presenceRate * 100)}% of documents — mark as optional.`;
124
+ }
125
+ fields.push({ name, types: typeList, presenceRate, stable, note });
126
+ }
127
+ // Sort: stable fields first, then by presence rate descending
128
+ fields.sort((a, b) => {
129
+ if (a.stable !== b.stable)
130
+ return a.stable ? -1 : 1;
131
+ return b.presenceRate - a.presenceRate;
132
+ });
133
+ return { name: collectionName, sampledDocuments: total, fields };
134
+ }
135
+ // ── Core function ─────────────────────────────────────────────────────────────
136
+ async function getSchema(keyPath, sampleSize, collection) {
137
+ const resolvedKey = path.resolve(keyPath);
138
+ if (!fs.existsSync(resolvedKey)) {
139
+ throw new Error(`Service account file not found: ${resolvedKey}`);
140
+ }
141
+ const serviceAccount = JSON.parse(fs.readFileSync(resolvedKey, 'utf-8'));
142
+ if (!admin.apps.length) {
143
+ admin.initializeApp({ credential: admin.credential.cert(serviceAccount) });
144
+ }
145
+ const db = admin.firestore();
146
+ // Determine which collections to scan
147
+ const allCollections = (await db.listCollections()).map((c) => c.id);
148
+ const targetCollections = collection
149
+ ? allCollections.filter((c) => c === collection)
150
+ : allCollections;
151
+ if (targetCollections.length === 0) {
152
+ throw new Error(collection
153
+ ? `Collection "${collection}" not found. Available: [${allCollections.join(', ')}]`
154
+ : 'No collections found in this Firestore database.');
155
+ }
156
+ // Sample documents and infer schema per collection
157
+ const collections = [];
158
+ for (const col of targetCollections) {
159
+ const snapshot = await db.collection(col).limit(sampleSize).get();
160
+ const docs = snapshot.docs.map((doc) => mapDocument(doc, col));
161
+ collections.push(inferCollectionSchema(docs, col));
162
+ }
163
+ return { collections, scannedAt: new Date().toISOString() };
164
+ }
165
+ // ── Input schema ──────────────────────────────────────────────────────────────
166
+ const schemaInputShape = {
167
+ keyPath: zod_1.z.string().describe('Absolute or relative path to the Firebase service account JSON file.'),
168
+ collection: zod_1.z.string().optional().describe('Name of a single collection to inspect. Omit to get the schema of ALL collections.'),
169
+ sampleSize: zod_1.z.number().int().min(1).max(500).optional().describe('Max documents to sample per collection (default: 50).'),
170
+ };
171
+ const SchemaInput = zod_1.z.object({
172
+ keyPath: zod_1.z.string(),
173
+ collection: zod_1.z.string().optional(),
174
+ sampleSize: zod_1.z.number().int().min(1).max(500).default(50),
175
+ });
176
+ // ── Register with MCP server ──────────────────────────────────────────────────
177
+ function registerSchemaTool(server) {
178
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
179
+ server.registerTool('lintbase_get_schema', {
180
+ title: 'LintBase Get Schema',
181
+ description: 'Returns the ground-truth schema of your Firestore collections by sampling real documents. ' +
182
+ 'For each collection you get field names, observed types, and presence rates. ' +
183
+ 'Use this BEFORE writing any database code to avoid hallucinating field names. ' +
184
+ 'Stable fields (≥80% presence, single type) are safe to use. ' +
185
+ 'Fields marked with a note need attention (drift, sparse, or optional).',
186
+ inputSchema: schemaInputShape,
187
+ }, async (rawInput) => {
188
+ try {
189
+ const { keyPath, collection, sampleSize } = SchemaInput.parse(rawInput);
190
+ const schemaReport = await getSchema(keyPath, sampleSize, collection);
191
+ // Format a clean, readable text summary the AI can reason about instantly
192
+ const lines = [
193
+ `# LintBase Schema Report`,
194
+ `Scanned at: ${schemaReport.scannedAt}`,
195
+ `Collections: ${schemaReport.collections.length}`,
196
+ ``,
197
+ ];
198
+ for (const col of schemaReport.collections) {
199
+ lines.push(`## ${col.name} (${col.sampledDocuments} docs sampled)`);
200
+ lines.push(`| Field | Type(s) | Presence | Stable |`);
201
+ lines.push(`|-------|---------|----------|--------|`);
202
+ for (const f of col.fields) {
203
+ const presence = `${Math.round(f.presenceRate * 100)}%`;
204
+ const stable = f.stable ? '✅' : '⚠️';
205
+ const note = f.note ? ` ← ${f.note}` : '';
206
+ lines.push(`| ${f.name} | ${f.types.join(' | ')} | ${presence} | ${stable}${note} |`);
207
+ }
208
+ lines.push(``);
209
+ }
210
+ // Also return the raw JSON for programmatic use
211
+ const jsonData = JSON.stringify(schemaReport, null, 2);
212
+ const textSummary = lines.join('\n');
213
+ return {
214
+ content: [
215
+ { type: 'text', text: textSummary },
216
+ { type: 'text', text: `\n---\n**Raw JSON:**\n\`\`\`json\n${jsonData}\n\`\`\`` },
217
+ ],
218
+ };
219
+ }
220
+ catch (err) {
221
+ const message = err instanceof Error ? err.message : String(err);
222
+ return {
223
+ content: [{ type: 'text', text: `lintbase_get_schema failed: ${message}` }],
224
+ isError: true,
225
+ };
226
+ }
227
+ });
228
+ }
229
+ //# sourceMappingURL=schema.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.tool.js","sourceRoot":"","sources":["../../src/tools/schema.tool.ts"],"names":[],"mappings":";AAAA,iDAAiD;AACjD,EAAE;AACF,gCAAgC;AAChC,EAAE;AACF,oEAAoE;AACpE,sCAAsC;AACtC,yDAAyD;AACzD,uEAAuE;AACvE,mEAAmE;AACnE,8EAA8E;AAC9E,EAAE;AACF,wEAAwE;AACxE,uEAAuE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkLvE,gDA2DC;AA1OD,6BAAwB;AACxB,sDAAwC;AACxC,uCAAyB;AACzB,2CAA6B;AAI7B,iFAAiF;AACjF,SAAS,SAAS,CAAC,KAAc;IAC7B,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACzC,IACI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAC3C,QAAQ,IAAI,KAAK,IAAI,OAAQ,KAA6B,CAAC,MAAM,KAAK,UAAU;QAClF,OAAO,WAAW,CAAC;IACrB,IACI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAC3C,MAAM,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK;QAClC,OAAO,WAAW,CAAC;IACrB,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,OAAO,KAAK,CAAC;AACxB,CAAC;AAED,SAAS,cAAc,CAAC,GAAY,EAAE,OAAO,GAAG,CAAC;IAC7C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAClF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAA8B,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,WAAW,CAChB,GAA0C,EAC1C,UAAkB;IAElB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAqD,EAAE,CAAC;IACpE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;IACpD,CAAC;IACD,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE;QACpB,IAAI,CAAC;YAAC,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,CAAC,CAAC;QAAC,CAAC;IAC3F,CAAC,CAAC,EAAE,CAAC;IACL,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAChE,CAAC;AA0BD,SAAS,qBAAqB,CAC1B,IAAwB,EACxB,cAAsB;IAEtB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAuB,CAAC;IAClD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IAE1B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YAC7D,UAAU,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,YAAY,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;QAE5D,IAAI,IAAwB,CAAC;QAC7B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,GAAG,8BAA8B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC;QACzF,CAAC;aAAM,IAAI,YAAY,GAAG,GAAG,EAAE,CAAC;YAC5B,IAAI,GAAG,iCAAiC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC,iBAAiB,CAAC;QAC5F,CAAC;aAAM,IAAI,YAAY,GAAG,GAAG,EAAE,CAAC;YAC5B,IAAI,GAAG,kCAAkC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC,oCAAoC,CAAC;QAChH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,8DAA8D;IAC9D,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACjB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACrE,CAAC;AAED,iFAAiF;AACjF,KAAK,UAAU,SAAS,CACpB,OAAe,EACf,UAAkB,EAClB,UAAmB;IAEnB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,mCAAmC,WAAW,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAC7B,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAChB,CAAC;IAE1B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAE7B,sCAAsC;IACtC,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACrE,MAAM,iBAAiB,GAAG,UAAU;QAChC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC;QAChD,CAAC,CAAC,cAAc,CAAC;IAErB,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACX,UAAU;YACN,CAAC,CAAC,eAAe,UAAU,4BAA4B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YACnF,CAAC,CAAC,kDAAkD,CAC3D,CAAC;IACN,CAAC;IAED,mDAAmD;IACnD,MAAM,WAAW,GAAuB,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;QAClE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/D,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;AAChE,CAAC;AAED,iFAAiF;AACjF,MAAM,gBAAgB,GAAiC;IACnD,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sEAAsE,CAAC;IACpG,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oFAAoF,CAAC;IAChI,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;CAC5H,CAAC;AAEF,MAAM,WAAW,GAAG,OAAC,CAAC,MAAM,CAAC;IACzB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;IACnB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC3D,CAAC,CAAC;AAEH,iFAAiF;AACjF,SAAgB,kBAAkB,CAAC,MAAiB;IAChD,8DAA8D;IAC7D,MAAc,CAAC,YAAY,CACxB,qBAAqB,EACrB;QACI,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACP,4FAA4F;YAC5F,+EAA+E;YAC/E,gFAAgF;YAChF,8DAA8D;YAC9D,wEAAwE;QAC5E,WAAW,EAAE,gBAAgB;KAChC,EACD,KAAK,EAAE,QAAiB,EAAE,EAAE;QACxB,IAAI,CAAC;YACD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxE,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;YAEtE,0EAA0E;YAC1E,MAAM,KAAK,GAAa;gBACpB,0BAA0B;gBAC1B,eAAe,YAAY,CAAC,SAAS,EAAE;gBACvC,gBAAgB,YAAY,CAAC,WAAW,CAAC,MAAM,EAAE;gBACjD,EAAE;aACL,CAAC;YAEF,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,gBAAgB,gBAAgB,CAAC,CAAC;gBACrE,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;gBACtD,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;gBACtD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;oBACzB,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC;oBACxD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;oBACrC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC;gBAC1F,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnB,CAAC;YAED,gDAAgD;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACvD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAErC,OAAO;gBACH,OAAO,EAAE;oBACL,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,WAAW,EAAE;oBAC5C,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qCAAqC,QAAQ,UAAU,EAAE;iBAC3F;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,+BAA+B,OAAO,EAAE,EAAE,CAAC;gBACpF,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;AACN,CAAC"}
@@ -0,0 +1,38 @@
1
+ export interface LintBaseDocument {
2
+ id: string;
3
+ collection: string;
4
+ fields: Record<string, {
5
+ value: unknown;
6
+ type: string;
7
+ }>;
8
+ depth: number;
9
+ sizeBytes: number;
10
+ }
11
+ export interface LintBaseScanResult {
12
+ connector: string;
13
+ collections: string[];
14
+ documentCount: number;
15
+ documents: LintBaseDocument[];
16
+ scannedAt: Date;
17
+ }
18
+ export interface LintBaseIssue {
19
+ severity: 'error' | 'warning' | 'info';
20
+ collection: string;
21
+ rule: string;
22
+ message: string;
23
+ affectedDocuments?: string[];
24
+ suggestion?: string;
25
+ }
26
+ export interface LintBaseReport {
27
+ summary: {
28
+ totalCollections: number;
29
+ totalDocuments: number;
30
+ errors: number;
31
+ warnings: number;
32
+ infos: number;
33
+ riskScore: number;
34
+ };
35
+ issues: LintBaseIssue[];
36
+ scannedAt: Date;
37
+ }
38
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,SAAS,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE;QACL,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,EAAE,IAAI,CAAC;CACnB"}
package/dist/types.js ADDED
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ // packages/lintbase-mcp/src/types.ts
3
+ // Re-exports the LintBase core types.
4
+ // The MCP package copies these (rather than importing from the CLI package)
5
+ // so both packages can be published and versioned independently on npm.
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,qCAAqC;AACrC,sCAAsC;AACtC,4EAA4E;AAC5E,wEAAwE"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "lintbase-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for LintBase — give AI coding agents real-time database schema context.",
5
+ "main": "dist/server.js",
6
+ "bin": {
7
+ "lintbase-mcp": "dist/server.js"
8
+ },
9
+ "files": [
10
+ "dist/**/*",
11
+ "README.md"
12
+ ],
13
+ "engines": {
14
+ "node": ">=18.0.0"
15
+ },
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "dev": "tsx src/server.ts",
19
+ "start": "node dist/server.js",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "keywords": [
23
+ "lintbase",
24
+ "mcp",
25
+ "model-context-protocol",
26
+ "firestore",
27
+ "database",
28
+ "schema",
29
+ "ai",
30
+ "cursor",
31
+ "claude"
32
+ ],
33
+ "author": "Mamadou Dia",
34
+ "license": "MIT",
35
+ "homepage": "https://lintbase.com",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "git+https://github.com/lintbase/lintbase.git"
39
+ },
40
+ "bugs": {
41
+ "url": "https://github.com/lintbase/lintbase/issues"
42
+ },
43
+ "dependencies": {
44
+ "@modelcontextprotocol/sdk": "^1.27.1",
45
+ "firebase-admin": "^12.0.0",
46
+ "zod": "^3.25.76"
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^20.0.0",
50
+ "tsx": "^4.7.0",
51
+ "typescript": "^5.3.0"
52
+ }
53
+ }