@f3d1/llmkit-mcp-server 0.0.1

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.
@@ -0,0 +1,44 @@
1
+ interface Config {
2
+ supabaseUrl: string;
3
+ supabaseKey: string;
4
+ userId: string;
5
+ proxyUrl?: string;
6
+ }
7
+ export declare function loadConfig(): Config;
8
+ interface RequestRow {
9
+ id: string;
10
+ api_key_id: string;
11
+ session_id: string | null;
12
+ provider: string;
13
+ model: string;
14
+ input_tokens: number;
15
+ output_tokens: number;
16
+ cache_read_tokens: number;
17
+ cache_write_tokens: number;
18
+ cost_cents: number;
19
+ latency_ms: number;
20
+ status: string;
21
+ error_code: string | null;
22
+ created_at: string;
23
+ }
24
+ interface ApiKeyRow {
25
+ id: string;
26
+ name: string;
27
+ key_prefix: string;
28
+ budget_id: string | null;
29
+ created_at: string;
30
+ revoked_at: string | null;
31
+ }
32
+ interface BudgetRow {
33
+ id: string;
34
+ name: string;
35
+ limit_cents: number;
36
+ period: string;
37
+ created_at: string;
38
+ }
39
+ export declare function getUserKeyIds(): Promise<string[]>;
40
+ export declare function getRequests(days: number, limit?: number): Promise<RequestRow[]>;
41
+ export declare function getApiKeys(): Promise<ApiKeyRow[]>;
42
+ export declare function getBudgets(): Promise<BudgetRow[]>;
43
+ export {};
44
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAIA,UAAU,MAAM;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,UAAU,IAAI,MAAM,CAqBnC;AAqBD,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAMvD;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAQnF;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAKvD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAKvD"}
package/dist/client.js ADDED
@@ -0,0 +1,56 @@
1
+ // PostgREST client for Supabase - same pattern as proxy/src/db.ts
2
+ // No @supabase/supabase-js dependency. Raw fetch keeps the package tiny
3
+ // and startup instant (MCP servers need to boot in <500ms).
4
+ let cachedConfig = null;
5
+ export function loadConfig() {
6
+ if (cachedConfig)
7
+ return cachedConfig;
8
+ const supabaseUrl = process.env.LLMKIT_SUPABASE_URL;
9
+ const supabaseKey = process.env.LLMKIT_SUPABASE_KEY;
10
+ const userId = process.env.LLMKIT_USER_ID;
11
+ if (!supabaseUrl || !supabaseKey || !userId) {
12
+ throw new Error('Missing env vars. Set LLMKIT_SUPABASE_URL, LLMKIT_SUPABASE_KEY, and LLMKIT_USER_ID.');
13
+ }
14
+ cachedConfig = {
15
+ supabaseUrl,
16
+ supabaseKey,
17
+ userId,
18
+ proxyUrl: process.env.LLMKIT_PROXY_URL,
19
+ };
20
+ return cachedConfig;
21
+ }
22
+ async function query(path) {
23
+ const { supabaseUrl, supabaseKey } = loadConfig();
24
+ const res = await fetch(`${supabaseUrl}/rest/v1/${path}`, {
25
+ headers: {
26
+ 'apikey': supabaseKey,
27
+ 'Authorization': `Bearer ${supabaseKey}`,
28
+ },
29
+ });
30
+ if (!res.ok) {
31
+ throw new Error(`Supabase query failed (${res.status}): ${path}`);
32
+ }
33
+ return res.json();
34
+ }
35
+ export async function getUserKeyIds() {
36
+ const { userId } = loadConfig();
37
+ const keys = await query(`api_keys?user_id=eq.${userId}&select=id`);
38
+ return keys.map((k) => k.id);
39
+ }
40
+ export async function getRequests(days, limit = 5000) {
41
+ const keyIds = await getUserKeyIds();
42
+ if (!keyIds.length)
43
+ return [];
44
+ const cutoff = new Date(Date.now() - days * 86400000).toISOString();
45
+ const filter = `api_key_id=in.(${keyIds.join(',')})&created_at=gte.${cutoff}&order=created_at.desc&limit=${limit}`;
46
+ return query(`requests?${filter}&select=*`);
47
+ }
48
+ export async function getApiKeys() {
49
+ const { userId } = loadConfig();
50
+ return query(`api_keys?user_id=eq.${userId}&order=created_at.desc&select=id,name,key_prefix,budget_id,created_at,revoked_at`);
51
+ }
52
+ export async function getBudgets() {
53
+ const { userId } = loadConfig();
54
+ return query(`budgets?user_id=eq.${userId}&order=created_at.desc&select=id,name,limit_cents,period,created_at`);
55
+ }
56
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,wEAAwE;AACxE,4DAA4D;AAS5D,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,MAAM,UAAU,UAAU;IACxB,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IAEtC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACpD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAE1C,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAC;IACJ,CAAC;IAED,YAAY,GAAG;QACb,WAAW;QACX,WAAW;QACX,MAAM;QACN,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;KACvC,CAAC;IAEF,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,KAAK,CAAI,IAAY;IAClC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,UAAU,EAAE,CAAC;IAElD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,YAAY,IAAI,EAAE,EAAE;QACxD,OAAO,EAAE;YACP,QAAQ,EAAE,WAAW;YACrB,eAAe,EAAE,UAAU,WAAW,EAAE;SACzC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,EAAkB,CAAC;AACpC,CAAC;AAsCD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,MAAM,KAAK,CACtB,uBAAuB,MAAM,YAAY,CAC1C,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,KAAK,GAAG,IAAI;IAC1D,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAE9B,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACpE,MAAM,MAAM,GAAG,kBAAkB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,MAAM,gCAAgC,KAAK,EAAE,CAAC;IAEnH,OAAO,KAAK,CAAa,YAAY,MAAM,WAAW,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IAChC,OAAO,KAAK,CACV,uBAAuB,MAAM,kFAAkF,CAChH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IAChC,OAAO,KAAK,CACV,sBAAsB,MAAM,qEAAqE,CAClG,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { startServer } from './server.js';
3
+ startServer().catch((err) => {
4
+ console.error('llmkit mcp server failed to start:', err);
5
+ process.exit(1);
6
+ });
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC1B,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function startServer(): Promise<void>;
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAcjD"}
package/dist/server.js ADDED
@@ -0,0 +1,14 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { registerTools } from './tools.js';
4
+ export async function startServer() {
5
+ // Server constructor takes: identity + capabilities
6
+ // capabilities.tools = {} means "I expose tools" (no extra config needed)
7
+ const server = new Server({ name: 'llmkit', version: '0.0.1' }, { capabilities: { tools: {} } });
8
+ registerTools(server);
9
+ // stdio transport: reads JSON-RPC from stdin, writes to stdout
10
+ // this is the standard transport for CLI-spawned MCP servers
11
+ const transport = new StdioServerTransport();
12
+ await server.connect(transport);
13
+ }
14
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,oDAAoD;IACpD,0EAA0E;IAC1E,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EACpC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;IAEF,aAAa,CAAC,MAAM,CAAC,CAAC;IAEtB,+DAA+D;IAC/D,6DAA6D;IAC7D,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ export declare function registerTools(server: Server): void;
3
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AA2ExE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAwBlD"}
package/dist/tools.js ADDED
@@ -0,0 +1,267 @@
1
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
2
+ import { getApiKeys, getBudgets, getRequests, loadConfig } from './client.js';
3
+ // tool definitions - this is what Claude Code sees when it inspects available tools
4
+ const TOOLS = [
5
+ {
6
+ name: 'llmkit_usage_stats',
7
+ description: 'Get usage statistics for your LLMKit account (spend, requests, top models)',
8
+ inputSchema: {
9
+ type: 'object',
10
+ properties: {
11
+ period: {
12
+ type: 'string',
13
+ enum: ['today', 'week', 'month'],
14
+ description: 'Time period to query',
15
+ default: 'month',
16
+ },
17
+ },
18
+ },
19
+ },
20
+ {
21
+ name: 'llmkit_cost_query',
22
+ description: 'Query cost breakdown by provider, model, session, or day',
23
+ inputSchema: {
24
+ type: 'object',
25
+ properties: {
26
+ groupBy: {
27
+ type: 'string',
28
+ enum: ['provider', 'model', 'session', 'day'],
29
+ description: 'How to group the results',
30
+ },
31
+ days: { type: 'number', description: 'Number of days to look back (default 30)' },
32
+ provider: { type: 'string', description: 'Filter by provider name' },
33
+ model: { type: 'string', description: 'Filter by model name' },
34
+ },
35
+ required: ['groupBy'],
36
+ },
37
+ },
38
+ {
39
+ name: 'llmkit_list_keys',
40
+ description: 'List all API keys for the account',
41
+ inputSchema: { type: 'object', properties: {} },
42
+ },
43
+ {
44
+ name: 'llmkit_budget_status',
45
+ description: 'Check budget usage and remaining balance',
46
+ inputSchema: {
47
+ type: 'object',
48
+ properties: {
49
+ budgetId: { type: 'string', description: 'Specific budget ID, or omit for all budgets' },
50
+ },
51
+ },
52
+ },
53
+ {
54
+ name: 'llmkit_health',
55
+ description: 'Check LLMKit proxy health',
56
+ inputSchema: { type: 'object', properties: {} },
57
+ },
58
+ {
59
+ name: 'llmkit_session_summary',
60
+ description: 'Get summary of recent sessions or a specific session',
61
+ inputSchema: {
62
+ type: 'object',
63
+ properties: {
64
+ sessionId: { type: 'string', description: 'Specific session ID to query' },
65
+ limit: { type: 'number', description: 'Number of recent sessions (default 10)' },
66
+ },
67
+ },
68
+ },
69
+ ];
70
+ export function registerTools(server) {
71
+ // when Claude Code asks "what tools do you have?", return the list above
72
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
73
+ // when Claude Code calls a tool, route to the right handler
74
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
75
+ const { name, arguments: args } = request.params;
76
+ try {
77
+ switch (name) {
78
+ case 'llmkit_usage_stats': return await handleUsageStats(args);
79
+ case 'llmkit_cost_query': return await handleCostQuery(args);
80
+ case 'llmkit_list_keys': return await handleListKeys();
81
+ case 'llmkit_budget_status': return await handleBudgetStatus(args);
82
+ case 'llmkit_health': return await handleHealth();
83
+ case 'llmkit_session_summary': return await handleSessionSummary(args);
84
+ default:
85
+ return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };
86
+ }
87
+ }
88
+ catch (err) {
89
+ const msg = err instanceof Error ? err.message : String(err);
90
+ return { content: [{ type: 'text', text: `Error: ${msg}` }], isError: true };
91
+ }
92
+ });
93
+ }
94
+ function text(content) {
95
+ return { content: [{ type: 'text', text: content }] };
96
+ }
97
+ // ---- Tool handlers ----
98
+ async function handleUsageStats(args) {
99
+ const period = args?.period || 'month';
100
+ const days = period === 'today' ? 1 : period === 'week' ? 7 : 30;
101
+ const requests = await getRequests(days);
102
+ let totalCostCents = 0;
103
+ let totalInputTokens = 0;
104
+ let totalOutputTokens = 0;
105
+ let totalCacheReadTokens = 0;
106
+ const modelCounts = new Map();
107
+ for (const req of requests) {
108
+ totalCostCents += Number(req.cost_cents);
109
+ totalInputTokens += req.input_tokens;
110
+ totalOutputTokens += req.output_tokens;
111
+ totalCacheReadTokens += req.cache_read_tokens;
112
+ modelCounts.set(req.model, (modelCounts.get(req.model) || 0) + 1);
113
+ }
114
+ const topModels = [...modelCounts.entries()]
115
+ .sort((a, b) => b[1] - a[1])
116
+ .slice(0, 5)
117
+ .map(([model, count]) => ` ${model}: ${count} requests`);
118
+ const cacheHitRate = totalInputTokens > 0
119
+ ? ((totalCacheReadTokens / (totalCacheReadTokens + totalInputTokens)) * 100).toFixed(1)
120
+ : '0.0';
121
+ return text([
122
+ `LLMKit Usage (${period})`,
123
+ `─────────────────────────`,
124
+ `Requests: ${requests.length}`,
125
+ `Total spend: $${(totalCostCents / 100).toFixed(2)}`,
126
+ `Input tokens: ${totalInputTokens.toLocaleString()}`,
127
+ `Output tokens: ${totalOutputTokens.toLocaleString()}`,
128
+ `Cache read tokens: ${totalCacheReadTokens.toLocaleString()}`,
129
+ `Cache hit rate: ${cacheHitRate}%`,
130
+ ``,
131
+ `Top models:`,
132
+ ...topModels,
133
+ ].join('\n'));
134
+ }
135
+ async function handleCostQuery(args) {
136
+ const groupBy = args?.groupBy || 'provider';
137
+ const days = args?.days || 30;
138
+ const filterProvider = args?.provider;
139
+ const filterModel = args?.model;
140
+ let requests = await getRequests(days);
141
+ if (filterProvider)
142
+ requests = requests.filter((r) => r.provider === filterProvider);
143
+ if (filterModel)
144
+ requests = requests.filter((r) => r.model === filterModel);
145
+ const groups = new Map();
146
+ for (const req of requests) {
147
+ let key;
148
+ switch (groupBy) {
149
+ case 'provider':
150
+ key = req.provider;
151
+ break;
152
+ case 'model':
153
+ key = req.model;
154
+ break;
155
+ case 'session':
156
+ key = req.session_id || 'no-session';
157
+ break;
158
+ case 'day':
159
+ key = req.created_at.slice(0, 10);
160
+ break;
161
+ default: key = req.provider;
162
+ }
163
+ const g = groups.get(key) || { count: 0, costCents: 0, inputTokens: 0, outputTokens: 0 };
164
+ g.count++;
165
+ g.costCents += Number(req.cost_cents);
166
+ g.inputTokens += req.input_tokens;
167
+ g.outputTokens += req.output_tokens;
168
+ groups.set(key, g);
169
+ }
170
+ const sorted = [...groups.entries()].sort((a, b) => b[1].costCents - a[1].costCents);
171
+ const lines = [`Cost breakdown by ${groupBy} (${days}d)`, `─────────────────────────`];
172
+ for (const [key, g] of sorted) {
173
+ lines.push(`${key}: $${(g.costCents / 100).toFixed(2)} (${g.count} reqs, ${g.inputTokens.toLocaleString()} in / ${g.outputTokens.toLocaleString()} out)`);
174
+ }
175
+ return text(lines.join('\n'));
176
+ }
177
+ async function handleListKeys() {
178
+ const keys = await getApiKeys();
179
+ if (!keys.length)
180
+ return text('No API keys found.');
181
+ const lines = ['API Keys', '─────────────────────────'];
182
+ for (const k of keys) {
183
+ const status = k.revoked_at ? 'REVOKED' : 'ACTIVE';
184
+ const created = k.created_at.slice(0, 10);
185
+ lines.push(`${k.name} (${k.key_prefix}...) - ${status} - created ${created}`);
186
+ }
187
+ return text(lines.join('\n'));
188
+ }
189
+ async function handleBudgetStatus(args) {
190
+ const budgetId = args?.budgetId;
191
+ const budgets = await getBudgets();
192
+ if (!budgets.length)
193
+ return text('No budgets configured.');
194
+ const filtered = budgetId ? budgets.filter((b) => b.id === budgetId) : budgets;
195
+ if (!filtered.length)
196
+ return text(`Budget ${budgetId} not found.`);
197
+ // compute used amounts from requests
198
+ const requests = await getRequests(30);
199
+ const spendByKey = new Map();
200
+ for (const req of requests) {
201
+ spendByKey.set(req.api_key_id, (spendByKey.get(req.api_key_id) || 0) + Number(req.cost_cents));
202
+ }
203
+ const lines = ['Budget Status', '─────────────────────────'];
204
+ for (const b of filtered) {
205
+ // rough: total spend as a proxy for budget usage (real usage tracked in KV)
206
+ const totalSpend = [...spendByKey.values()].reduce((a, c) => a + c, 0);
207
+ const pct = b.limit_cents > 0 ? Math.round((totalSpend / b.limit_cents) * 100) : 0;
208
+ const remaining = Math.max(0, b.limit_cents - totalSpend);
209
+ lines.push(`${b.name}: $${(totalSpend / 100).toFixed(2)} / $${(b.limit_cents / 100).toFixed(2)} (${pct}%) - $${(remaining / 100).toFixed(2)} remaining - ${b.period}`);
210
+ }
211
+ return text(lines.join('\n'));
212
+ }
213
+ async function handleHealth() {
214
+ const config = loadConfig();
215
+ const proxyUrl = config.proxyUrl;
216
+ if (!proxyUrl) {
217
+ return text('LLMKIT_PROXY_URL not configured. Cannot check proxy health.');
218
+ }
219
+ try {
220
+ const res = await fetch(`${proxyUrl}/health`, { signal: AbortSignal.timeout(5000) });
221
+ const body = await res.text();
222
+ return text(`Proxy health: ${res.status === 200 ? 'OK' : 'DEGRADED'}\nResponse: ${body}`);
223
+ }
224
+ catch (err) {
225
+ const msg = err instanceof Error ? err.message : String(err);
226
+ return text(`Proxy health: UNREACHABLE\nError: ${msg}`);
227
+ }
228
+ }
229
+ async function handleSessionSummary(args) {
230
+ const sessionId = args?.sessionId;
231
+ const limit = args?.limit || 10;
232
+ const requests = await getRequests(30);
233
+ const sessions = new Map();
234
+ for (const req of requests) {
235
+ const sid = req.session_id || 'no-session';
236
+ if (sessionId && sid !== sessionId)
237
+ continue;
238
+ const s = sessions.get(sid) || {
239
+ count: 0, costCents: 0,
240
+ providers: new Set(), models: new Set(),
241
+ first: req.created_at, last: req.created_at,
242
+ };
243
+ s.count++;
244
+ s.costCents += Number(req.cost_cents);
245
+ s.providers.add(req.provider);
246
+ s.models.add(req.model);
247
+ if (req.created_at < s.first)
248
+ s.first = req.created_at;
249
+ if (req.created_at > s.last)
250
+ s.last = req.created_at;
251
+ sessions.set(sid, s);
252
+ }
253
+ if (!sessions.size) {
254
+ return text(sessionId ? `Session ${sessionId} not found.` : 'No sessions found.');
255
+ }
256
+ const sorted = [...sessions.entries()]
257
+ .sort((a, b) => b[1].last.localeCompare(a[1].last))
258
+ .slice(0, sessionId ? 1 : limit);
259
+ const lines = ['Sessions', '─────────────────────────'];
260
+ for (const [sid, s] of sorted) {
261
+ const duration = new Date(s.last).getTime() - new Date(s.first).getTime();
262
+ const durStr = duration < 60000 ? `${Math.round(duration / 1000)}s` : `${Math.round(duration / 60000)}m`;
263
+ lines.push(`${sid}: ${s.count} reqs, $${(s.costCents / 100).toFixed(2)}, ${durStr}, ${[...s.providers].join('+')} / ${[...s.models].join(', ')}`);
264
+ }
265
+ return text(lines.join('\n'));
266
+ }
267
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@f3d1/llmkit-mcp-server",
3
+ "version": "0.0.1",
4
+ "license": "MIT",
5
+ "description": "MCP server for LLMKit - cost queries, session summaries, budget monitoring via Claude Code and Cursor",
6
+ "type": "module",
7
+ "bin": {
8
+ "llmkit-mcp": "./dist/index.js"
9
+ },
10
+ "main": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js"
16
+ }
17
+ },
18
+ "files": ["dist"],
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "dev": "tsc --watch",
22
+ "typecheck": "tsc --noEmit",
23
+ "clean": "rm -rf dist"
24
+ },
25
+ "dependencies": {
26
+ "@f3d1/llmkit-shared": "workspace:*",
27
+ "@modelcontextprotocol/sdk": "^1.12.0"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^22.0.0"
31
+ }
32
+ }