@wizeworks/lens-node 0.3.0-alpha.2 → 0.3.0-alpha.4
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/adapters/elasticsearch.d.ts +21 -0
- package/dist/adapters/elasticsearch.d.ts.map +1 -0
- package/dist/adapters/elasticsearch.js +93 -0
- package/dist/adapters/elasticsearch.js.map +1 -0
- package/dist/adapters/ioredis.d.ts +4 -0
- package/dist/adapters/ioredis.d.ts.map +1 -0
- package/dist/adapters/ioredis.js +60 -0
- package/dist/adapters/ioredis.js.map +1 -0
- package/dist/adapters/mongodb-shape.d.ts +16 -0
- package/dist/adapters/mongodb-shape.d.ts.map +1 -0
- package/dist/adapters/mongodb-shape.js +81 -0
- package/dist/adapters/mongodb-shape.js.map +1 -0
- package/dist/adapters/mongodb.d.ts +4 -0
- package/dist/adapters/mongodb.d.ts.map +1 -0
- package/dist/adapters/mongodb.js +95 -0
- package/dist/adapters/mongodb.js.map +1 -0
- package/dist/adapters/nosql.d.ts +14 -0
- package/dist/adapters/nosql.d.ts.map +1 -0
- package/dist/adapters/nosql.js +61 -0
- package/dist/adapters/nosql.js.map +1 -0
- package/dist/adapters/redis-shape.d.ts +31 -0
- package/dist/adapters/redis-shape.d.ts.map +1 -0
- package/dist/adapters/redis-shape.js +80 -0
- package/dist/adapters/redis-shape.js.map +1 -0
- package/dist/adapters/redis.d.ts +4 -0
- package/dist/adapters/redis.d.ts.map +1 -0
- package/dist/adapters/redis.js +93 -0
- package/dist/adapters/redis.js.map +1 -0
- package/dist/adapters/registry.d.ts +2 -0
- package/dist/adapters/registry.d.ts.map +1 -1
- package/dist/adapters/registry.js +2 -0
- package/dist/adapters/registry.js.map +1 -1
- package/dist/api.d.ts +5 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +25 -7
- package/dist/api.js.map +1 -1
- package/dist/auto/config.d.ts +14 -0
- package/dist/auto/config.d.ts.map +1 -0
- package/dist/auto/config.js +51 -0
- package/dist/auto/config.js.map +1 -0
- package/dist/auto/esm-loader.d.ts +10 -0
- package/dist/auto/esm-loader.d.ts.map +1 -0
- package/dist/auto/esm-loader.js +10 -0
- package/dist/auto/esm-loader.js.map +1 -0
- package/dist/auto/esm-source.d.ts +15 -0
- package/dist/auto/esm-source.d.ts.map +1 -0
- package/dist/auto/esm-source.js +23 -0
- package/dist/auto/esm-source.js.map +1 -0
- package/dist/auto/frameworks.d.ts +3 -0
- package/dist/auto/frameworks.d.ts.map +1 -0
- package/dist/auto/frameworks.js +112 -0
- package/dist/auto/frameworks.js.map +1 -0
- package/dist/auto/handle.d.ts +7 -0
- package/dist/auto/handle.d.ts.map +1 -0
- package/dist/auto/handle.js +47 -0
- package/dist/auto/handle.js.map +1 -0
- package/dist/auto/hono.d.ts +3 -0
- package/dist/auto/hono.d.ts.map +1 -0
- package/dist/auto/hono.js +43 -0
- package/dist/auto/hono.js.map +1 -0
- package/dist/auto/http.d.ts +18 -0
- package/dist/auto/http.d.ts.map +1 -0
- package/dist/auto/http.js +77 -0
- package/dist/auto/http.js.map +1 -0
- package/dist/auto/install.d.ts +5 -0
- package/dist/auto/install.d.ts.map +1 -0
- package/dist/auto/install.js +26 -0
- package/dist/auto/install.js.map +1 -0
- package/dist/auto/libraries.d.ts +3 -0
- package/dist/auto/libraries.d.ts.map +1 -0
- package/dist/auto/libraries.js +108 -0
- package/dist/auto/libraries.js.map +1 -0
- package/dist/auto/module-hooks.d.ts +14 -0
- package/dist/auto/module-hooks.d.ts.map +1 -0
- package/dist/auto/module-hooks.js +90 -0
- package/dist/auto/module-hooks.js.map +1 -0
- package/dist/auto/nest.d.ts +7 -0
- package/dist/auto/nest.d.ts.map +1 -0
- package/dist/auto/nest.js +26 -0
- package/dist/auto/nest.js.map +1 -0
- package/dist/auto/owner.d.ts +19 -0
- package/dist/auto/owner.d.ts.map +1 -0
- package/dist/auto/owner.js +52 -0
- package/dist/auto/owner.js.map +1 -0
- package/dist/auto/prisma.d.ts +3 -0
- package/dist/auto/prisma.d.ts.map +1 -0
- package/dist/auto/prisma.js +55 -0
- package/dist/auto/prisma.js.map +1 -0
- package/dist/auto/sqlite.d.ts +3 -0
- package/dist/auto/sqlite.d.ts.map +1 -0
- package/dist/auto/sqlite.js +31 -0
- package/dist/auto/sqlite.js.map +1 -0
- package/dist/auto/state.d.ts +14 -0
- package/dist/auto/state.d.ts.map +1 -0
- package/dist/auto/state.js +16 -0
- package/dist/auto/state.js.map +1 -0
- package/dist/auto.d.ts +2 -0
- package/dist/auto.d.ts.map +1 -0
- package/dist/auto.js +4 -0
- package/dist/auto.js.map +1 -0
- package/dist/capture.d.ts +3 -1
- package/dist/capture.d.ts.map +1 -1
- package/dist/capture.js +4 -4
- package/dist/capture.js.map +1 -1
- package/dist/client-attributes.d.ts +19 -0
- package/dist/client-attributes.d.ts.map +1 -0
- package/dist/client-attributes.js +56 -0
- package/dist/client-attributes.js.map +1 -0
- 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/db.js +1 -1
- package/dist/db.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.d.ts +16 -0
- package/dist/frameworks/hono.d.ts.map +1 -1
- package/dist/frameworks/hono.js +4 -4
- package/dist/frameworks/hono.js.map +1 -1
- package/dist/frameworks/koa.d.ts +2 -0
- package/dist/frameworks/koa.d.ts.map +1 -1
- package/dist/frameworks/koa.js +4 -4
- package/dist/frameworks/koa.js.map +1 -1
- package/dist/frameworks/nest-errors.d.ts +10 -0
- package/dist/frameworks/nest-errors.d.ts.map +1 -0
- package/dist/frameworks/nest-errors.js +75 -0
- package/dist/frameworks/nest-errors.js.map +1 -0
- package/dist/frameworks/nest-route.d.ts +31 -0
- package/dist/frameworks/nest-route.d.ts.map +1 -0
- package/dist/frameworks/nest-route.js +58 -0
- package/dist/frameworks/nest-route.js.map +1 -0
- package/dist/frameworks/nest.d.ts +16 -0
- package/dist/frameworks/nest.d.ts.map +1 -0
- package/dist/frameworks/nest.js +73 -0
- package/dist/frameworks/nest.js.map +1 -0
- package/dist/frameworks/node-server.d.ts +3 -0
- package/dist/frameworks/node-server.d.ts.map +1 -1
- package/dist/frameworks/node-server.js +5 -3
- package/dist/frameworks/node-server.js.map +1 -1
- package/dist/graphql/document.d.ts +13 -0
- package/dist/graphql/document.d.ts.map +1 -0
- package/dist/graphql/document.js +62 -0
- package/dist/graphql/document.js.map +1 -0
- package/dist/graphql/index.d.ts +11 -0
- package/dist/graphql/index.d.ts.map +1 -0
- package/dist/graphql/index.js +83 -0
- package/dist/graphql/index.js.map +1 -0
- package/dist/graphql/operation.d.ts +37 -0
- package/dist/graphql/operation.d.ts.map +1 -0
- package/dist/graphql/operation.js +58 -0
- package/dist/graphql/operation.js.map +1 -0
- package/dist/graphql/resolvers.d.ts +5 -0
- package/dist/graphql/resolvers.d.ts.map +1 -0
- package/dist/graphql/resolvers.js +79 -0
- package/dist/graphql/resolvers.js.map +1 -0
- package/dist/graphql/shared.d.ts +14 -0
- package/dist/graphql/shared.d.ts.map +1 -0
- package/dist/graphql/shared.js +21 -0
- package/dist/graphql/shared.js.map +1 -0
- package/dist/http-client.d.ts +8 -0
- package/dist/http-client.d.ts.map +1 -0
- package/dist/http-client.js +132 -0
- package/dist/http-client.js.map +1 -0
- package/dist/hub-connect.d.ts +2 -0
- package/dist/hub-connect.d.ts.map +1 -1
- package/dist/hub-connect.js +3 -1
- package/dist/hub-connect.js.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/info.d.ts +2 -0
- package/dist/info.d.ts.map +1 -1
- package/dist/info.js +1 -1
- package/dist/info.js.map +1 -1
- package/dist/kit.d.ts +3 -1
- package/dist/kit.d.ts.map +1 -1
- package/dist/kit.js +1 -0
- package/dist/kit.js.map +1 -1
- package/dist/logger.d.ts +4 -4
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +11 -7
- package/dist/logger.js.map +1 -1
- package/dist/logs/bunyan.d.ts +1 -1
- package/dist/logs/bunyan.d.ts.map +1 -1
- package/dist/logs/bunyan.js +2 -3
- package/dist/logs/bunyan.js.map +1 -1
- package/dist/logs/consola.d.ts +1 -1
- package/dist/logs/consola.d.ts.map +1 -1
- package/dist/logs/consola.js +1 -1
- package/dist/logs/consola.js.map +1 -1
- package/dist/logs/console.d.ts +1 -1
- package/dist/logs/console.d.ts.map +1 -1
- package/dist/logs/console.js +5 -3
- package/dist/logs/console.js.map +1 -1
- package/dist/logs/otel.d.ts.map +1 -1
- package/dist/logs/otel.js +1 -3
- package/dist/logs/otel.js.map +1 -1
- package/dist/logs/pino.d.ts +1 -1
- package/dist/logs/pino.d.ts.map +1 -1
- package/dist/logs/pino.js +2 -3
- package/dist/logs/pino.js.map +1 -1
- package/dist/logs/winston.d.ts +1 -1
- package/dist/logs/winston.d.ts.map +1 -1
- package/dist/logs/winston.js +2 -3
- package/dist/logs/winston.js.map +1 -1
- package/dist/loose-logs.d.ts +13 -0
- package/dist/loose-logs.d.ts.map +1 -0
- package/dist/loose-logs.js +21 -0
- package/dist/loose-logs.js.map +1 -0
- package/dist/mcp-find.d.ts +2 -2
- package/dist/mcp-find.d.ts.map +1 -1
- package/dist/mcp-find.js +68 -26
- package/dist/mcp-find.js.map +1 -1
- package/dist/mcp-memory.d.ts +7 -0
- package/dist/mcp-memory.d.ts.map +1 -0
- package/dist/mcp-memory.js +10 -0
- package/dist/mcp-memory.js.map +1 -0
- 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-overview.d.ts +5 -0
- package/dist/mcp-overview.d.ts.map +1 -0
- package/dist/mcp-overview.js +71 -0
- package/dist/mcp-overview.js.map +1 -0
- package/dist/mcp-page.d.ts +28 -0
- package/dist/mcp-page.d.ts.map +1 -0
- package/dist/mcp-page.js +77 -0
- package/dist/mcp-page.js.map +1 -0
- package/dist/mcp-problems.d.ts +5 -0
- package/dist/mcp-problems.d.ts.map +1 -0
- package/dist/mcp-problems.js +56 -0
- package/dist/mcp-problems.js.map +1 -0
- package/dist/mcp-projects.d.ts +11 -0
- package/dist/mcp-projects.d.ts.map +1 -0
- package/dist/mcp-projects.js +54 -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 +53 -0
- package/dist/mcp-search.js.map +1 -0
- package/dist/mcp-shared.d.ts +83 -4
- package/dist/mcp-shared.d.ts.map +1 -1
- package/dist/mcp-shared.js +3 -0
- 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 +56 -0
- package/dist/mcp-store.js.map +1 -0
- package/dist/mcp-tags.d.ts +8 -0
- package/dist/mcp-tags.d.ts.map +1 -0
- package/dist/mcp-tags.js +22 -0
- package/dist/mcp-tags.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-traffic.d.ts +5 -0
- package/dist/mcp-traffic.d.ts.map +1 -0
- package/dist/mcp-traffic.js +87 -0
- package/dist/mcp-traffic.js.map +1 -0
- package/dist/mcp.d.ts +7 -4
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +27 -8
- package/dist/mcp.js.map +1 -1
- package/dist/messaging/bullmq.d.ts +4 -0
- package/dist/messaging/bullmq.d.ts.map +1 -0
- package/dist/messaging/bullmq.js +137 -0
- package/dist/messaging/bullmq.js.map +1 -0
- package/dist/messaging/shared.d.ts +10 -4
- package/dist/messaging/shared.d.ts.map +1 -1
- package/dist/messaging/shared.js +13 -4
- package/dist/messaging/shared.js.map +1 -1
- package/dist/messaging/sqs-message.d.ts +35 -0
- package/dist/messaging/sqs-message.d.ts.map +1 -0
- package/dist/messaging/sqs-message.js +66 -0
- package/dist/messaging/sqs-message.js.map +1 -0
- package/dist/messaging/sqs.d.ts +4 -0
- package/dist/messaging/sqs.d.ts.map +1 -0
- package/dist/messaging/sqs.js +104 -0
- package/dist/messaging/sqs.js.map +1 -0
- package/dist/processor.d.ts +2 -1
- package/dist/processor.d.ts.map +1 -1
- package/dist/processor.js +8 -3
- package/dist/processor.js.map +1 -1
- package/dist/request-capture.d.ts +7 -1
- package/dist/request-capture.d.ts.map +1 -1
- package/dist/request-capture.js +14 -1
- package/dist/request-capture.js.map +1 -1
- package/dist/request-naming.d.ts +8 -0
- package/dist/request-naming.d.ts.map +1 -0
- package/dist/request-naming.js +29 -0
- package/dist/request-naming.js.map +1 -0
- package/dist/sampling.d.ts.map +1 -1
- package/dist/sampling.js +2 -2
- package/dist/sampling.js.map +1 -1
- package/dist/search-api.d.ts +8 -0
- package/dist/search-api.d.ts.map +1 -0
- package/dist/search-api.js +21 -0
- package/dist/search-api.js.map +1 -0
- package/dist/sourcemaps.d.ts +15 -0
- package/dist/sourcemaps.d.ts.map +1 -0
- package/dist/sourcemaps.js +68 -0
- package/dist/sourcemaps.js.map +1 -0
- package/dist/spans.d.ts +3 -0
- package/dist/spans.d.ts.map +1 -1
- package/dist/spans.js +9 -1
- package/dist/spans.js.map +1 -1
- package/dist/store-entries.d.ts +34 -0
- package/dist/store-entries.d.ts.map +1 -0
- package/dist/store-entries.js +70 -0
- package/dist/store-entries.js.map +1 -0
- package/dist/store.d.ts +4 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +19 -22
- package/dist/store.js.map +1 -1
- package/dist/tags-api.d.ts +9 -0
- package/dist/tags-api.d.ts.map +1 -0
- package/dist/tags-api.js +16 -0
- package/dist/tags-api.js.map +1 -0
- package/dist/tracing.d.ts +6 -0
- package/dist/tracing.d.ts.map +1 -1
- package/dist/tracing.js +11 -7
- package/dist/tracing.js.map +1 -1
- package/dist/types.d.ts +16 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +3 -2
- package/dist/ui.js.map +1 -1
- package/dist/wizelens.d.ts +3 -1
- package/dist/wizelens.d.ts.map +1 -1
- package/dist/wizelens.js +29 -13
- package/dist/wizelens.js.map +1 -1
- package/package.json +14 -4
package/dist/mcp-page.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { json, READ_ONLY } from "./mcp-shared.js";
|
|
3
|
+
import { rangeArg } from "./mcp-store.js";
|
|
4
|
+
/** The dashboard pages an agent may read, with what each holds and the parameters it takes. */
|
|
5
|
+
export const MCP_PAGES = {
|
|
6
|
+
overview: "Headlines, charts, top errors, insights, and services. service: a service name.",
|
|
7
|
+
services: "Every service with status, traffic, errors, and latency. service: the selected row.",
|
|
8
|
+
service: "One service: endpoints, dependencies, versions, and errors. service (required): a name.",
|
|
9
|
+
endpoint: "One endpoint: latency, errors, slowest requests, users affected. service, endpoint (\"GET /api/orders/{id}\"), both required.",
|
|
10
|
+
requests: "Request list with totals. method, status (5xx, 4xx, 200), duration (slow, >1s), service, endpoint, user, q, sort, page, size.",
|
|
11
|
+
traces: "Trace list. status (ok, error), duration, service, q, sort (time, duration), page, size.",
|
|
12
|
+
errors: "Error groups. status (unresolved, resolved, ignored, all), service, type, endpoint, user, critical=1, new=1, q, sort (recent, count), page, size.",
|
|
13
|
+
error: "One error group: occurrences over time, endpoints, users affected, stack trace. group (required): a group key from errors.",
|
|
14
|
+
database: "Queries by shape, slowest and most called, N+1 and slow query counts. service, q, table, operation, database, sort, page, size.",
|
|
15
|
+
query: "One query shape: calls, latency, endpoints. q (required): the shape from database.",
|
|
16
|
+
insights: "Performance insights (N+1, slow queries, duplicates). area, impact, status, service, endpoint, q, key.",
|
|
17
|
+
logs: "Log lines with level counts. level, exact=1, service, category, trace, user, q, page, size.",
|
|
18
|
+
rendering: "Browser page views and components. q.",
|
|
19
|
+
route: "One browser route. route (required).",
|
|
20
|
+
"log-patterns": "Log lines grouped into patterns, with counts. level, exact=1, service, pattern, origin.",
|
|
21
|
+
traffic: "Requests, errors, and latency per time bucket and per endpoint. service, endpoint, buckets (16, 24, 48), from, to (ms).",
|
|
22
|
+
problems: "Problems: anomalies grouped with a suspected cause. service, sensitivity (high, medium, low), problem, at, focus.",
|
|
23
|
+
uptime: "Uptime checks: status, response time, incidents. check (one check id).",
|
|
24
|
+
users: "Signed-in users by requests. q, page, size.",
|
|
25
|
+
user: "One user: requests, failures, errors they hit, slowest requests. user (required).",
|
|
26
|
+
};
|
|
27
|
+
const PAGE_NAMES = Object.keys(MCP_PAGES);
|
|
28
|
+
function registerGetPage(server, src) {
|
|
29
|
+
if (!src.defaults.overview)
|
|
30
|
+
return;
|
|
31
|
+
const inputSchema = {
|
|
32
|
+
...src.arg,
|
|
33
|
+
page: z.enum(PAGE_NAMES).describe(PAGE_NAMES.map((p) => `${p}: ${MCP_PAGES[p]}`).join(" | ")),
|
|
34
|
+
params: z.record(z.string(), z.string().max(500)).optional().describe("The page's parameters, as listed with `page`. Values are text."),
|
|
35
|
+
range: rangeArg("the page covers"),
|
|
36
|
+
};
|
|
37
|
+
const description = "Read one dashboard page's numbers, the same the dashboard shows, from the whole store. Pick the page and its parameters; for a list, page through with page and size.";
|
|
38
|
+
server.registerTool("get_page", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
39
|
+
const data = await src.open("get_page", args);
|
|
40
|
+
try {
|
|
41
|
+
return json(await data.page(args.page, args.range ?? "24h", args.params ?? {}));
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
return { ...json({ error: err instanceof Error ? err.message : String(err) }), isError: true };
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/** Where a rule sends, without the secret part (webhook URLs, routing keys, addresses). */
|
|
49
|
+
const channelKinds = (cs) => cs.map((c) => c.kind);
|
|
50
|
+
const ruleOf = (r) => {
|
|
51
|
+
const { channels, ...rest } = r;
|
|
52
|
+
return { ...rest, channels: channelKinds(channels) };
|
|
53
|
+
};
|
|
54
|
+
const iso = (ms) => (ms === null ? null : new Date(ms).toISOString());
|
|
55
|
+
function reportOf(a) {
|
|
56
|
+
const names = new Map(a.rules.map((r) => [r.id, r.name]));
|
|
57
|
+
return {
|
|
58
|
+
firing: a.rules.filter((r) => r.enabled && r.state === "firing").map((r) => r.name),
|
|
59
|
+
rules: a.rules.map((r) => ({ ...ruleOf(r), lastEval: iso(r.lastEvalMs), mutedUntil: iso(r.mutedUntilMs) })),
|
|
60
|
+
events: a.events.map((e) => ({ rule: names.get(e.ruleId) ?? e.ruleId, kind: e.kind, value: e.value, message: e.message, time: iso(e.timeMs) })),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function registerGetAlerts(server, src) {
|
|
64
|
+
if (!src.defaults.alerts)
|
|
65
|
+
return;
|
|
66
|
+
const description = "List alert rules (what each watches, its threshold, and whether it is firing) and the newest alert events. Channel secrets are left out.";
|
|
67
|
+
server.registerTool("get_alerts", { description, inputSchema: { ...src.arg }, annotations: READ_ONLY }, async (args) => {
|
|
68
|
+
const data = await src.open("get_alerts", args);
|
|
69
|
+
return json(reportOf(await data.alerts()));
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/** get_page and get_alerts. */
|
|
73
|
+
export function registerPageTools(server, src) {
|
|
74
|
+
registerGetPage(server, src);
|
|
75
|
+
registerGetAlerts(server, src);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=mcp-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-page.js","sourceRoot":"","sources":["../src/mcp-page.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
|
+
/** list_problems: services and endpoints above their normal, grouped into problems with a suspected cause. */
|
|
4
|
+
export declare function registerProblemTools(server: McpServer, src: Source): void;
|
|
5
|
+
//# sourceMappingURL=mcp-problems.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-problems.d.ts","sourceRoot":"","sources":["../src/mcp-problems.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAwD,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AA4CpG,8GAA8G;AAC9G,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAazE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { causeText } from "@wizeworks/lens-core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { json, READ_ONLY } from "./mcp-shared.js";
|
|
4
|
+
const RANGES = ["1h", "6h", "24h", "7d"];
|
|
5
|
+
const iso = (ms) => new Date(ms).toISOString();
|
|
6
|
+
const round = (v) => Math.round(v * 100) / 100;
|
|
7
|
+
const anomalyOf = (a) => ({
|
|
8
|
+
metric: a.metric,
|
|
9
|
+
service: a.name,
|
|
10
|
+
endpoint: a.endpoint,
|
|
11
|
+
started: iso(a.startMs),
|
|
12
|
+
ongoing: a.ongoing,
|
|
13
|
+
value: round(a.peak.value),
|
|
14
|
+
normal: round(a.peak.normal),
|
|
15
|
+
alertsAbove: round(a.peak.upper),
|
|
16
|
+
});
|
|
17
|
+
const problemOf = (p) => ({
|
|
18
|
+
id: p.id,
|
|
19
|
+
title: p.title,
|
|
20
|
+
started: iso(p.startMs),
|
|
21
|
+
ended: p.ongoing ? null : iso(p.endMs),
|
|
22
|
+
ongoing: p.ongoing,
|
|
23
|
+
services: p.services.map((s) => `${s.name} (${s.kind})`),
|
|
24
|
+
suspectedCause: p.cause ? causeText(p.cause) : null,
|
|
25
|
+
otherCauses: p.causes.slice(1).map(causeText),
|
|
26
|
+
anomalies: p.anomalies.map(anomalyOf),
|
|
27
|
+
moreAnomalies: p.anomalyCount - p.anomalies.length,
|
|
28
|
+
});
|
|
29
|
+
function reportOf(m) {
|
|
30
|
+
const normal = m.baseline.mode === "week" ? "the same hour in earlier weeks" : "the same hour on earlier days";
|
|
31
|
+
return {
|
|
32
|
+
window: { from: iso(m.meta.window.from), to: iso(m.meta.window.to) },
|
|
33
|
+
baseline: m.baseline.learning ? `learning: needs two earlier ${m.baseline.mode}s with data, has ${m.baseline.samples}` : `normal is ${normal} (${m.baseline.samples} with data)`,
|
|
34
|
+
problems: m.total,
|
|
35
|
+
ongoing: m.ongoing,
|
|
36
|
+
list: m.problems.map(problemOf),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const problemsOf = async (data, range) => reportOf(await data.page("problems", range));
|
|
40
|
+
/** list_problems: services and endpoints above their normal, grouped into problems with a suspected cause. */
|
|
41
|
+
export function registerProblemTools(server, src) {
|
|
42
|
+
if (!src.defaults.overview)
|
|
43
|
+
return;
|
|
44
|
+
const inputSchema = { ...src.arg, range: z.enum(RANGES).optional().describe("Time range to look for problems in. Default 24h.") };
|
|
45
|
+
const description = "Problems: error rate, p95 duration, or traffic above normal (the same hour in earlier weeks, plain statistics) on services and endpoints that call each other, grouped by when they started. Each names a suspected cause: a new release, a new error group, a query, or a service further down the calls. Ongoing problems come first. Without `project` on a multi-project host, it covers every project.";
|
|
46
|
+
server.registerTool("list_problems", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
47
|
+
const range = args.range ?? "24h";
|
|
48
|
+
const named = args.project;
|
|
49
|
+
if (named || !src.each)
|
|
50
|
+
return json({ range, ...(await problemsOf(await src.open("list_problems", args), range)) });
|
|
51
|
+
const all = await src.each("list_problems", args);
|
|
52
|
+
const projects = await Promise.all(all.map(async ({ project, data }) => ({ project: project.name, projectId: project.id, ...(await problemsOf(data, range)) })));
|
|
53
|
+
return json({ range, projects: projects.sort((a, b) => b.ongoing - a.ongoing || b.problems - a.problems) });
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=mcp-problems.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-problems.js","sourceRoot":"","sources":["../src/mcp-problems.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,CAmBrD;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,GAAG,IAAI,CAM5E"}
|
|
@@ -0,0 +1,54 @@
|
|
|
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, overview: !!data.page, alerts: !!data.alerts },
|
|
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, overview: !!m.overview, alerts: !!m.alerts },
|
|
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
|
+
each: (tool, args) => Promise.all(m.projects.map(async (project) => {
|
|
40
|
+
const data = await m.open(project.id);
|
|
41
|
+
data.audit(auditLine(data.service, tool, args));
|
|
42
|
+
return { project, data };
|
|
43
|
+
})),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** list_projects: the projects this key reads, for the `project` argument. */
|
|
47
|
+
export function registerProjectTools(server, m) {
|
|
48
|
+
const description = "List the projects this key can read. Pass one's id or name as `project` to the other tools.";
|
|
49
|
+
server.registerTool("list_projects", { description, inputSchema: {}, annotations: READ_ONLY }, async (args) => {
|
|
50
|
+
m.audit(auditLine(m.service, "list_projects", args));
|
|
51
|
+
return json(m.projects.map((p) => ({ id: p.id, name: p.name })));
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# 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,EAAU,MAAM,iBAAiB,CAAC;AAgDvE,kGAAkG;AAClG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAGxE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { activeTags, checkSearch, decodeCursor, expandQuery, SEARCH_KINDS, searchMemory, suggestMemory, suggestTags } from "@wizeworks/lens-core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { json, READ_ONLY, tagsOf } from "./mcp-shared.js";
|
|
4
|
+
import { pageTags } from "./mcp-tags.js";
|
|
5
|
+
import { RANGES, windowOf } from "./mcp-store.js";
|
|
6
|
+
const LANGUAGE = [
|
|
7
|
+
"Search language: words and \"phrases\" match text (path, SQL, messages, errors).",
|
|
8
|
+
"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.",
|
|
9
|
+
"@attribute:value for any span or log attribute, such as @user.id:42 or @db.system.name:postgres.",
|
|
10
|
+
"Use >, >=, <, <= (status:>=500, duration:>1s), ranges a..b, * wildcards (path:/api/*), -term or NOT to exclude, OR, and parentheses.",
|
|
11
|
+
"tag:name matches a tag rule (list_tags) or a tag the app sets; results come with the tags on each.",
|
|
12
|
+
].join(" ");
|
|
13
|
+
function registerSearch(server, src) {
|
|
14
|
+
const inputSchema = {
|
|
15
|
+
...src.arg,
|
|
16
|
+
q: z.string().max(2000).describe("The search. Empty finds everything in the range."),
|
|
17
|
+
kind: z.enum(SEARCH_KINDS).optional().describe("What to find: requests (default), traces, spans, or logs."),
|
|
18
|
+
range: z.enum(RANGES).optional().describe("How far back: 15m, 1h, 6h, 24h (default), 7d, 30d."),
|
|
19
|
+
limit: z.number().int().min(1).max(200).optional().describe("Results per page. Default 20."),
|
|
20
|
+
cursor: z.string().optional().describe("The `next` value of the last page, for the next page."),
|
|
21
|
+
};
|
|
22
|
+
const description = `Search requests, traces, spans, and logs, newest first. ${LANGUAGE}`;
|
|
23
|
+
server.registerTool("search", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
24
|
+
const data = await src.open("search", args);
|
|
25
|
+
const parsed = checkSearch(args.q);
|
|
26
|
+
if (!parsed.ok)
|
|
27
|
+
return { ...json({ error: parsed.error, start: parsed.start, end: parsed.end }), isError: true };
|
|
28
|
+
const raw = { kind: (args.kind ?? "requests"), node: parsed.node, window: windowOf(data, args.range ?? "24h"), limit: args.limit ?? 20, cursor: decodeCursor(args.cursor), env: data.env };
|
|
29
|
+
const { query, unknownTags } = expandQuery(raw, activeTags(await tagsOf(data)));
|
|
30
|
+
const page = await (data.search ? data.search(query) : searchMemory(await data.all(), query));
|
|
31
|
+
return json({ ...page, tags: await pageTags(data, page), unknownTags });
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function registerFields(server, src) {
|
|
35
|
+
const inputSchema = {
|
|
36
|
+
...src.arg,
|
|
37
|
+
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."),
|
|
38
|
+
prefix: z.string().max(200).optional().describe("Only names or values that start with this."),
|
|
39
|
+
range: z.enum(RANGES).optional().describe("Which data to read. Default 24h."),
|
|
40
|
+
};
|
|
41
|
+
const description = "List search fields, attribute keys seen in the data, or the common values of one field, to build a search.";
|
|
42
|
+
server.registerTool("search_fields", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
43
|
+
const data = await src.open("search_fields", args);
|
|
44
|
+
const r = { field: args.field || null, prefix: args.prefix ?? "", window: windowOf(data, args.range ?? "24h"), limit: 50, env: data.env };
|
|
45
|
+
return json(suggestTags(r, await tagsOf(data)) ?? (await (data.suggest ? data.suggest(r) : suggestMemory(await data.all(), r))));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/** search and search_fields: the search language, on the host's store or on `all()` in memory. */
|
|
49
|
+
export function registerSearchTools(server, src) {
|
|
50
|
+
registerSearch(server, src);
|
|
51
|
+
registerFields(server, src);
|
|
52
|
+
}
|
|
53
|
+
//# 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,20 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ZodTypeAny } from "zod";
|
|
2
|
+
import { type AlertRule, type MetricsModel, type ModelOf, type PageName, type SearchPage, type SearchQuery, type Suggestion, type SuggestRequest, type TagRule, type TimeRange, type Trace } from "@wizeworks/lens-core";
|
|
3
|
+
/** The page models get_overview, list_problems, get_timeseries, and group_requests read. */
|
|
4
|
+
export type OverviewPage = "overview" | "services" | "errors" | "problems" | "traffic";
|
|
5
|
+
/** One alert event, as get_alerts lists it. */
|
|
6
|
+
export interface McpAlertEvent {
|
|
7
|
+
ruleId: string;
|
|
8
|
+
kind: string;
|
|
9
|
+
value: number | null;
|
|
10
|
+
message: string;
|
|
11
|
+
timeMs: number;
|
|
12
|
+
}
|
|
13
|
+
/** The host's alert rules and their newest events. */
|
|
14
|
+
export interface McpAlerts {
|
|
15
|
+
rules: AlertRule[];
|
|
16
|
+
events: McpAlertEvent[];
|
|
17
|
+
}
|
|
2
18
|
/** What the MCP tools can read. Read-only by design. */
|
|
3
19
|
export interface McpDataSource {
|
|
4
20
|
service: string;
|
|
@@ -7,16 +23,79 @@ export interface McpDataSource {
|
|
|
7
23
|
slowQueryMs: number;
|
|
8
24
|
/** Default repeats for find_n_plus_one. */
|
|
9
25
|
nPlusOneThreshold: number;
|
|
10
|
-
|
|
11
|
-
all(): Trace[]
|
|
26
|
+
/** Recent traces, newest first, for the tools that read whole traces in memory. A host may load them only when a tool asks. */
|
|
27
|
+
all(): Trace[] | Promise<Trace[]>;
|
|
28
|
+
/** With `search`: the traces the store's search does not have yet (not settled). Default `all()`. */
|
|
29
|
+
unsettled?(): Trace[] | Promise<Trace[]>;
|
|
12
30
|
get(traceId: string, federate: boolean): Promise<Trace | undefined>;
|
|
13
31
|
audit(line: string): void;
|
|
14
32
|
/** The metrics page for a range and page parameters. Without it, the metric tools are left out. */
|
|
15
33
|
metrics?(range: TimeRange, params: Record<string, string>): MetricsModel | Promise<MetricsModel>;
|
|
16
34
|
/** Ranges the metric tools offer, shortest first. Default all. */
|
|
17
35
|
metricRanges?: readonly TimeRange[];
|
|
36
|
+
/** Search on the host's store. Without it, the search, list, error, and slow query tools read `all()` in memory. */
|
|
37
|
+
search?(q: SearchQuery): SearchPage | Promise<SearchPage>;
|
|
38
|
+
/** Autocomplete on the host's store. Without it, `all()` in memory. */
|
|
39
|
+
suggest?(r: SuggestRequest): Suggestion[] | Promise<Suggestion[]>;
|
|
40
|
+
/** The host's clock, for search ranges. Default Date.now. */
|
|
41
|
+
now?(): number;
|
|
42
|
+
/** The environment memory search gives this service's documents (in-app), as the HTTP search does. */
|
|
43
|
+
env?: string;
|
|
44
|
+
/** One dashboard page's model, from the host's stats, with the page's parameters. Without it, get_overview and get_page are left out. */
|
|
45
|
+
page?<P extends PageName>(page: P, range: TimeRange, params?: Record<string, string>): Promise<ModelOf<P>>;
|
|
46
|
+
/** Alert rules and their newest events. Without it, get_alerts is left out. */
|
|
47
|
+
alerts?(): Promise<McpAlerts>;
|
|
48
|
+
/** The project's tags (docs/TAGS-PLAN.md). Without it, only the built-ins. */
|
|
49
|
+
tags?(): readonly TagRule[] | Promise<readonly TagRule[]>;
|
|
50
|
+
}
|
|
51
|
+
/** The tags a tool reads: the host's, or the built-ins. */
|
|
52
|
+
export declare const tagsOf: (data: McpDataSource) => Promise<readonly TagRule[]>;
|
|
53
|
+
/** One project a multi-project host serves. */
|
|
54
|
+
export interface McpProject {
|
|
55
|
+
id: string;
|
|
56
|
+
name: string;
|
|
57
|
+
}
|
|
58
|
+
/** A host that serves several projects (the cloud with a read key for many). Tools then take a `project` argument. */
|
|
59
|
+
export interface McpProjects {
|
|
60
|
+
service: string;
|
|
61
|
+
version: string;
|
|
62
|
+
slowQueryMs: number;
|
|
63
|
+
nPlusOneThreshold: number;
|
|
64
|
+
/** True when every project has the metric tools. */
|
|
65
|
+
metrics: boolean;
|
|
66
|
+
metricRanges?: readonly TimeRange[];
|
|
67
|
+
/** True when every project has get_overview and get_page. */
|
|
68
|
+
overview?: boolean;
|
|
69
|
+
/** True when every project has get_alerts. */
|
|
70
|
+
alerts?: boolean;
|
|
71
|
+
projects: readonly McpProject[];
|
|
72
|
+
/** The data of one project from `projects`. */
|
|
73
|
+
open(projectId: string): Promise<McpDataSource>;
|
|
74
|
+
/** Audit for calls that read no project (list_projects). */
|
|
75
|
+
audit(line: string): void;
|
|
76
|
+
}
|
|
77
|
+
/** Defaults and features the tools are registered with: the same for every project. */
|
|
78
|
+
export interface McpDefaults {
|
|
79
|
+
slowQueryMs: number;
|
|
80
|
+
nPlusOneThreshold: number;
|
|
81
|
+
metrics: boolean;
|
|
82
|
+
metricRanges?: readonly TimeRange[];
|
|
83
|
+
overview: boolean;
|
|
84
|
+
alerts: boolean;
|
|
85
|
+
}
|
|
86
|
+
/** Where the tools read. */
|
|
87
|
+
export interface Source {
|
|
88
|
+
defaults: McpDefaults;
|
|
89
|
+
/** The `project` argument, on a multi-project host; else empty. */
|
|
90
|
+
arg: Record<string, ZodTypeAny>;
|
|
91
|
+
/** The data for one tool call, after the call is audited. */
|
|
92
|
+
open(tool: string, args: object): Promise<McpDataSource>;
|
|
93
|
+
/** Several projects: the data of each, for a call that names none. Each one is audited. */
|
|
94
|
+
each?(tool: string, args: object): Promise<{
|
|
95
|
+
project: McpProject;
|
|
96
|
+
data: McpDataSource;
|
|
97
|
+
}[]>;
|
|
18
98
|
}
|
|
19
|
-
export type Audit = (tool: string, args: unknown) => void;
|
|
20
99
|
export declare const READ_ONLY: {
|
|
21
100
|
readOnlyHint: boolean;
|
|
22
101
|
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,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"mcp-shared.d.ts","sourceRoot":"","sources":["../src/mcp-shared.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-shared.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { tagList } from "@wizeworks/lens-core";
|
|
2
|
+
/** The tags a tool reads: the host's, or the built-ins. */
|
|
3
|
+
export const tagsOf = async (data) => (data.tags ? await data.tags() : tagList([], new Set()));
|
|
1
4
|
export const READ_ONLY = { readOnlyHint: true, openWorldHint: false };
|
|
2
5
|
export const json = (value) => ({
|
|
3
6
|
content: [{ type: "text", text: JSON.stringify(value, null, 2) }],
|
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":"AACA,OAAO,EAAyJ,OAAO,EAA8B,MAAM,sBAAsB,CAAC;AAsDlO,2DAA2D;AAC3D,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAE,IAAmB,EAA+B,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;AAiD3I,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 traces it has not indexed yet (they are indexed once they go quiet). `tag:` reads the host's tags. */
|
|
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,EAAqD,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAA+C,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC1M,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,aAAa,EAAU,MAAM,iBAAiB,CAAC;AAG7D,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,iLAAiL;AACjL,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,56 @@
|
|
|
1
|
+
import { activeTags, checkSearch, decodeCursor, expandTags, searchMemory, TIME_RANGES } from "@wizeworks/lens-core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { tagsOf } from "./mcp-shared.js";
|
|
4
|
+
// Tools that read the whole store through search, not a slice of recent traces (docs/SEARCH-PLAN.md, "MCP").
|
|
5
|
+
export const RANGES = Object.keys(TIME_RANGES);
|
|
6
|
+
export const rangeArg = (what) => z.enum(RANGES).optional().describe(`How far back ${what}: 15m, 1h, 6h, 24h (default), 7d, 30d.`);
|
|
7
|
+
const PAGE = 200;
|
|
8
|
+
export const windowOf = (data, range) => {
|
|
9
|
+
const now = data.now?.() ?? Date.now();
|
|
10
|
+
return { from: now - TIME_RANGES[range].ms, to: now };
|
|
11
|
+
};
|
|
12
|
+
const idOf = (item) => {
|
|
13
|
+
const r = item;
|
|
14
|
+
return r.key ?? (r.spanId ? `${r.traceId}:${r.spanId}` : r.traceId);
|
|
15
|
+
};
|
|
16
|
+
const timeOf = (item) => {
|
|
17
|
+
const r = item;
|
|
18
|
+
return r.startMs ?? r.timeMs ?? 0;
|
|
19
|
+
};
|
|
20
|
+
/** Store pages, newest first, up to `max`. */
|
|
21
|
+
async function storePages(data, base, max) {
|
|
22
|
+
const out = [];
|
|
23
|
+
let cursor = null;
|
|
24
|
+
do {
|
|
25
|
+
const page = await data.search({ ...base, limit: Math.min(PAGE, max - out.length), cursor: decodeCursor(cursor) });
|
|
26
|
+
out.push(...page.items);
|
|
27
|
+
cursor = page.next;
|
|
28
|
+
} while (cursor && out.length < max);
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
/** The matches of a search, newest first, up to `max`: the store, plus the traces it has not indexed yet (they are indexed once they go quiet). `tag:` reads the host's tags. */
|
|
32
|
+
export async function findAll(data, kind, node, range, max) {
|
|
33
|
+
const base = { kind, node: expandTags(node, activeTags(await tagsOf(data))).node, window: windowOf(data, range), env: data.env };
|
|
34
|
+
if (!data.search)
|
|
35
|
+
return searchMemory(await data.all(), { ...base, limit: max }).items;
|
|
36
|
+
const recent = searchMemory(await (data.unsettled ?? data.all)(), { ...base, limit: max }).items;
|
|
37
|
+
const seen = new Map();
|
|
38
|
+
for (const item of [...(await storePages(data, base, max)), ...recent])
|
|
39
|
+
seen.set(idOf(item), item);
|
|
40
|
+
return [...seen.values()].sort((a, b) => timeOf(b) - timeOf(a)).slice(0, max);
|
|
41
|
+
}
|
|
42
|
+
/** Every part must hold: tool filters as search text, and the caller's own search. Null parts are left out. */
|
|
43
|
+
export function allOf(parts) {
|
|
44
|
+
const items = [];
|
|
45
|
+
for (const part of parts) {
|
|
46
|
+
if (!part)
|
|
47
|
+
continue;
|
|
48
|
+
const r = checkSearch(part);
|
|
49
|
+
if (!r.ok)
|
|
50
|
+
return { ok: false, error: `${r.error} (in "${part}")` };
|
|
51
|
+
if (r.node)
|
|
52
|
+
items.push(r.node);
|
|
53
|
+
}
|
|
54
|
+
return { ok: true, node: items.length === 0 ? null : items.length === 1 ? items[0] : { type: "and", items } };
|
|
55
|
+
}
|
|
56
|
+
//# 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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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { type SearchPage, type TagMatches } from "@wizeworks/lens-core";
|
|
3
|
+
import { type McpDataSource, type Source } from "./mcp-shared.js";
|
|
4
|
+
/** The tags on each result of a page, keyed by "traceId owner" as `api/tags/match` answers. */
|
|
5
|
+
export declare function pageTags(data: McpDataSource, page: SearchPage): Promise<TagMatches>;
|
|
6
|
+
/** list_tags: the tags `tag:name` reads, with their searches. */
|
|
7
|
+
export declare function registerTagTools(server: McpServer, src: Source): void;
|
|
8
|
+
//# sourceMappingURL=mcp-tags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tags.d.ts","sourceRoot":"","sources":["../src/mcp-tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAoC,KAAK,UAAU,EAAkC,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC1I,OAAO,EAAQ,KAAK,aAAa,EAAa,KAAK,MAAM,EAAU,MAAM,iBAAiB,CAAC;AAO3F,+FAA+F;AAC/F,wBAAsB,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAMzF;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAMrE"}
|
package/dist/mcp-tags.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { activeTags, itemOwner, matchTags, searchMemory } from "@wizeworks/lens-core";
|
|
2
|
+
import { json, READ_ONLY, tagsOf } from "./mcp-shared.js";
|
|
3
|
+
// Tags for AI tools (docs/TAGS-PLAN.md): the project's tag rules, and which of them match a page of search results.
|
|
4
|
+
/** Runs one search page on the host's store, or in memory. */
|
|
5
|
+
const runnerOf = (data) => async (q) => (data.search ? data.search(q) : searchMemory(await data.all(), q));
|
|
6
|
+
/** The tags on each result of a page, keyed by "traceId owner" as `api/tags/match` answers. */
|
|
7
|
+
export async function pageTags(data, page) {
|
|
8
|
+
const items = page.items.map((item) => {
|
|
9
|
+
const r = item;
|
|
10
|
+
return { traceId: r.traceId, owner: itemOwner(page.kind, item), timeMs: r.startMs ?? r.timeMs ?? 0 };
|
|
11
|
+
});
|
|
12
|
+
return matchTags(runnerOf(data), page.kind, items, activeTags(await tagsOf(data)), data.env);
|
|
13
|
+
}
|
|
14
|
+
/** list_tags: the tags `tag:name` reads, with their searches. */
|
|
15
|
+
export function registerTagTools(server, src) {
|
|
16
|
+
const description = "List the project's tags: built-in and custom tag rules, each a name for a search. Use tag:name in search, list_traces q, or anything that takes a search.";
|
|
17
|
+
server.registerTool("list_tags", { description, inputSchema: { ...src.arg }, annotations: READ_ONLY }, async (args) => {
|
|
18
|
+
const data = await src.open("list_tags", args);
|
|
19
|
+
return json((await tagsOf(data)).map(({ name, query, builtIn, enabled }) => ({ name, query, builtIn, enabled })));
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=mcp-tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tags.js","sourceRoot":"","sources":["../src/mcp-tags.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAqC,YAAY,EAAmB,MAAM,sBAAsB,CAAC;AAC1I,OAAO,EAAE,IAAI,EAAsB,SAAS,EAAe,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE3F,oHAAoH;AAEpH,8DAA8D;AAC9D,MAAM,QAAQ,GAAG,CAAC,IAAmB,EAAE,EAAE,CAAC,KAAK,EAAE,CAAc,EAAuB,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAE5J,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAmB,EAAE,IAAgB;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,MAAM,CAAC,GAAG,IAA8D,CAAC;QACzE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IACvG,CAAC,CAAC,CAAC;IACH,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/F,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,GAAW;IAC7D,MAAM,WAAW,GAAG,2JAA2J,CAAC;IAChL,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACpH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACpH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
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"}
|