@wizeworks/lens-node 0.3.0-alpha.1 → 0.3.0-alpha.3
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/dist/api.d.ts +3 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +19 -7
- package/dist/api.js.map +1 -1
- package/dist/capture.d.ts.map +1 -1
- package/dist/capture.js +3 -3
- package/dist/capture.js.map +1 -1
- package/dist/client-spans.d.ts +6 -4
- package/dist/client-spans.d.ts.map +1 -1
- package/dist/client-spans.js +20 -9
- package/dist/client-spans.js.map +1 -1
- package/dist/frameworks/fastify.d.ts.map +1 -1
- package/dist/frameworks/fastify.js +4 -2
- package/dist/frameworks/fastify.js.map +1 -1
- package/dist/frameworks/hono.js +3 -3
- package/dist/frameworks/hono.js.map +1 -1
- package/dist/frameworks/koa.js +3 -3
- package/dist/frameworks/koa.js.map +1 -1
- package/dist/frameworks/node-server.d.ts.map +1 -1
- package/dist/frameworks/node-server.js +4 -2
- package/dist/frameworks/node-server.js.map +1 -1
- package/dist/hub-connect.d.ts +2 -2
- package/dist/hub-connect.d.ts.map +1 -1
- package/dist/hub-connect.js +2 -2
- package/dist/hub-connect.js.map +1 -1
- package/dist/info.js +1 -1
- package/dist/info.js.map +1 -1
- package/dist/kit.d.ts +1 -1
- package/dist/kit.d.ts.map +1 -1
- package/dist/mcp-find.d.ts +2 -2
- package/dist/mcp-find.d.ts.map +1 -1
- package/dist/mcp-find.js +30 -20
- package/dist/mcp-find.js.map +1 -1
- package/dist/mcp-metrics.d.ts +2 -2
- package/dist/mcp-metrics.d.ts.map +1 -1
- package/dist/mcp-metrics.js +11 -9
- package/dist/mcp-metrics.js.map +1 -1
- package/dist/mcp-projects.d.ts +11 -0
- package/dist/mcp-projects.d.ts.map +1 -0
- package/dist/mcp-projects.js +49 -0
- package/dist/mcp-projects.js.map +1 -0
- package/dist/mcp-search.d.ts +5 -0
- package/dist/mcp-search.d.ts.map +1 -0
- package/dist/mcp-search.js +49 -0
- package/dist/mcp-search.js.map +1 -0
- package/dist/mcp-shared.d.ts +47 -4
- package/dist/mcp-shared.d.ts.map +1 -1
- package/dist/mcp-shared.js.map +1 -1
- package/dist/mcp-store.d.ts +27 -0
- package/dist/mcp-store.d.ts.map +1 -0
- package/dist/mcp-store.js +55 -0
- package/dist/mcp-store.js.map +1 -0
- package/dist/mcp-traces.d.ts +2 -2
- package/dist/mcp-traces.d.ts.map +1 -1
- package/dist/mcp-traces.js +37 -25
- package/dist/mcp-traces.js.map +1 -1
- package/dist/mcp.d.ts +4 -4
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +14 -6
- package/dist/mcp.js.map +1 -1
- package/dist/mode.d.ts +6 -0
- package/dist/mode.d.ts.map +1 -0
- package/dist/mode.js +7 -0
- package/dist/mode.js.map +1 -0
- package/dist/request-capture.d.ts +7 -1
- package/dist/request-capture.d.ts.map +1 -1
- package/dist/request-capture.js +12 -0
- package/dist/request-capture.js.map +1 -1
- package/dist/search-api.d.ts +7 -0
- package/dist/search-api.d.ts.map +1 -0
- package/dist/search-api.js +20 -0
- package/dist/search-api.js.map +1 -0
- package/dist/types.d.ts +4 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/wizelens.d.ts.map +1 -1
- package/dist/wizelens.js +10 -7
- package/dist/wizelens.js.map +1 -1
- package/package.json +3 -3
package/dist/mcp-find.js
CHANGED
|
@@ -1,10 +1,21 @@
|
|
|
1
|
-
import { findNPlusOneDb, findNPlusOneHttp, queryText } from "@wizeworks/lens-core";
|
|
1
|
+
import { findNPlusOneDb, findNPlusOneHttp, parseSearch, queryText } from "@wizeworks/lens-core";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { json, READ_ONLY } from "./mcp-shared.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
import { findAll, rangeArg } from "./mcp-store.js";
|
|
5
|
+
/** How many slow queries are read, newest first, before the slowest are picked. */
|
|
6
|
+
const SLOW_SCAN = 5_000;
|
|
7
|
+
/** The slowest database spans over `threshold` in the range, with their SQL. Only the picked spans load their trace. */
|
|
8
|
+
async function slowQueries(data, threshold, range, limit) {
|
|
9
|
+
const spans = await findAll(data, "spans", parseSearch(`category:db duration:>=${threshold}ms`), range, SLOW_SCAN);
|
|
10
|
+
const top = spans.sort((a, b) => b.durationMs - a.durationMs).slice(0, limit);
|
|
11
|
+
const traces = new Map();
|
|
12
|
+
const rows = [];
|
|
13
|
+
for (const s of top) {
|
|
14
|
+
const trace = await (traces.get(s.traceId) ?? traces.set(s.traceId, Promise.resolve(data.get(s.traceId, false))).get(s.traceId));
|
|
15
|
+
const span = trace?.spans.find((x) => x.spanId === s.spanId);
|
|
16
|
+
rows.push({ traceId: s.traceId, spanId: s.spanId, durationMs: s.durationMs, query: span ? queryText(span) : s.name, service: s.service });
|
|
17
|
+
}
|
|
18
|
+
return rows;
|
|
8
19
|
}
|
|
9
20
|
function nPlusOne(traces, n) {
|
|
10
21
|
return traces.flatMap((t) => [
|
|
@@ -12,31 +23,30 @@ function nPlusOne(traces, n) {
|
|
|
12
23
|
...findNPlusOneHttp(t, n).map((f) => ({ traceId: t.traceId, kind: "http", shape: f.shape, count: f.count, totalMs: f.totalMs })),
|
|
13
24
|
]);
|
|
14
25
|
}
|
|
15
|
-
function registerSlowQueries(server,
|
|
26
|
+
function registerSlowQueries(server, src) {
|
|
16
27
|
const inputSchema = {
|
|
17
|
-
|
|
28
|
+
...src.arg,
|
|
29
|
+
thresholdMs: z.number().min(0).optional().describe(`Default ${src.defaults.slowQueryMs}.`),
|
|
18
30
|
limit: z.number().int().min(1).max(500).optional().describe("Default 20."),
|
|
31
|
+
range: rangeArg("to look"),
|
|
19
32
|
};
|
|
20
|
-
const description = "Find database queries
|
|
33
|
+
const description = "Find the slowest database queries over a threshold, from the whole store.";
|
|
21
34
|
server.registerTool("find_slow_queries", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
.sort((a, b) => b.durationMs - a.durationMs)
|
|
25
|
-
.slice(0, args.limit ?? 20);
|
|
26
|
-
return json(rows);
|
|
35
|
+
const data = await src.open("find_slow_queries", args);
|
|
36
|
+
return json(await slowQueries(data, args.thresholdMs ?? data.slowQueryMs, args.range ?? "24h", args.limit ?? 20));
|
|
27
37
|
});
|
|
28
38
|
}
|
|
29
|
-
function registerNPlusOne(server,
|
|
30
|
-
const inputSchema = { minRepeats: z.number().int().min(2).optional().describe(`Default ${
|
|
39
|
+
function registerNPlusOne(server, src) {
|
|
40
|
+
const inputSchema = { ...src.arg, minRepeats: z.number().int().min(2).optional().describe(`Default ${src.defaults.nPlusOneThreshold}.`) };
|
|
31
41
|
const description = "Find N+1 patterns (same SQL or same HTTP call shape repeated in one trace).";
|
|
32
42
|
server.registerTool("find_n_plus_one", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
33
|
-
|
|
34
|
-
return json(nPlusOne(data.all(), args.minRepeats ?? data.nPlusOneThreshold));
|
|
43
|
+
const data = await src.open("find_n_plus_one", args);
|
|
44
|
+
return json(nPlusOne(await data.all(), args.minRepeats ?? data.nPlusOneThreshold));
|
|
35
45
|
});
|
|
36
46
|
}
|
|
37
47
|
/** find_slow_queries and find_n_plus_one. */
|
|
38
|
-
export function registerFindTools(server,
|
|
39
|
-
registerSlowQueries(server,
|
|
40
|
-
registerNPlusOne(server,
|
|
48
|
+
export function registerFindTools(server, src) {
|
|
49
|
+
registerSlowQueries(server, src);
|
|
50
|
+
registerNPlusOne(server, src);
|
|
41
51
|
}
|
|
42
52
|
//# sourceMappingURL=mcp-find.js.map
|
package/dist/mcp-find.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-find.js","sourceRoot":"","sources":["../src/mcp-find.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"mcp-find.js","sourceRoot":"","sources":["../src/mcp-find.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-metrics.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
-
import { type
|
|
2
|
+
import { type Source } from "./mcp-shared.js";
|
|
3
3
|
/** list_metrics and get_metric, when the data source has metrics. */
|
|
4
|
-
export declare function registerMetricTools(server: McpServer,
|
|
4
|
+
export declare function registerMetricTools(server: McpServer, src: Source): void;
|
|
5
5
|
//# sourceMappingURL=mcp-metrics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-metrics.d.ts","sourceRoot":"","sources":["../src/mcp-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,
|
|
1
|
+
{"version":3,"file":"mcp-metrics.d.ts","sourceRoot":"","sources":["../src/mcp-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAmB,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AA2E/D,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAKxE"}
|
package/dist/mcp-metrics.js
CHANGED
|
@@ -36,21 +36,23 @@ function detailOf(d) {
|
|
|
36
36
|
hiddenLines: d.hidden,
|
|
37
37
|
};
|
|
38
38
|
}
|
|
39
|
-
function registerListMetrics(server,
|
|
39
|
+
function registerListMetrics(server, src, ranges) {
|
|
40
40
|
const inputSchema = {
|
|
41
|
+
...src.arg,
|
|
41
42
|
range: z.enum(ranges).optional().describe(`Time range. Default ${ranges.includes("1h") ? "1h" : ranges[0]}.`),
|
|
42
43
|
service: z.string().optional().describe("Only this service."),
|
|
43
44
|
q: z.string().optional().describe("Only metrics whose name has this text."),
|
|
44
45
|
};
|
|
45
46
|
const description = "List metrics (CPU, memory, GC, request rates, app metrics) with their newest values, and a runtime summary per service.";
|
|
46
47
|
server.registerTool("list_metrics", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
47
|
-
|
|
48
|
+
const data = await src.open("list_metrics", args);
|
|
48
49
|
const range = args.range ?? (ranges.includes("1h") ? "1h" : ranges[0]);
|
|
49
50
|
return json(catalogOf(await data.metrics(range, { service: args.service ?? "", q: args.q ?? "" })));
|
|
50
51
|
});
|
|
51
52
|
}
|
|
52
|
-
function registerGetMetric(server,
|
|
53
|
+
function registerGetMetric(server, src, ranges) {
|
|
53
54
|
const inputSchema = {
|
|
55
|
+
...src.arg,
|
|
54
56
|
name: z.string().min(1).describe("Metric name, for example process.cpu.utilization."),
|
|
55
57
|
range: z.enum(ranges).optional().describe("Time range. Default 1h."),
|
|
56
58
|
service: z.string().optional().describe("Only this service."),
|
|
@@ -59,7 +61,7 @@ function registerGetMetric(server, data, audit, ranges) {
|
|
|
59
61
|
};
|
|
60
62
|
const description = "Get one metric over time: summary values and up to 12 points per line, formatted in its unit.";
|
|
61
63
|
server.registerTool("get_metric", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
62
|
-
|
|
64
|
+
const data = await src.open("get_metric", args);
|
|
63
65
|
const range = args.range ?? (ranges.includes("1h") ? "1h" : ranges[0]);
|
|
64
66
|
const params = { metric: args.name, service: args.service ?? "", group: args.group ?? "", stat: args.stat ?? "" };
|
|
65
67
|
const m = await data.metrics(range, params);
|
|
@@ -67,11 +69,11 @@ function registerGetMetric(server, data, audit, ranges) {
|
|
|
67
69
|
});
|
|
68
70
|
}
|
|
69
71
|
/** list_metrics and get_metric, when the data source has metrics. */
|
|
70
|
-
export function registerMetricTools(server,
|
|
71
|
-
if (!
|
|
72
|
+
export function registerMetricTools(server, src) {
|
|
73
|
+
if (!src.defaults.metrics)
|
|
72
74
|
return;
|
|
73
|
-
const ranges = (
|
|
74
|
-
registerListMetrics(server,
|
|
75
|
-
registerGetMetric(server,
|
|
75
|
+
const ranges = (src.defaults.metricRanges?.length ? src.defaults.metricRanges : ALL_RANGES);
|
|
76
|
+
registerListMetrics(server, src, ranges);
|
|
77
|
+
registerGetMetric(server, src, ranges);
|
|
76
78
|
}
|
|
77
79
|
//# sourceMappingURL=mcp-metrics.js.map
|
package/dist/mcp-metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-metrics.js","sourceRoot":"","sources":["../src/mcp-metrics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAwC,WAAW,EAAkB,MAAM,sBAAsB,CAAC;AACpH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"mcp-metrics.js","sourceRoot":"","sources":["../src/mcp-metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { type McpDataSource, type McpProject, type McpProjects, type Source } from "./mcp-shared.js";
|
|
3
|
+
/** One data source: every call reads it. */
|
|
4
|
+
export declare function singleSource(data: McpDataSource): Source;
|
|
5
|
+
/** The project a call names by id or name; the only one when it names none. */
|
|
6
|
+
export declare function pickProject(ps: readonly McpProject[], wanted: string | undefined): McpProject;
|
|
7
|
+
/** Several projects: each call names one with the `project` argument. */
|
|
8
|
+
export declare function projectsSource(m: McpProjects): Source;
|
|
9
|
+
/** list_projects: the projects this key reads, for the `project` argument. */
|
|
10
|
+
export declare function registerProjectTools(server: McpServer, m: McpProjects): void;
|
|
11
|
+
//# sourceMappingURL=mcp-projects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-projects.d.ts","sourceRoot":"","sources":["../src/mcp-projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAAQ,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAa,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAItH,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAMxD;AAID,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,EAAE,EAAE,SAAS,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAU7F;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAWrD;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,GAAG,IAAI,CAM5E"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { json, READ_ONLY } from "./mcp-shared.js";
|
|
3
|
+
const auditLine = (service, tool, args) => `[wizelens] mcp tool=${tool} service=${service} args=${JSON.stringify(args ?? {})}`;
|
|
4
|
+
/** One data source: every call reads it. */
|
|
5
|
+
export function singleSource(data) {
|
|
6
|
+
return {
|
|
7
|
+
defaults: { slowQueryMs: data.slowQueryMs, nPlusOneThreshold: data.nPlusOneThreshold, metrics: !!data.metrics, metricRanges: data.metricRanges },
|
|
8
|
+
arg: {},
|
|
9
|
+
open: async (tool, args) => (data.audit(auditLine(data.service, tool, args)), data),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
const named = (ps) => ps.map((p) => `${p.name} (${p.id})`).join(", ");
|
|
13
|
+
/** The project a call names by id or name; the only one when it names none. */
|
|
14
|
+
export function pickProject(ps, wanted) {
|
|
15
|
+
if (ps.length === 0)
|
|
16
|
+
throw new Error("This key reads no projects.");
|
|
17
|
+
if (!wanted) {
|
|
18
|
+
if (ps.length === 1)
|
|
19
|
+
return ps[0];
|
|
20
|
+
throw new Error(`Add the project argument. This key reads: ${named(ps)}.`);
|
|
21
|
+
}
|
|
22
|
+
const w = wanted.trim().toLowerCase();
|
|
23
|
+
const p = ps.find((x) => x.id === wanted) ?? ps.find((x) => x.name.toLowerCase() === w);
|
|
24
|
+
if (!p)
|
|
25
|
+
throw new Error(`No project "${wanted}". This key reads: ${named(ps)}.`);
|
|
26
|
+
return p;
|
|
27
|
+
}
|
|
28
|
+
/** Several projects: each call names one with the `project` argument. */
|
|
29
|
+
export function projectsSource(m) {
|
|
30
|
+
const project = z.string().max(200).optional().describe("Project id or name, from list_projects. Needed when the key reads more than one project.");
|
|
31
|
+
return {
|
|
32
|
+
defaults: { slowQueryMs: m.slowQueryMs, nPlusOneThreshold: m.nPlusOneThreshold, metrics: m.metrics, metricRanges: m.metricRanges },
|
|
33
|
+
arg: { project },
|
|
34
|
+
open: async (tool, args) => {
|
|
35
|
+
const data = await m.open(pickProject(m.projects, args.project).id);
|
|
36
|
+
data.audit(auditLine(data.service, tool, args));
|
|
37
|
+
return data;
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** list_projects: the projects this key reads, for the `project` argument. */
|
|
42
|
+
export function registerProjectTools(server, m) {
|
|
43
|
+
const description = "List the projects this key can read. Pass one's id or name as `project` to the other tools.";
|
|
44
|
+
server.registerTool("list_projects", { description, inputSchema: {}, annotations: READ_ONLY }, async (args) => {
|
|
45
|
+
m.audit(auditLine(m.service, "list_projects", args));
|
|
46
|
+
return json(m.projects.map((p) => ({ id: p.id, name: p.name })));
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=mcp-projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-projects.js","sourceRoot":"","sources":["../src/mcp-projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { type Source } from "./mcp-shared.js";
|
|
3
|
+
/** search and search_fields: the search language, on the host's store or on `all()` in memory. */
|
|
4
|
+
export declare function registerSearchTools(server: McpServer, src: Source): void;
|
|
5
|
+
//# sourceMappingURL=mcp-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-search.d.ts","sourceRoot":"","sources":["../src/mcp-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAmB,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AA4C/D,kGAAkG;AAClG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAGxE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { checkSearch, decodeCursor, SEARCH_KINDS, searchMemory, suggestMemory } from "@wizeworks/lens-core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { json, READ_ONLY } from "./mcp-shared.js";
|
|
4
|
+
import { RANGES, windowOf } from "./mcp-store.js";
|
|
5
|
+
const LANGUAGE = [
|
|
6
|
+
"Search language: words and \"phrases\" match text (path, SQL, messages, errors).",
|
|
7
|
+
"field:value with service, env, trace, span, name, method, path, route, status (500, 5xx, ok, error), duration (250ms, 1s), level, category, kind, user, error (true/false), message.",
|
|
8
|
+
"@attribute:value for any span or log attribute, such as @user.id:42 or @db.system.name:postgres.",
|
|
9
|
+
"Use >, >=, <, <= (status:>=500, duration:>1s), ranges a..b, * wildcards (path:/api/*), -term or NOT to exclude, OR, and parentheses.",
|
|
10
|
+
].join(" ");
|
|
11
|
+
function registerSearch(server, src) {
|
|
12
|
+
const inputSchema = {
|
|
13
|
+
...src.arg,
|
|
14
|
+
q: z.string().max(2000).describe("The search. Empty finds everything in the range."),
|
|
15
|
+
kind: z.enum(SEARCH_KINDS).optional().describe("What to find: requests (default), traces, spans, or logs."),
|
|
16
|
+
range: z.enum(RANGES).optional().describe("How far back: 15m, 1h, 6h, 24h (default), 7d, 30d."),
|
|
17
|
+
limit: z.number().int().min(1).max(200).optional().describe("Results per page. Default 20."),
|
|
18
|
+
cursor: z.string().optional().describe("The `next` value of the last page, for the next page."),
|
|
19
|
+
};
|
|
20
|
+
const description = `Search requests, traces, spans, and logs, newest first. ${LANGUAGE}`;
|
|
21
|
+
server.registerTool("search", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
22
|
+
const data = await src.open("search", args);
|
|
23
|
+
const parsed = checkSearch(args.q);
|
|
24
|
+
if (!parsed.ok)
|
|
25
|
+
return { ...json({ error: parsed.error, start: parsed.start, end: parsed.end }), isError: true };
|
|
26
|
+
const q = { kind: (args.kind ?? "requests"), node: parsed.node, window: windowOf(data, args.range ?? "24h"), limit: args.limit ?? 20, cursor: decodeCursor(args.cursor), env: data.env };
|
|
27
|
+
return json(await (data.search ? data.search(q) : searchMemory(await data.all(), q)));
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function registerFields(server, src) {
|
|
31
|
+
const inputSchema = {
|
|
32
|
+
...src.arg,
|
|
33
|
+
field: z.string().max(200).optional().describe("Leave out to list fields and attribute keys; or a field (service) or attribute (@user.id) to list its common values."),
|
|
34
|
+
prefix: z.string().max(200).optional().describe("Only names or values that start with this."),
|
|
35
|
+
range: z.enum(RANGES).optional().describe("Which data to read. Default 24h."),
|
|
36
|
+
};
|
|
37
|
+
const description = "List search fields, attribute keys seen in the data, or the common values of one field, to build a search.";
|
|
38
|
+
server.registerTool("search_fields", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
39
|
+
const data = await src.open("search_fields", args);
|
|
40
|
+
const r = { field: args.field || null, prefix: args.prefix ?? "", window: windowOf(data, args.range ?? "24h"), limit: 50, env: data.env };
|
|
41
|
+
return json(await (data.suggest ? data.suggest(r) : suggestMemory(await data.all(), r)));
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/** search and search_fields: the search language, on the host's store or on `all()` in memory. */
|
|
45
|
+
export function registerSearchTools(server, src) {
|
|
46
|
+
registerSearch(server, src);
|
|
47
|
+
registerFields(server, src);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=mcp-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-search.js","sourceRoot":"","sources":["../src/mcp-search.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-shared.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ZodTypeAny } from "zod";
|
|
2
|
+
import type { MetricsModel, SearchPage, SearchQuery, Suggestion, SuggestRequest, TimeRange, Trace } from "@wizeworks/lens-core";
|
|
2
3
|
/** What the MCP tools can read. Read-only by design. */
|
|
3
4
|
export interface McpDataSource {
|
|
4
5
|
service: string;
|
|
@@ -7,16 +8,58 @@ export interface McpDataSource {
|
|
|
7
8
|
slowQueryMs: number;
|
|
8
9
|
/** Default repeats for find_n_plus_one. */
|
|
9
10
|
nPlusOneThreshold: number;
|
|
10
|
-
|
|
11
|
-
all(): Trace[]
|
|
11
|
+
/** Recent traces, newest first, for the tools that read whole traces in memory. A host may load them only when a tool asks. */
|
|
12
|
+
all(): Trace[] | Promise<Trace[]>;
|
|
12
13
|
get(traceId: string, federate: boolean): Promise<Trace | undefined>;
|
|
13
14
|
audit(line: string): void;
|
|
14
15
|
/** The metrics page for a range and page parameters. Without it, the metric tools are left out. */
|
|
15
16
|
metrics?(range: TimeRange, params: Record<string, string>): MetricsModel | Promise<MetricsModel>;
|
|
16
17
|
/** Ranges the metric tools offer, shortest first. Default all. */
|
|
17
18
|
metricRanges?: readonly TimeRange[];
|
|
19
|
+
/** Search on the host's store. Without it, the search, list, error, and slow query tools read `all()` in memory. */
|
|
20
|
+
search?(q: SearchQuery): SearchPage | Promise<SearchPage>;
|
|
21
|
+
/** Autocomplete on the host's store. Without it, `all()` in memory. */
|
|
22
|
+
suggest?(r: SuggestRequest): Suggestion[] | Promise<Suggestion[]>;
|
|
23
|
+
/** The host's clock, for search ranges. Default Date.now. */
|
|
24
|
+
now?(): number;
|
|
25
|
+
/** The environment memory search gives this service's documents (in-app), as the HTTP search does. */
|
|
26
|
+
env?: string;
|
|
27
|
+
}
|
|
28
|
+
/** One project a multi-project host serves. */
|
|
29
|
+
export interface McpProject {
|
|
30
|
+
id: string;
|
|
31
|
+
name: string;
|
|
32
|
+
}
|
|
33
|
+
/** A host that serves several projects (the cloud with a read key for many). Tools then take a `project` argument. */
|
|
34
|
+
export interface McpProjects {
|
|
35
|
+
service: string;
|
|
36
|
+
version: string;
|
|
37
|
+
slowQueryMs: number;
|
|
38
|
+
nPlusOneThreshold: number;
|
|
39
|
+
/** True when every project has the metric tools. */
|
|
40
|
+
metrics: boolean;
|
|
41
|
+
metricRanges?: readonly TimeRange[];
|
|
42
|
+
projects: readonly McpProject[];
|
|
43
|
+
/** The data of one project from `projects`. */
|
|
44
|
+
open(projectId: string): Promise<McpDataSource>;
|
|
45
|
+
/** Audit for calls that read no project (list_projects). */
|
|
46
|
+
audit(line: string): void;
|
|
47
|
+
}
|
|
48
|
+
/** Defaults and features the tools are registered with: the same for every project. */
|
|
49
|
+
export interface McpDefaults {
|
|
50
|
+
slowQueryMs: number;
|
|
51
|
+
nPlusOneThreshold: number;
|
|
52
|
+
metrics: boolean;
|
|
53
|
+
metricRanges?: readonly TimeRange[];
|
|
54
|
+
}
|
|
55
|
+
/** Where the tools read. */
|
|
56
|
+
export interface Source {
|
|
57
|
+
defaults: McpDefaults;
|
|
58
|
+
/** The `project` argument, on a multi-project host; else empty. */
|
|
59
|
+
arg: Record<string, ZodTypeAny>;
|
|
60
|
+
/** The data for one tool call, after the call is audited. */
|
|
61
|
+
open(tool: string, args: object): Promise<McpDataSource>;
|
|
18
62
|
}
|
|
19
|
-
export type Audit = (tool: string, args: unknown) => void;
|
|
20
63
|
export declare const READ_ONLY: {
|
|
21
64
|
readOnlyHint: boolean;
|
|
22
65
|
openWorldHint: boolean;
|
package/dist/mcp-shared.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-shared.d.ts","sourceRoot":"","sources":["../src/mcp-shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"mcp-shared.d.ts","sourceRoot":"","sources":["../src/mcp-shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAEhI,wDAAwD;AACxD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+HAA+H;IAC/H,GAAG,IAAI,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAClC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,mGAAmG;IACnG,OAAO,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACjG,kEAAkE;IAClE,YAAY,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IACpC,oHAAoH;IACpH,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1D,uEAAuE;IACvE,OAAO,CAAC,CAAC,CAAC,EAAE,cAAc,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAClE,6DAA6D;IAC7D,GAAG,CAAC,IAAI,MAAM,CAAC;IACf,sGAAsG;IACtG,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,+CAA+C;AAC/C,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,sHAAsH;AACtH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IACpC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;IAChC,+CAA+C;IAC/C,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAChD,4DAA4D;IAC5D,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,uFAAuF;AACvF,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;CACrC;AAED,4BAA4B;AAC5B,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,WAAW,CAAC;IACtB,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAChC,6DAA6D;IAC7D,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAC1D;AAED,eAAO,MAAM,SAAS;IAAK,YAAY;IAAQ,aAAa;CAAS,CAAC;AAEtE,eAAO,MAAM,IAAI,UAAW,OAAO;;cACf,MAAM;;;CACxB,CAAC"}
|
package/dist/mcp-shared.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-shared.js","sourceRoot":"","sources":["../src/mcp-shared.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp-shared.js","sourceRoot":"","sources":["../src/mcp-shared.ts"],"names":[],"mappings":"AAoEA,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;AAEtE,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC;IACvC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;CAC3E,CAAC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type SearchItems, type SearchKind, type SearchNode, type TimeRange } from "@wizeworks/lens-core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import type { McpDataSource } from "./mcp-shared.js";
|
|
4
|
+
export declare const RANGES: [TimeRange, ...TimeRange[]];
|
|
5
|
+
export declare const rangeArg: (what: string) => z.ZodOptional<z.ZodEnum<{
|
|
6
|
+
"15m": "15m";
|
|
7
|
+
"1h": "1h";
|
|
8
|
+
"24h": "24h";
|
|
9
|
+
"30d": "30d";
|
|
10
|
+
"6h": "6h";
|
|
11
|
+
"7d": "7d";
|
|
12
|
+
}>>;
|
|
13
|
+
export declare const windowOf: (data: McpDataSource, range: TimeRange) => {
|
|
14
|
+
from: number;
|
|
15
|
+
to: number;
|
|
16
|
+
};
|
|
17
|
+
/** The matches of a search, newest first, up to `max`: the store, plus the newest traces in memory, which the store indexes only once they go quiet. */
|
|
18
|
+
export declare function findAll<K extends SearchKind>(data: McpDataSource, kind: K, node: SearchNode | null, range: TimeRange, max: number): Promise<SearchItems[K][]>;
|
|
19
|
+
/** Every part must hold: tool filters as search text, and the caller's own search. Null parts are left out. */
|
|
20
|
+
export declare function allOf(parts: readonly (string | null | undefined)[]): {
|
|
21
|
+
ok: true;
|
|
22
|
+
node: SearchNode | null;
|
|
23
|
+
} | {
|
|
24
|
+
ok: false;
|
|
25
|
+
error: string;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=mcp-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-store.d.ts","sourceRoot":"","sources":["../src/mcp-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAA+C,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAClL,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrD,eAAO,MAAM,MAAM,EAA+B,CAAC,SAAS,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;AAE9E,eAAO,MAAM,QAAQ,SAAU,MAAM;;;;;;;GAAqG,CAAC;AAI3I,eAAO,MAAM,QAAQ,SAAU,aAAa,SAAS,SAAS;IAEnD,IAAI;IAA+B,EAAE;CAC/C,CAAC;AAwBF,wJAAwJ;AACxJ,wBAAsB,OAAO,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAOnK;AAED,+GAA+G;AAC/G,wBAAgB,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CASzI"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { checkSearch, decodeCursor, searchMemory, TIME_RANGES } from "@wizeworks/lens-core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
// Tools that read the whole store through search, not a slice of recent traces (docs/SEARCH-PLAN.md, "MCP").
|
|
4
|
+
export const RANGES = Object.keys(TIME_RANGES);
|
|
5
|
+
export const rangeArg = (what) => z.enum(RANGES).optional().describe(`How far back ${what}: 15m, 1h, 6h, 24h (default), 7d, 30d.`);
|
|
6
|
+
const PAGE = 200;
|
|
7
|
+
export const windowOf = (data, range) => {
|
|
8
|
+
const now = data.now?.() ?? Date.now();
|
|
9
|
+
return { from: now - TIME_RANGES[range].ms, to: now };
|
|
10
|
+
};
|
|
11
|
+
const idOf = (item) => {
|
|
12
|
+
const r = item;
|
|
13
|
+
return r.key ?? (r.spanId ? `${r.traceId}:${r.spanId}` : r.traceId);
|
|
14
|
+
};
|
|
15
|
+
const timeOf = (item) => {
|
|
16
|
+
const r = item;
|
|
17
|
+
return r.startMs ?? r.timeMs ?? 0;
|
|
18
|
+
};
|
|
19
|
+
/** Store pages, newest first, up to `max`. */
|
|
20
|
+
async function storePages(data, base, max) {
|
|
21
|
+
const out = [];
|
|
22
|
+
let cursor = null;
|
|
23
|
+
do {
|
|
24
|
+
const page = await data.search({ ...base, limit: Math.min(PAGE, max - out.length), cursor: decodeCursor(cursor) });
|
|
25
|
+
out.push(...page.items);
|
|
26
|
+
cursor = page.next;
|
|
27
|
+
} while (cursor && out.length < max);
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
/** The matches of a search, newest first, up to `max`: the store, plus the newest traces in memory, which the store indexes only once they go quiet. */
|
|
31
|
+
export async function findAll(data, kind, node, range, max) {
|
|
32
|
+
const base = { kind, node, window: windowOf(data, range), env: data.env };
|
|
33
|
+
const recent = searchMemory(await data.all(), { ...base, limit: max }).items;
|
|
34
|
+
if (!data.search)
|
|
35
|
+
return recent;
|
|
36
|
+
const seen = new Map();
|
|
37
|
+
for (const item of [...(await storePages(data, base, max)), ...recent])
|
|
38
|
+
seen.set(idOf(item), item);
|
|
39
|
+
return [...seen.values()].sort((a, b) => timeOf(b) - timeOf(a)).slice(0, max);
|
|
40
|
+
}
|
|
41
|
+
/** Every part must hold: tool filters as search text, and the caller's own search. Null parts are left out. */
|
|
42
|
+
export function allOf(parts) {
|
|
43
|
+
const items = [];
|
|
44
|
+
for (const part of parts) {
|
|
45
|
+
if (!part)
|
|
46
|
+
continue;
|
|
47
|
+
const r = checkSearch(part);
|
|
48
|
+
if (!r.ok)
|
|
49
|
+
return { ok: false, error: `${r.error} (in "${part}")` };
|
|
50
|
+
if (r.node)
|
|
51
|
+
items.push(r.node);
|
|
52
|
+
}
|
|
53
|
+
return { ok: true, node: items.length === 0 ? null : items.length === 1 ? items[0] : { type: "and", items } };
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=mcp-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-store.js","sourceRoot":"","sources":["../src/mcp-store.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-traces.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
-
import { type
|
|
2
|
+
import { type Source } from "./mcp-shared.js";
|
|
3
3
|
/** list_traces, get_trace, and get_errors. */
|
|
4
|
-
export declare function registerTraceTools(server: McpServer,
|
|
4
|
+
export declare function registerTraceTools(server: McpServer, src: Source): void;
|
|
5
5
|
//# sourceMappingURL=mcp-traces.d.ts.map
|
package/dist/mcp-traces.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-traces.d.ts","sourceRoot":"","sources":["../src/mcp-traces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,
|
|
1
|
+
{"version":3,"file":"mcp-traces.d.ts","sourceRoot":"","sources":["../src/mcp-traces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAuC,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAyDnF,8CAA8C;AAC9C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAIvE"}
|