observability-toolkit 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/README.md +107 -0
- package/dist/backends/index.d.ts +72 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +5 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/local-jsonl.d.ts +21 -0
- package/dist/backends/local-jsonl.d.ts.map +1 -0
- package/dist/backends/local-jsonl.js +281 -0
- package/dist/backends/local-jsonl.js.map +1 -0
- package/dist/backends/signoz-api.d.ts +28 -0
- package/dist/backends/signoz-api.d.ts.map +1 -0
- package/dist/backends/signoz-api.js +293 -0
- package/dist/backends/signoz-api.js.map +1 -0
- package/dist/lib/constants.d.ts +21 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +30 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/file-utils.d.ts +38 -0
- package/dist/lib/file-utils.d.ts.map +1 -0
- package/dist/lib/file-utils.js +129 -0
- package/dist/lib/file-utils.js.map +1 -0
- package/dist/server.d.ts +11 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +140 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/context-stats.d.ts +81 -0
- package/dist/tools/context-stats.d.ts.map +1 -0
- package/dist/tools/context-stats.js +213 -0
- package/dist/tools/context-stats.js.map +1 -0
- package/dist/tools/get-trace-url.d.ts +36 -0
- package/dist/tools/get-trace-url.d.ts.map +1 -0
- package/dist/tools/get-trace-url.js +43 -0
- package/dist/tools/get-trace-url.js.map +1 -0
- package/dist/tools/health-check.d.ts +50 -0
- package/dist/tools/health-check.d.ts.map +1 -0
- package/dist/tools/health-check.js +109 -0
- package/dist/tools/health-check.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +10 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/query-logs.d.ts +82 -0
- package/dist/tools/query-logs.d.ts.map +1 -0
- package/dist/tools/query-logs.js +86 -0
- package/dist/tools/query-logs.js.map +1 -0
- package/dist/tools/query-metrics.d.ts +96 -0
- package/dist/tools/query-metrics.d.ts.map +1 -0
- package/dist/tools/query-metrics.js +85 -0
- package/dist/tools/query-metrics.js.map +1 -0
- package/dist/tools/query-traces.d.ts +95 -0
- package/dist/tools/query-traces.d.ts.map +1 -0
- package/dist/tools/query-traces.js +83 -0
- package/dist/tools/query-traces.js.map +1 -0
- package/package.json +43 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Observability Toolkit MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Provides tools for querying traces, metrics, and logs from local JSONL files
|
|
6
|
+
* or SigNoz Cloud for Claude Code sessions.
|
|
7
|
+
*
|
|
8
|
+
* Install: claude mcp add observability-toolkit -- npx -y @alyshia/observability-toolkit
|
|
9
|
+
*/
|
|
10
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
11
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
12
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
13
|
+
import { queryTracesTool, queryMetricsTool, queryLogsTool, healthCheckTool, contextStatsTool, getTraceUrlTool, } from './tools/index.js';
|
|
14
|
+
// Tool definitions
|
|
15
|
+
const tools = [
|
|
16
|
+
queryTracesTool,
|
|
17
|
+
queryMetricsTool,
|
|
18
|
+
queryLogsTool,
|
|
19
|
+
healthCheckTool,
|
|
20
|
+
contextStatsTool,
|
|
21
|
+
getTraceUrlTool,
|
|
22
|
+
];
|
|
23
|
+
// Convert Zod schema to JSON Schema for MCP
|
|
24
|
+
function zodToJsonSchema(zodSchema) {
|
|
25
|
+
const shape = zodSchema.shape || {};
|
|
26
|
+
const properties = {};
|
|
27
|
+
const required = [];
|
|
28
|
+
for (const [key, value] of Object.entries(shape)) {
|
|
29
|
+
const field = value;
|
|
30
|
+
const def = field._def;
|
|
31
|
+
if (!def)
|
|
32
|
+
continue;
|
|
33
|
+
let type = 'string';
|
|
34
|
+
let enumValues;
|
|
35
|
+
// Handle optional/default wrappers
|
|
36
|
+
let innerDef = def;
|
|
37
|
+
let isOptional = false;
|
|
38
|
+
let hasDefault = false;
|
|
39
|
+
while (innerDef.typeName === 'ZodDefault' || innerDef.typeName === 'ZodOptional') {
|
|
40
|
+
if (innerDef.typeName === 'ZodDefault')
|
|
41
|
+
hasDefault = true;
|
|
42
|
+
if (innerDef.typeName === 'ZodOptional')
|
|
43
|
+
isOptional = true;
|
|
44
|
+
innerDef = innerDef.innerType?._def || innerDef;
|
|
45
|
+
}
|
|
46
|
+
// Map Zod types to JSON Schema types
|
|
47
|
+
switch (innerDef.typeName) {
|
|
48
|
+
case 'ZodString':
|
|
49
|
+
type = 'string';
|
|
50
|
+
break;
|
|
51
|
+
case 'ZodNumber':
|
|
52
|
+
type = 'number';
|
|
53
|
+
break;
|
|
54
|
+
case 'ZodBoolean':
|
|
55
|
+
type = 'boolean';
|
|
56
|
+
break;
|
|
57
|
+
case 'ZodEnum':
|
|
58
|
+
type = 'string';
|
|
59
|
+
enumValues = innerDef.values;
|
|
60
|
+
break;
|
|
61
|
+
case 'ZodArray':
|
|
62
|
+
type = 'array';
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
const propSchema = { type };
|
|
66
|
+
if (def.description)
|
|
67
|
+
propSchema.description = def.description;
|
|
68
|
+
if (enumValues)
|
|
69
|
+
propSchema.enum = enumValues;
|
|
70
|
+
if (hasDefault && def.defaultValue) {
|
|
71
|
+
propSchema.default = def.defaultValue();
|
|
72
|
+
}
|
|
73
|
+
properties[key] = propSchema;
|
|
74
|
+
if (!isOptional && !hasDefault) {
|
|
75
|
+
required.push(key);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
type: 'object',
|
|
80
|
+
properties,
|
|
81
|
+
required: required.length > 0 ? required : undefined,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
async function main() {
|
|
85
|
+
const server = new Server({
|
|
86
|
+
name: 'observability-toolkit',
|
|
87
|
+
version: '1.0.0',
|
|
88
|
+
}, {
|
|
89
|
+
capabilities: {
|
|
90
|
+
tools: {},
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
// List available tools
|
|
94
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
95
|
+
return {
|
|
96
|
+
tools: tools.map(tool => ({
|
|
97
|
+
name: tool.name,
|
|
98
|
+
description: tool.description,
|
|
99
|
+
inputSchema: zodToJsonSchema(tool.inputSchema),
|
|
100
|
+
})),
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
// Handle tool calls
|
|
104
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
105
|
+
const { name, arguments: args } = request.params;
|
|
106
|
+
const tool = tools.find(t => t.name === name);
|
|
107
|
+
if (!tool) {
|
|
108
|
+
return {
|
|
109
|
+
content: [{ type: 'text', text: `Unknown tool: ${name}` }],
|
|
110
|
+
isError: true,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
// Parse and validate input
|
|
115
|
+
const input = tool.inputSchema.parse(args || {});
|
|
116
|
+
// Execute handler - use type assertion since we've validated input
|
|
117
|
+
const result = await tool.handler(input);
|
|
118
|
+
return {
|
|
119
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
124
|
+
return {
|
|
125
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
126
|
+
isError: true,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
// Connect via stdio
|
|
131
|
+
const transport = new StdioServerTransport();
|
|
132
|
+
await server.connect(transport);
|
|
133
|
+
// Log startup to stderr (stdout is for MCP protocol)
|
|
134
|
+
console.error('Observability Toolkit MCP server started');
|
|
135
|
+
}
|
|
136
|
+
main().catch((error) => {
|
|
137
|
+
console.error('Fatal error:', error);
|
|
138
|
+
process.exit(1);
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context window utilization statistics
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
export declare const contextStatsSchema: z.ZodObject<{
|
|
6
|
+
sessionId: z.ZodOptional<z.ZodString>;
|
|
7
|
+
includeBreakdown: z.ZodDefault<z.ZodBoolean>;
|
|
8
|
+
includeCost: z.ZodDefault<z.ZodBoolean>;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
includeBreakdown: boolean;
|
|
11
|
+
includeCost: boolean;
|
|
12
|
+
sessionId?: string | undefined;
|
|
13
|
+
}, {
|
|
14
|
+
sessionId?: string | undefined;
|
|
15
|
+
includeBreakdown?: boolean | undefined;
|
|
16
|
+
includeCost?: boolean | undefined;
|
|
17
|
+
}>;
|
|
18
|
+
export type ContextStatsInput = z.infer<typeof contextStatsSchema>;
|
|
19
|
+
export declare function contextStats(input: ContextStatsInput): Promise<{
|
|
20
|
+
sessionId: string;
|
|
21
|
+
project: string;
|
|
22
|
+
model?: string;
|
|
23
|
+
context: {
|
|
24
|
+
totalTokens: number;
|
|
25
|
+
utilization: string;
|
|
26
|
+
freeSpace: number;
|
|
27
|
+
freeSpacePercent: string;
|
|
28
|
+
};
|
|
29
|
+
tokens: {
|
|
30
|
+
input: number;
|
|
31
|
+
output: number;
|
|
32
|
+
cacheRead: number;
|
|
33
|
+
cacheCreation: number;
|
|
34
|
+
};
|
|
35
|
+
messages: number;
|
|
36
|
+
cost?: {
|
|
37
|
+
input: string;
|
|
38
|
+
output: string;
|
|
39
|
+
total: string;
|
|
40
|
+
};
|
|
41
|
+
breakdown?: {
|
|
42
|
+
systemPrompt: number;
|
|
43
|
+
systemTools: number;
|
|
44
|
+
messages: number;
|
|
45
|
+
other: number;
|
|
46
|
+
};
|
|
47
|
+
history?: {
|
|
48
|
+
totalSessions: number;
|
|
49
|
+
avgUtilization: number;
|
|
50
|
+
recentDays: Array<{
|
|
51
|
+
date: string;
|
|
52
|
+
avgTokens: number;
|
|
53
|
+
sessionCount: number;
|
|
54
|
+
}>;
|
|
55
|
+
};
|
|
56
|
+
} | {
|
|
57
|
+
error: string;
|
|
58
|
+
sessionId?: undefined;
|
|
59
|
+
} | {
|
|
60
|
+
sessionId: string;
|
|
61
|
+
error: string;
|
|
62
|
+
}>;
|
|
63
|
+
export declare const contextStatsTool: {
|
|
64
|
+
name: string;
|
|
65
|
+
description: string;
|
|
66
|
+
inputSchema: z.ZodObject<{
|
|
67
|
+
sessionId: z.ZodOptional<z.ZodString>;
|
|
68
|
+
includeBreakdown: z.ZodDefault<z.ZodBoolean>;
|
|
69
|
+
includeCost: z.ZodDefault<z.ZodBoolean>;
|
|
70
|
+
}, "strip", z.ZodTypeAny, {
|
|
71
|
+
includeBreakdown: boolean;
|
|
72
|
+
includeCost: boolean;
|
|
73
|
+
sessionId?: string | undefined;
|
|
74
|
+
}, {
|
|
75
|
+
sessionId?: string | undefined;
|
|
76
|
+
includeBreakdown?: boolean | undefined;
|
|
77
|
+
includeCost?: boolean | undefined;
|
|
78
|
+
}>;
|
|
79
|
+
handler: typeof contextStats;
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=context-stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-stats.d.ts","sourceRoot":"","sources":["../../src/tools/context-stats.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAsJnE,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB;eAoC5C,MAAM;aACR,MAAM;YACP,MAAM;aACL;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;KAC1B;YACO;QACN,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACvB;cACS,MAAM;WACT;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;gBAC3C;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf;cACS;QACR,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC9E;;;;;;;GA+DJ;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;CAK5B,CAAC"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context window utilization statistics
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'fs';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { CLAUDE_HOME, CONTEXT_WINDOW_SIZE, MODEL_PRICING } from '../lib/constants.js';
|
|
8
|
+
import { loadJsonSafe } from '../lib/file-utils.js';
|
|
9
|
+
export const contextStatsSchema = z.object({
|
|
10
|
+
sessionId: z.string().optional().describe('Specific session ID to analyze (defaults to most recent)'),
|
|
11
|
+
includeBreakdown: z.boolean().default(true).describe('Include token breakdown by category'),
|
|
12
|
+
includeCost: z.boolean().default(true).describe('Include cost estimation'),
|
|
13
|
+
});
|
|
14
|
+
/**
|
|
15
|
+
* Find most recent session file
|
|
16
|
+
*/
|
|
17
|
+
function findRecentSession() {
|
|
18
|
+
const projectsDir = join(CLAUDE_HOME, 'projects');
|
|
19
|
+
if (!existsSync(projectsDir))
|
|
20
|
+
return null;
|
|
21
|
+
let mostRecent = null;
|
|
22
|
+
try {
|
|
23
|
+
const projectDirs = readdirSync(projectsDir);
|
|
24
|
+
for (const project of projectDirs) {
|
|
25
|
+
const projectPath = join(projectsDir, project);
|
|
26
|
+
const stat = statSync(projectPath);
|
|
27
|
+
if (!stat.isDirectory())
|
|
28
|
+
continue;
|
|
29
|
+
const sessions = readdirSync(projectPath).filter(f => f.endsWith('.jsonl'));
|
|
30
|
+
for (const session of sessions) {
|
|
31
|
+
const filePath = join(projectPath, session);
|
|
32
|
+
const sessionStat = statSync(filePath);
|
|
33
|
+
if (!mostRecent || sessionStat.mtime.getTime() > mostRecent.mtime) {
|
|
34
|
+
mostRecent = {
|
|
35
|
+
sessionId: session.replace('.jsonl', ''),
|
|
36
|
+
projectDir: project,
|
|
37
|
+
filePath,
|
|
38
|
+
mtime: sessionStat.mtime.getTime(),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
return mostRecent ? { sessionId: mostRecent.sessionId, projectDir: mostRecent.projectDir, filePath: mostRecent.filePath } : null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Parse session file for usage data
|
|
51
|
+
*/
|
|
52
|
+
function parseSessionUsage(filePath) {
|
|
53
|
+
if (!existsSync(filePath))
|
|
54
|
+
return null;
|
|
55
|
+
try {
|
|
56
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
57
|
+
const lines = content.trim().split('\n');
|
|
58
|
+
let latestUsage = null;
|
|
59
|
+
let messageCount = 0;
|
|
60
|
+
let model;
|
|
61
|
+
for (const line of lines) {
|
|
62
|
+
try {
|
|
63
|
+
const entry = JSON.parse(line);
|
|
64
|
+
if (entry.type === 'user' || entry.type === 'assistant') {
|
|
65
|
+
messageCount++;
|
|
66
|
+
}
|
|
67
|
+
if (entry.message?.model) {
|
|
68
|
+
model = entry.message.model;
|
|
69
|
+
}
|
|
70
|
+
if (entry.message?.usage) {
|
|
71
|
+
const usage = entry.message.usage;
|
|
72
|
+
const inputTokens = usage.input_tokens || 0;
|
|
73
|
+
const outputTokens = usage.output_tokens || 0;
|
|
74
|
+
const cacheReadTokens = usage.cache_read_input_tokens || 0;
|
|
75
|
+
const cacheCreationTokens = usage.cache_creation_input_tokens || 0;
|
|
76
|
+
const totalContextTokens = inputTokens + cacheReadTokens + cacheCreationTokens;
|
|
77
|
+
const utilizationPercent = (totalContextTokens / CONTEXT_WINDOW_SIZE) * 100;
|
|
78
|
+
const freeSpace = Math.max(0, CONTEXT_WINDOW_SIZE - totalContextTokens);
|
|
79
|
+
latestUsage = {
|
|
80
|
+
inputTokens,
|
|
81
|
+
outputTokens,
|
|
82
|
+
cacheReadTokens,
|
|
83
|
+
cacheCreationTokens,
|
|
84
|
+
totalContextTokens,
|
|
85
|
+
utilizationPercent: Math.round(utilizationPercent * 10) / 10,
|
|
86
|
+
freeSpace,
|
|
87
|
+
messageCount,
|
|
88
|
+
model,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Skip malformed lines
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (latestUsage) {
|
|
97
|
+
latestUsage.messageCount = messageCount;
|
|
98
|
+
}
|
|
99
|
+
return latestUsage;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Calculate cost from usage
|
|
107
|
+
*/
|
|
108
|
+
function calculateCost(usage) {
|
|
109
|
+
const model = usage.model || 'claude-sonnet-4-20250514';
|
|
110
|
+
const pricing = MODEL_PRICING[model] || { input: 3.0, output: 15.0 };
|
|
111
|
+
const inputCost = (usage.inputTokens * pricing.input) / 1_000_000;
|
|
112
|
+
const outputCost = (usage.outputTokens * pricing.output) / 1_000_000;
|
|
113
|
+
return {
|
|
114
|
+
inputCost: Math.round(inputCost * 10000) / 10000,
|
|
115
|
+
outputCost: Math.round(outputCost * 10000) / 10000,
|
|
116
|
+
totalCost: Math.round((inputCost + outputCost) * 10000) / 10000,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export async function contextStats(input) {
|
|
120
|
+
// Find session
|
|
121
|
+
let sessionInfo = null;
|
|
122
|
+
if (input.sessionId) {
|
|
123
|
+
// Search for specific session
|
|
124
|
+
const projectsDir = join(CLAUDE_HOME, 'projects');
|
|
125
|
+
if (existsSync(projectsDir)) {
|
|
126
|
+
const projectDirs = readdirSync(projectsDir);
|
|
127
|
+
for (const project of projectDirs) {
|
|
128
|
+
const filePath = join(projectsDir, project, `${input.sessionId}.jsonl`);
|
|
129
|
+
if (existsSync(filePath)) {
|
|
130
|
+
sessionInfo = { sessionId: input.sessionId, projectDir: project, filePath };
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
sessionInfo = findRecentSession();
|
|
138
|
+
}
|
|
139
|
+
if (!sessionInfo) {
|
|
140
|
+
return {
|
|
141
|
+
error: input.sessionId ? `Session not found: ${input.sessionId}` : 'No sessions found',
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
const usage = parseSessionUsage(sessionInfo.filePath);
|
|
145
|
+
if (!usage) {
|
|
146
|
+
return {
|
|
147
|
+
sessionId: sessionInfo.sessionId,
|
|
148
|
+
error: 'Could not parse session usage data',
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const result = {
|
|
152
|
+
sessionId: sessionInfo.sessionId,
|
|
153
|
+
project: sessionInfo.projectDir.replace(/-/g, '/'),
|
|
154
|
+
model: usage.model,
|
|
155
|
+
context: {
|
|
156
|
+
totalTokens: usage.totalContextTokens,
|
|
157
|
+
utilization: `${usage.utilizationPercent}%`,
|
|
158
|
+
freeSpace: usage.freeSpace,
|
|
159
|
+
freeSpacePercent: `${(100 - usage.utilizationPercent).toFixed(1)}%`,
|
|
160
|
+
},
|
|
161
|
+
tokens: {
|
|
162
|
+
input: usage.inputTokens,
|
|
163
|
+
output: usage.outputTokens,
|
|
164
|
+
cacheRead: usage.cacheReadTokens,
|
|
165
|
+
cacheCreation: usage.cacheCreationTokens,
|
|
166
|
+
},
|
|
167
|
+
messages: usage.messageCount,
|
|
168
|
+
};
|
|
169
|
+
if (input.includeCost) {
|
|
170
|
+
const cost = calculateCost(usage);
|
|
171
|
+
result.cost = {
|
|
172
|
+
input: `$${cost.inputCost.toFixed(4)}`,
|
|
173
|
+
output: `$${cost.outputCost.toFixed(4)}`,
|
|
174
|
+
total: `$${cost.totalCost.toFixed(4)}`,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
if (input.includeBreakdown) {
|
|
178
|
+
// Estimate breakdown based on typical overhead
|
|
179
|
+
const systemPrompt = 8000;
|
|
180
|
+
const systemTools = 15000;
|
|
181
|
+
const overhead = systemPrompt + systemTools;
|
|
182
|
+
const messages = Math.max(0, usage.totalContextTokens - overhead);
|
|
183
|
+
result.breakdown = {
|
|
184
|
+
systemPrompt,
|
|
185
|
+
systemTools,
|
|
186
|
+
messages,
|
|
187
|
+
other: Math.max(0, usage.totalContextTokens - systemPrompt - systemTools - messages),
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// Load historical data
|
|
191
|
+
const historyPath = join(CLAUDE_HOME, 'context-history.json');
|
|
192
|
+
const history = loadJsonSafe(historyPath, { version: 1, sessions: [], dailyAverages: [] });
|
|
193
|
+
if (history.sessions.length > 0) {
|
|
194
|
+
const avgUtilization = history.sessions.reduce((sum, s) => sum + s.utilizationPercent, 0) / history.sessions.length;
|
|
195
|
+
result.history = {
|
|
196
|
+
totalSessions: history.sessions.length,
|
|
197
|
+
avgUtilization: Math.round(avgUtilization * 10) / 10,
|
|
198
|
+
recentDays: history.dailyAverages.slice(-7).map(d => ({
|
|
199
|
+
date: d.date,
|
|
200
|
+
avgTokens: Math.round(d.avgTokens),
|
|
201
|
+
sessionCount: d.sessionCount,
|
|
202
|
+
})),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
return result;
|
|
206
|
+
}
|
|
207
|
+
export const contextStatsTool = {
|
|
208
|
+
name: 'obs_context_stats',
|
|
209
|
+
description: 'Get context window utilization statistics for a Claude Code session. Shows token usage, cost estimates, and historical trends.',
|
|
210
|
+
inputSchema: contextStatsSchema,
|
|
211
|
+
handler: contextStats,
|
|
212
|
+
};
|
|
213
|
+
//# sourceMappingURL=context-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-stats.js","sourceRoot":"","sources":["../../src/tools/context-stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get SigNoz trace viewer URL for a trace ID
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
export declare const getTraceUrlSchema: z.ZodObject<{
|
|
6
|
+
traceId: z.ZodString;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
traceId: string;
|
|
9
|
+
}, {
|
|
10
|
+
traceId: string;
|
|
11
|
+
}>;
|
|
12
|
+
export type GetTraceUrlInput = z.infer<typeof getTraceUrlSchema>;
|
|
13
|
+
export declare function getTraceUrl(input: GetTraceUrlInput): Promise<{
|
|
14
|
+
error: string;
|
|
15
|
+
traceId?: undefined;
|
|
16
|
+
url?: undefined;
|
|
17
|
+
message?: undefined;
|
|
18
|
+
} | {
|
|
19
|
+
traceId: string;
|
|
20
|
+
url: string;
|
|
21
|
+
message: string;
|
|
22
|
+
error?: undefined;
|
|
23
|
+
}>;
|
|
24
|
+
export declare const getTraceUrlTool: {
|
|
25
|
+
name: string;
|
|
26
|
+
description: string;
|
|
27
|
+
inputSchema: z.ZodObject<{
|
|
28
|
+
traceId: z.ZodString;
|
|
29
|
+
}, "strip", z.ZodTypeAny, {
|
|
30
|
+
traceId: string;
|
|
31
|
+
}, {
|
|
32
|
+
traceId: string;
|
|
33
|
+
}>;
|
|
34
|
+
handler: typeof getTraceUrl;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=get-trace-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-trace-url.d.ts","sourceRoot":"","sources":["../../src/tools/get-trace-url.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,iBAAiB;;;;;;EAE5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB;;;;;;;;;;GAgCxD;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;CAK3B,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get SigNoz trace viewer URL for a trace ID
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { SIGNOZ_URL } from '../lib/constants.js';
|
|
6
|
+
export const getTraceUrlSchema = z.object({
|
|
7
|
+
traceId: z.string().describe('The trace ID to get the viewer URL for'),
|
|
8
|
+
});
|
|
9
|
+
export async function getTraceUrl(input) {
|
|
10
|
+
if (!SIGNOZ_URL) {
|
|
11
|
+
return {
|
|
12
|
+
error: 'SigNoz URL not configured. Set SIGNOZ_URL or OTEL_EXPORTER_OTLP_ENDPOINT environment variable.',
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
// Convert ingest URL to UI URL
|
|
16
|
+
// Example: https://ingest.us.signoz.cloud/v1/traces -> https://us.signoz.cloud
|
|
17
|
+
let baseUrl = SIGNOZ_URL
|
|
18
|
+
.replace('/v1/traces', '')
|
|
19
|
+
.replace('/v1/metrics', '')
|
|
20
|
+
.replace('/v1/logs', '')
|
|
21
|
+
.replace('ingest.', '')
|
|
22
|
+
.replace(':4318', '')
|
|
23
|
+
.replace(':4317', '');
|
|
24
|
+
// Ensure https
|
|
25
|
+
if (!baseUrl.startsWith('http')) {
|
|
26
|
+
baseUrl = `https://${baseUrl}`;
|
|
27
|
+
}
|
|
28
|
+
// Remove trailing slash
|
|
29
|
+
baseUrl = baseUrl.replace(/\/+$/, '');
|
|
30
|
+
const traceUrl = `${baseUrl}/trace/${input.traceId}`;
|
|
31
|
+
return {
|
|
32
|
+
traceId: input.traceId,
|
|
33
|
+
url: traceUrl,
|
|
34
|
+
message: `Open this URL in your browser to view the trace in SigNoz`,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export const getTraceUrlTool = {
|
|
38
|
+
name: 'obs_get_trace_url',
|
|
39
|
+
description: 'Generate a SigNoz trace viewer URL for a given trace ID. Use this to share or view traces in the SigNoz UI.',
|
|
40
|
+
inputSchema: getTraceUrlSchema,
|
|
41
|
+
handler: getTraceUrl,
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=get-trace-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-trace-url.js","sourceRoot":"","sources":["../../src/tools/get-trace-url.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;CACvE,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAuB;IACvD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,KAAK,EAAE,gGAAgG;SACxG,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,+EAA+E;IAC/E,IAAI,OAAO,GAAG,UAAU;SACrB,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;SACzB,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAExB,eAAe;IACf,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,GAAG,WAAW,OAAO,EAAE,CAAC;IACjC,CAAC;IAED,wBAAwB;IACxB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,GAAG,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;IAErD,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,EAAE,QAAQ;QACb,OAAO,EAAE,2DAA2D;KACrE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,6GAA6G;IAC1H,WAAW,EAAE,iBAAiB;IAC9B,OAAO,EAAE,WAAW;CACrB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health check for telemetry system
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
export declare const healthCheckSchema: z.ZodObject<{
|
|
6
|
+
verbose: z.ZodDefault<z.ZodBoolean>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
verbose: boolean;
|
|
9
|
+
}, {
|
|
10
|
+
verbose?: boolean | undefined;
|
|
11
|
+
}>;
|
|
12
|
+
export type HealthCheckInput = z.infer<typeof healthCheckSchema>;
|
|
13
|
+
interface FileStats {
|
|
14
|
+
name: string;
|
|
15
|
+
size: number;
|
|
16
|
+
modified: string;
|
|
17
|
+
lines?: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function healthCheck(input: HealthCheckInput): Promise<{
|
|
20
|
+
status: "healthy" | "degraded" | "unhealthy";
|
|
21
|
+
backends: {
|
|
22
|
+
local: {
|
|
23
|
+
status: string;
|
|
24
|
+
message?: string;
|
|
25
|
+
files?: FileStats[];
|
|
26
|
+
};
|
|
27
|
+
signoz: {
|
|
28
|
+
status: string;
|
|
29
|
+
message?: string;
|
|
30
|
+
configured: boolean;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
telemetryDir: string;
|
|
34
|
+
today: string;
|
|
35
|
+
summary?: string;
|
|
36
|
+
}>;
|
|
37
|
+
export declare const healthCheckTool: {
|
|
38
|
+
name: string;
|
|
39
|
+
description: string;
|
|
40
|
+
inputSchema: z.ZodObject<{
|
|
41
|
+
verbose: z.ZodDefault<z.ZodBoolean>;
|
|
42
|
+
}, "strip", z.ZodTypeAny, {
|
|
43
|
+
verbose: boolean;
|
|
44
|
+
}, {
|
|
45
|
+
verbose?: boolean | undefined;
|
|
46
|
+
}>;
|
|
47
|
+
handler: typeof healthCheck;
|
|
48
|
+
};
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=health-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-check.d.ts","sourceRoot":"","sources":["../../src/tools/health-check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,iBAAiB;;;;;;EAE5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqBD,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB;YAE7C,SAAS,GAAG,UAAU,GAAG,WAAW;cAClC;QACR,KAAK,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAA;SAAE,CAAC;QACjE,MAAM,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,OAAO,CAAA;SAAE,CAAC;KACnE;kBACa,MAAM;WACb,MAAM;cACH,MAAM;GAyEnB;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;CAK3B,CAAC"}
|