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.
- package/LICENSE +21 -0
- package/README.md +99 -0
- package/dist/dashboard/generator.d.ts +54 -0
- package/dist/dashboard/generator.d.ts.map +1 -0
- package/dist/dashboard/generator.js +577 -0
- package/dist/dashboard/generator.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/pricing/models.d.ts +48 -0
- package/dist/pricing/models.d.ts.map +1 -0
- package/dist/pricing/models.js +207 -0
- package/dist/pricing/models.js.map +1 -0
- package/dist/storage/database.d.ts +129 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +374 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +660 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/prompts.d.ts +3 -0
- package/dist/tools/prompts.d.ts.map +1 -0
- package/dist/tools/prompts.js +111 -0
- package/dist/tools/prompts.js.map +1 -0
- package/dist/tools/resources.d.ts +4 -0
- package/dist/tools/resources.d.ts.map +1 -0
- package/dist/tools/resources.js +138 -0
- package/dist/tools/resources.js.map +1 -0
- package/dist/utils/helpers.d.ts +29 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +81 -0
- package/dist/utils/helpers.js.map +1 -0
- package/package.json +52 -0
- package/src/dashboard/generator.ts +628 -0
- package/src/index.ts +73 -0
- package/src/pricing/models.ts +246 -0
- package/src/storage/database.ts +525 -0
- package/src/tools/index.ts +780 -0
- package/src/tools/prompts.ts +124 -0
- package/src/tools/resources.ts +171 -0
- package/src/utils/helpers.ts +71 -0
- 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 @@
|
|
|
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"}
|