mcp-cost-tracker 1.0.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 (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +99 -0
  3. package/dist/dashboard/generator.d.ts +54 -0
  4. package/dist/dashboard/generator.d.ts.map +1 -0
  5. package/dist/dashboard/generator.js +577 -0
  6. package/dist/dashboard/generator.js.map +1 -0
  7. package/dist/index.d.ts +12 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +60 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/pricing/models.d.ts +48 -0
  12. package/dist/pricing/models.d.ts.map +1 -0
  13. package/dist/pricing/models.js +207 -0
  14. package/dist/pricing/models.js.map +1 -0
  15. package/dist/storage/database.d.ts +129 -0
  16. package/dist/storage/database.d.ts.map +1 -0
  17. package/dist/storage/database.js +374 -0
  18. package/dist/storage/database.js.map +1 -0
  19. package/dist/tools/index.d.ts +4 -0
  20. package/dist/tools/index.d.ts.map +1 -0
  21. package/dist/tools/index.js +660 -0
  22. package/dist/tools/index.js.map +1 -0
  23. package/dist/tools/prompts.d.ts +3 -0
  24. package/dist/tools/prompts.d.ts.map +1 -0
  25. package/dist/tools/prompts.js +111 -0
  26. package/dist/tools/prompts.js.map +1 -0
  27. package/dist/tools/resources.d.ts +4 -0
  28. package/dist/tools/resources.d.ts.map +1 -0
  29. package/dist/tools/resources.js +138 -0
  30. package/dist/tools/resources.js.map +1 -0
  31. package/dist/utils/helpers.d.ts +29 -0
  32. package/dist/utils/helpers.d.ts.map +1 -0
  33. package/dist/utils/helpers.js +81 -0
  34. package/dist/utils/helpers.js.map +1 -0
  35. package/package.json +52 -0
  36. package/src/dashboard/generator.ts +628 -0
  37. package/src/index.ts +73 -0
  38. package/src/pricing/models.ts +246 -0
  39. package/src/storage/database.ts +525 -0
  40. package/src/tools/index.ts +780 -0
  41. package/src/tools/prompts.ts +124 -0
  42. package/src/tools/resources.ts +171 -0
  43. package/src/utils/helpers.ts +71 -0
  44. package/tsconfig.json +20 -0
@@ -0,0 +1,374 @@
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.CostDatabase = void 0;
7
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const fs_1 = __importDefault(require("fs"));
11
+ class CostDatabase {
12
+ db;
13
+ constructor(dbPath) {
14
+ const defaultDir = path_1.default.join(os_1.default.homedir(), '.mcp-cost-tracker');
15
+ if (!fs_1.default.existsSync(defaultDir)) {
16
+ fs_1.default.mkdirSync(defaultDir, { recursive: true });
17
+ }
18
+ const finalPath = dbPath || path_1.default.join(defaultDir, 'costs.db');
19
+ this.db = new better_sqlite3_1.default(finalPath);
20
+ this.db.pragma('journal_mode = WAL');
21
+ this.db.pragma('foreign_keys = ON');
22
+ this.initialize();
23
+ }
24
+ initialize() {
25
+ this.db.exec(`
26
+ CREATE TABLE IF NOT EXISTS usage_records (
27
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
28
+ timestamp TEXT NOT NULL DEFAULT (datetime('now')),
29
+ provider TEXT NOT NULL,
30
+ model TEXT NOT NULL,
31
+ input_tokens INTEGER NOT NULL DEFAULT 0,
32
+ output_tokens INTEGER NOT NULL DEFAULT 0,
33
+ cached_input_tokens INTEGER NOT NULL DEFAULT 0,
34
+ total_tokens INTEGER NOT NULL DEFAULT 0,
35
+ input_cost REAL NOT NULL DEFAULT 0,
36
+ output_cost REAL NOT NULL DEFAULT 0,
37
+ cached_input_cost REAL NOT NULL DEFAULT 0,
38
+ total_cost REAL NOT NULL DEFAULT 0,
39
+ session_id TEXT DEFAULT '',
40
+ project TEXT DEFAULT 'default',
41
+ description TEXT DEFAULT '',
42
+ metadata TEXT DEFAULT '{}'
43
+ );
44
+
45
+ CREATE TABLE IF NOT EXISTS budgets (
46
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
47
+ name TEXT NOT NULL UNIQUE,
48
+ limit_amount REAL NOT NULL,
49
+ period TEXT NOT NULL DEFAULT 'monthly',
50
+ provider_filter TEXT DEFAULT '',
51
+ model_filter TEXT DEFAULT '',
52
+ project_filter TEXT DEFAULT '',
53
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
54
+ );
55
+
56
+ CREATE TABLE IF NOT EXISTS custom_pricing (
57
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
58
+ provider TEXT NOT NULL,
59
+ model TEXT NOT NULL,
60
+ input_price_per_mtok REAL NOT NULL,
61
+ output_price_per_mtok REAL NOT NULL,
62
+ cached_input_price_per_mtok REAL DEFAULT 0,
63
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
64
+ UNIQUE(provider, model)
65
+ );
66
+
67
+ CREATE INDEX IF NOT EXISTS idx_usage_timestamp ON usage_records(timestamp);
68
+ CREATE INDEX IF NOT EXISTS idx_usage_provider ON usage_records(provider);
69
+ CREATE INDEX IF NOT EXISTS idx_usage_model ON usage_records(model);
70
+ CREATE INDEX IF NOT EXISTS idx_usage_project ON usage_records(project);
71
+ CREATE INDEX IF NOT EXISTS idx_usage_session ON usage_records(session_id);
72
+ `);
73
+ }
74
+ // ============================================================
75
+ // Usage Records
76
+ // ============================================================
77
+ recordUsage(record) {
78
+ const stmt = this.db.prepare(`
79
+ INSERT INTO usage_records (
80
+ timestamp, provider, model, input_tokens, output_tokens,
81
+ cached_input_tokens, total_tokens, input_cost, output_cost,
82
+ cached_input_cost, total_cost, session_id, project, description, metadata
83
+ ) VALUES (
84
+ @timestamp, @provider, @model, @input_tokens, @output_tokens,
85
+ @cached_input_tokens, @total_tokens, @input_cost, @output_cost,
86
+ @cached_input_cost, @total_cost, @session_id, @project, @description, @metadata
87
+ )
88
+ `);
89
+ const result = stmt.run(record);
90
+ return { ...record, id: result.lastInsertRowid };
91
+ }
92
+ getUsageRecords(options = {}) {
93
+ let query = 'SELECT * FROM usage_records WHERE 1=1';
94
+ const params = {};
95
+ if (options.startDate) {
96
+ query += ' AND timestamp >= @startDate';
97
+ params.startDate = options.startDate;
98
+ }
99
+ if (options.endDate) {
100
+ query += ' AND timestamp <= @endDate';
101
+ params.endDate = options.endDate;
102
+ }
103
+ if (options.provider) {
104
+ query += ' AND provider = @provider';
105
+ params.provider = options.provider;
106
+ }
107
+ if (options.model) {
108
+ query += ' AND model = @model';
109
+ params.model = options.model;
110
+ }
111
+ if (options.project) {
112
+ query += ' AND project = @project';
113
+ params.project = options.project;
114
+ }
115
+ if (options.sessionId) {
116
+ query += ' AND session_id = @sessionId';
117
+ params.sessionId = options.sessionId;
118
+ }
119
+ query += ' ORDER BY timestamp DESC';
120
+ if (options.limit) {
121
+ query += ' LIMIT @limit';
122
+ params.limit = options.limit;
123
+ }
124
+ if (options.offset) {
125
+ query += ' OFFSET @offset';
126
+ params.offset = options.offset;
127
+ }
128
+ return this.db.prepare(query).all(params);
129
+ }
130
+ // ============================================================
131
+ // Aggregation Queries
132
+ // ============================================================
133
+ getSummary(options = {}) {
134
+ let query = `
135
+ SELECT
136
+ COALESCE(SUM(total_cost), 0) as total_cost,
137
+ COALESCE(SUM(input_tokens), 0) as total_input_tokens,
138
+ COALESCE(SUM(output_tokens), 0) as total_output_tokens,
139
+ COALESCE(SUM(cached_input_tokens), 0) as total_cached_tokens,
140
+ COUNT(*) as total_requests,
141
+ COALESCE(AVG(total_cost), 0) as avg_cost_per_request
142
+ FROM usage_records WHERE 1=1
143
+ `;
144
+ const params = {};
145
+ if (options.startDate) {
146
+ query += ' AND timestamp >= @startDate';
147
+ params.startDate = options.startDate;
148
+ }
149
+ if (options.endDate) {
150
+ query += ' AND timestamp <= @endDate';
151
+ params.endDate = options.endDate;
152
+ }
153
+ if (options.provider) {
154
+ query += ' AND provider = @provider';
155
+ params.provider = options.provider;
156
+ }
157
+ if (options.project) {
158
+ query += ' AND project = @project';
159
+ params.project = options.project;
160
+ }
161
+ return this.db.prepare(query).get(params);
162
+ }
163
+ getCostByModel(options = {}) {
164
+ let query = `
165
+ SELECT
166
+ provider,
167
+ model,
168
+ SUM(total_cost) as total_cost,
169
+ SUM(input_tokens) as total_input_tokens,
170
+ SUM(output_tokens) as total_output_tokens,
171
+ COUNT(*) as request_count
172
+ FROM usage_records WHERE 1=1
173
+ `;
174
+ const params = {};
175
+ if (options.startDate) {
176
+ query += ' AND timestamp >= @startDate';
177
+ params.startDate = options.startDate;
178
+ }
179
+ if (options.endDate) {
180
+ query += ' AND timestamp <= @endDate';
181
+ params.endDate = options.endDate;
182
+ }
183
+ if (options.project) {
184
+ query += ' AND project = @project';
185
+ params.project = options.project;
186
+ }
187
+ query += ' GROUP BY provider, model ORDER BY total_cost DESC';
188
+ return this.db.prepare(query).all(params);
189
+ }
190
+ getCostByProvider(options = {}) {
191
+ let query = `
192
+ SELECT
193
+ provider,
194
+ SUM(total_cost) as total_cost,
195
+ SUM(input_tokens) as total_input_tokens,
196
+ SUM(output_tokens) as total_output_tokens,
197
+ COUNT(*) as request_count
198
+ FROM usage_records WHERE 1=1
199
+ `;
200
+ const params = {};
201
+ if (options.startDate) {
202
+ query += ' AND timestamp >= @startDate';
203
+ params.startDate = options.startDate;
204
+ }
205
+ if (options.endDate) {
206
+ query += ' AND timestamp <= @endDate';
207
+ params.endDate = options.endDate;
208
+ }
209
+ query += ' GROUP BY provider ORDER BY total_cost DESC';
210
+ return this.db.prepare(query).all(params);
211
+ }
212
+ getCostByDay(options = {}) {
213
+ const days = options.days || 30;
214
+ let query = `
215
+ SELECT
216
+ DATE(timestamp) as date,
217
+ SUM(total_cost) as total_cost,
218
+ SUM(total_tokens) as total_tokens,
219
+ COUNT(*) as request_count
220
+ FROM usage_records
221
+ WHERE timestamp >= datetime('now', '-${days} days')
222
+ `;
223
+ const params = {};
224
+ if (options.startDate) {
225
+ query = query.replace(`timestamp >= datetime('now', '-${days} days')`, 'timestamp >= @startDate');
226
+ params.startDate = options.startDate;
227
+ }
228
+ if (options.endDate) {
229
+ query += ' AND timestamp <= @endDate';
230
+ params.endDate = options.endDate;
231
+ }
232
+ if (options.provider) {
233
+ query += ' AND provider = @provider';
234
+ params.provider = options.provider;
235
+ }
236
+ if (options.project) {
237
+ query += ' AND project = @project';
238
+ params.project = options.project;
239
+ }
240
+ query += ' GROUP BY DATE(timestamp) ORDER BY date ASC';
241
+ return this.db.prepare(query).all(params);
242
+ }
243
+ getCostByProject() {
244
+ return this.db.prepare(`
245
+ SELECT
246
+ project,
247
+ SUM(total_cost) as total_cost,
248
+ SUM(total_tokens) as total_tokens,
249
+ COUNT(*) as request_count
250
+ FROM usage_records
251
+ GROUP BY project
252
+ ORDER BY total_cost DESC
253
+ `).all();
254
+ }
255
+ getTopExpensiveRequests(limit = 10) {
256
+ return this.db.prepare(`
257
+ SELECT * FROM usage_records
258
+ ORDER BY total_cost DESC
259
+ LIMIT ?
260
+ `).all(limit);
261
+ }
262
+ // ============================================================
263
+ // Budget Management
264
+ // ============================================================
265
+ setBudget(budget) {
266
+ const stmt = this.db.prepare(`
267
+ INSERT OR REPLACE INTO budgets (name, limit_amount, period, provider_filter, model_filter, project_filter)
268
+ VALUES (@name, @limit_amount, @period, @provider_filter, @model_filter, @project_filter)
269
+ `);
270
+ stmt.run(budget);
271
+ return this.db.prepare('SELECT * FROM budgets WHERE name = ?').get(budget.name);
272
+ }
273
+ getBudgets() {
274
+ return this.db.prepare('SELECT * FROM budgets ORDER BY name').all();
275
+ }
276
+ deleteBudget(name) {
277
+ const result = this.db.prepare('DELETE FROM budgets WHERE name = ?').run(name);
278
+ return result.changes > 0;
279
+ }
280
+ checkBudget(budgetName) {
281
+ const budget = this.db.prepare('SELECT * FROM budgets WHERE name = ?').get(budgetName);
282
+ if (!budget)
283
+ return null;
284
+ let dateFilter = '';
285
+ switch (budget.period) {
286
+ case 'daily':
287
+ dateFilter = "AND timestamp >= datetime('now', 'start of day')";
288
+ break;
289
+ case 'weekly':
290
+ dateFilter = "AND timestamp >= datetime('now', '-7 days')";
291
+ break;
292
+ case 'monthly':
293
+ dateFilter = "AND timestamp >= datetime('now', 'start of month')";
294
+ break;
295
+ case 'total':
296
+ dateFilter = '';
297
+ break;
298
+ }
299
+ let providerFilter = '';
300
+ if (budget.provider_filter) {
301
+ providerFilter = ` AND provider = '${budget.provider_filter}'`;
302
+ }
303
+ let modelFilter = '';
304
+ if (budget.model_filter) {
305
+ modelFilter = ` AND model = '${budget.model_filter}'`;
306
+ }
307
+ let projectFilter = '';
308
+ if (budget.project_filter) {
309
+ projectFilter = ` AND project = '${budget.project_filter}'`;
310
+ }
311
+ const result = this.db.prepare(`
312
+ SELECT COALESCE(SUM(total_cost), 0) as spent
313
+ FROM usage_records
314
+ WHERE 1=1 ${dateFilter} ${providerFilter} ${modelFilter} ${projectFilter}
315
+ `).get();
316
+ const spent = result.spent;
317
+ const remaining = Math.max(0, budget.limit_amount - spent);
318
+ const percentage = budget.limit_amount > 0 ? (spent / budget.limit_amount) * 100 : 0;
319
+ return {
320
+ budget,
321
+ spent,
322
+ remaining,
323
+ percentage,
324
+ exceeded: spent >= budget.limit_amount,
325
+ };
326
+ }
327
+ // ============================================================
328
+ // Custom Pricing
329
+ // ============================================================
330
+ setCustomPricing(record) {
331
+ const stmt = this.db.prepare(`
332
+ INSERT OR REPLACE INTO custom_pricing (provider, model, input_price_per_mtok, output_price_per_mtok, cached_input_price_per_mtok)
333
+ VALUES (@provider, @model, @input_price_per_mtok, @output_price_per_mtok, @cached_input_price_per_mtok)
334
+ `);
335
+ stmt.run(record);
336
+ return this.db.prepare('SELECT * FROM custom_pricing WHERE provider = ? AND model = ?')
337
+ .get(record.provider, record.model);
338
+ }
339
+ getCustomPricing() {
340
+ return this.db.prepare('SELECT * FROM custom_pricing ORDER BY provider, model').all();
341
+ }
342
+ deleteCustomPricing(provider, model) {
343
+ const result = this.db.prepare('DELETE FROM custom_pricing WHERE provider = ? AND model = ?').run(provider, model);
344
+ return result.changes > 0;
345
+ }
346
+ // ============================================================
347
+ // Utility
348
+ // ============================================================
349
+ clearAllData() {
350
+ this.db.exec('DELETE FROM usage_records');
351
+ }
352
+ getStats() {
353
+ const count = this.db.prepare('SELECT COUNT(*) as count FROM usage_records').get();
354
+ const first = this.db.prepare('SELECT MIN(timestamp) as ts FROM usage_records').get();
355
+ const last = this.db.prepare('SELECT MAX(timestamp) as ts FROM usage_records').get();
356
+ const dbPath = this.db.name;
357
+ let dbSize = 0;
358
+ try {
359
+ dbSize = fs_1.default.statSync(dbPath).size;
360
+ }
361
+ catch { /* ignore */ }
362
+ return {
363
+ total_records: count.count,
364
+ first_record: first.ts,
365
+ last_record: last.ts,
366
+ db_size_bytes: dbSize,
367
+ };
368
+ }
369
+ close() {
370
+ this.db.close();
371
+ }
372
+ }
373
+ exports.CostDatabase = CostDatabase;
374
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { CostDatabase } from '../storage/database.js';
3
+ export declare function registerAllTools(server: McpServer, db: CostDatabase): void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAQtD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,GAAG,IAAI,CA0vB1E"}