qyl-mcp-server 7.1.1 → 7.2.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.
Files changed (55) hide show
  1. package/README.md +71 -11
  2. package/dist/ci.d.ts +5 -5
  3. package/dist/ci.js +23 -18
  4. package/dist/ci.js.map +1 -1
  5. package/dist/collector-access.d.ts +17 -0
  6. package/dist/collector-access.js +61 -0
  7. package/dist/collector-access.js.map +1 -0
  8. package/dist/collector.d.ts +4 -1
  9. package/dist/collector.js +6 -2
  10. package/dist/collector.js.map +1 -1
  11. package/dist/config.d.ts +4 -3
  12. package/dist/config.js +5 -5
  13. package/dist/config.js.map +1 -1
  14. package/dist/contract-operations.d.ts +1 -1
  15. package/dist/contract-operations.js +1 -1
  16. package/dist/contract-operations.js.map +1 -1
  17. package/dist/contract-validation.d.ts +1 -1
  18. package/dist/contract-validation.js +45 -1
  19. package/dist/contract-validation.js.map +1 -1
  20. package/dist/events-authorization.js +1 -1
  21. package/dist/events-authorization.js.map +1 -1
  22. package/dist/events.d.ts +5 -4
  23. package/dist/events.js +88 -37
  24. package/dist/events.js.map +1 -1
  25. package/dist/main.d.ts +3 -6
  26. package/dist/main.js +18 -8
  27. package/dist/main.js.map +1 -1
  28. package/dist/mcp-app.html +1 -1
  29. package/dist/mcp-dashboard.html +1 -1
  30. package/dist/mcp-home.html +3 -3
  31. package/dist/metrics-tools.js +12 -12
  32. package/dist/metrics-tools.js.map +1 -1
  33. package/dist/native-execution.d.ts +8 -52
  34. package/dist/native-execution.js +51 -222
  35. package/dist/native-execution.js.map +1 -1
  36. package/dist/request-scope.d.ts +4 -12
  37. package/dist/request-scope.js +9 -22
  38. package/dist/request-scope.js.map +1 -1
  39. package/dist/server.d.ts +4 -3
  40. package/dist/server.js +36 -25
  41. package/dist/server.js.map +1 -1
  42. package/dist/summaries.d.ts +1 -1
  43. package/dist/summaries.js +2 -2
  44. package/dist/summaries.js.map +1 -1
  45. package/dist/telemetry-redaction.js +13 -0
  46. package/dist/telemetry-redaction.js.map +1 -1
  47. package/dist/tools.js +65 -18
  48. package/dist/tools.js.map +1 -1
  49. package/dist/trace-query.d.ts +5 -0
  50. package/dist/trace-query.js +8 -0
  51. package/dist/trace-query.js.map +1 -0
  52. package/dist/ui-domain.d.ts +4 -0
  53. package/dist/ui-domain.js +28 -0
  54. package/dist/ui-domain.js.map +1 -0
  55. package/package.json +5 -4
package/dist/tools.js CHANGED
@@ -24,18 +24,55 @@ export const TELEMETRY_TOOL_AUTH_META = {
24
24
  };
25
25
  /** Re-exported for the callers that learned it here; it lives with `runTool`. */
26
26
  export { toolError } from "./request-scope.js";
27
+ function withoutAttributes(value) {
28
+ const rest = { ...value };
29
+ delete rest.attributes;
30
+ return rest;
31
+ }
32
+ function omitSpanAttributes(span) {
33
+ return {
34
+ ...withoutAttributes(span),
35
+ resource: withoutAttributes(span.resource),
36
+ ...(span.events === undefined ? {} : { events: span.events.map(withoutAttributes) }),
37
+ ...(span.links === undefined ? {} : { links: span.links.map(withoutAttributes) }),
38
+ ...(span.instrumentation_scope === undefined ? {} : {
39
+ instrumentation_scope: withoutAttributes(span.instrumentation_scope),
40
+ }),
41
+ };
42
+ }
43
+ function projectTrace(trace, args) {
44
+ const matching = args.errors_only
45
+ ? trace.spans.filter((span) => span.status.code === 2)
46
+ : trace.spans;
47
+ const selected = matching.slice(0, args.max_spans);
48
+ const projectSpan = args.include_attributes === false ? omitSpanAttributes : (span) => span;
49
+ const { root_span: root, ...summary } = trace;
50
+ // A separate root copy must not reintroduce a span excluded by the filter or cap.
51
+ const selectedRoot = !args.errors_only && args.max_spans === undefined
52
+ ? root
53
+ : selected.find((span) => span.span_id === root?.span_id);
54
+ return {
55
+ trace: {
56
+ ...summary,
57
+ spans: selected.map(projectSpan),
58
+ ...(selectedRoot === undefined ? {} : { root_span: projectSpan(selectedRoot) }),
59
+ },
60
+ matchingSpanCount: matching.length,
61
+ };
62
+ }
27
63
  /** Register the four model-visible read tools against published contract schemas. */
28
64
  export function registerTelemetryTools(server) {
29
65
  server.registerTool("list_traces", {
30
66
  title: "List Traces",
31
- description: "List recent qyl traces with summary fields (root span, services, duration, " +
32
- "span count, error flag). Spans are omitted — use get_trace for full span data. " +
33
- "Use display_traces instead when the user wants to LOOK at traces in the explorer UI.",
67
+ description: "List recent qyl traces when the user wants a compact overview of activity " +
68
+ "and failures: root span, services, duration, span count, and error flag. " +
69
+ "Spans are omitted; get_trace returns the full span tree, while display_traces " +
70
+ "provides the interactive explorer.",
34
71
  inputSchema: ListTracesInputSchema,
35
72
  outputSchema: compactOutputSchema(ListTracesOutputSchema),
36
73
  annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
37
74
  _meta: TELEMETRY_TOOL_AUTH_META,
38
- }, (args, ctx) => runTool(ctx, "list_traces", 1, async (scope) => {
75
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => {
39
76
  const { traces, mode } = await fetchTraces(args.limit ?? 20, scope.collector);
40
77
  await scope.step(`Fetched ${traces.length} trace(s)`);
41
78
  const output = {
@@ -46,29 +83,39 @@ export function registerTelemetryTools(server) {
46
83
  }));
47
84
  server.registerTool("get_trace", {
48
85
  title: "Get Trace",
49
- description: "Fetch a single qyl trace by trace id, including every span with timing, " +
50
- "attributes, events, and status. Use display_traces instead when the user " +
51
- "wants to SEE the trace waterfall.",
86
+ description: "Fetch a single qyl trace by trace_id when the user wants span timing, " +
87
+ "events, status, and attributes. By default returns all spans; errors_only " +
88
+ "keeps error spans, max_spans caps them after filtering in Collector order, " +
89
+ "and include_attributes=false omits attribute collections. Trace totals " +
90
+ "are preserved and the summary reports returned and matching counts. " +
91
+ "The root span is omitted when excluded by the filter or cap. " +
92
+ "display_traces provides the visual waterfall.",
52
93
  inputSchema: GetTraceInputSchema,
53
94
  outputSchema: compactOutputSchema(GetTraceOutputSchema),
54
95
  annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
55
96
  _meta: TELEMETRY_TOOL_AUTH_META,
56
- }, (args, ctx) => runTool(ctx, "get_trace", 1, async (scope) => {
97
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => {
57
98
  const { trace, mode } = await fetchTrace(args.trace_id, scope.collector);
58
99
  await scope.step(`Fetched trace ${args.trace_id} (${trace.span_count} spans)`);
59
- const output = { trace, mode };
60
- return telemetryToolResult(summarizeTrace(trace, mode), output);
100
+ const projected = projectTrace(trace, args);
101
+ const output = { trace: projected.trace, mode };
102
+ const rootExcluded = trace.root_span !== undefined && projected.trace.root_span === undefined;
103
+ const summary = summarizeTrace(projected.trace, mode, rootExcluded) +
104
+ `\nReturned ${projected.trace.spans.length} of ${projected.matchingSpanCount} matching spans ` +
105
+ `(${trace.span_count} total)${args.errors_only ? "; error status only" : ""}.` +
106
+ (args.include_attributes === false ? " Attribute collections omitted." : "");
107
+ return telemetryToolResult(summary, output);
61
108
  }));
62
109
  server.registerTool("list_sessions", {
63
110
  title: "List Sessions",
64
- description: "List qyl sessions with trace/span/error counts, state, and GenAI token " +
65
- "usage where present. Pass a session id to display_traces to see a " +
66
- "session's traces in the explorer UI.",
111
+ description: "List qyl sessions when the user wants to find active or failing sessions, " +
112
+ "with trace/span/error counts, state, and GenAI token usage where present. " +
113
+ "display_traces accepts a session_id to show that session's traces in the explorer.",
67
114
  inputSchema: ListSessionsInputSchema,
68
115
  outputSchema: compactOutputSchema(ListSessionsOutputSchema),
69
116
  annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
70
117
  _meta: TELEMETRY_TOOL_AUTH_META,
71
- }, (args, ctx) => runTool(ctx, "list_sessions", 1, async (scope) => {
118
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => {
72
119
  const { sessions, mode } = await fetchSessions(args.limit ?? 20, args.active_only, scope.collector);
73
120
  await scope.step(`Fetched ${sessions.length} session(s)`);
74
121
  const output = { sessions, mode };
@@ -76,14 +123,14 @@ export function registerTelemetryTools(server) {
76
123
  }));
77
124
  server.registerTool("search_logs", {
78
125
  title: "Search Logs",
79
- description: "Search qyl log records, filterable by trace id (correlated logs), service " +
80
- "name, minimum severity (OTel numbers: 9 INFO, 13 WARN, 17 ERROR), and a " +
81
- "body substring query.",
126
+ description: "Search qyl log records when the user wants error details or logs correlated " +
127
+ "with a trace. Filters include trace_id, service_name, minimum severity " +
128
+ "(OTel numbers: 9 INFO, 13 WARN, 17 ERROR), and a body substring query.",
82
129
  inputSchema: SearchLogsInputSchema,
83
130
  outputSchema: compactOutputSchema(SearchLogsOutputSchema),
84
131
  annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
85
132
  _meta: TELEMETRY_TOOL_AUTH_META,
86
- }, (args, ctx) => runTool(ctx, "search_logs", 1, async (scope) => {
133
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => {
87
134
  const { logs, mode } = await fetchLogs({
88
135
  trace_id: args.trace_id,
89
136
  service_name: args.service_name,
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { DisplayTracesInput } from "@ancplua/qyl-api-schema/types";
2
+ import type { CallToolResult } from "@modelcontextprotocol/server";
3
+ export declare const TRACE_QUERY_META_KEY = "qyl/traceQuery";
4
+ /** Restore the query with its result when a host opens or recreates the viewer. */
5
+ export declare function traceQueryForResult(result: Pick<CallToolResult, "_meta">, fallback: DisplayTracesInput): DisplayTracesInput;
@@ -0,0 +1,8 @@
1
+ import { DisplayTracesInputSchema } from "./contract-validation.js";
2
+ export const TRACE_QUERY_META_KEY = "qyl/traceQuery";
3
+ /** Restore the query with its result when a host opens or recreates the viewer. */
4
+ export function traceQueryForResult(result, fallback) {
5
+ const parsed = DisplayTracesInputSchema.safeParse(result._meta?.[TRACE_QUERY_META_KEY]);
6
+ return parsed.success ? parsed.data : fallback;
7
+ }
8
+ //# sourceMappingURL=trace-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-query.js","sourceRoot":"","sources":["../src/trace-query.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAErD,mFAAmF;AACnF,MAAM,UAAU,mBAAmB,CACjC,MAAqC,EACrC,QAA4B;IAE5B,MAAM,MAAM,GAAG,wBAAwB,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACxF,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;AACjD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type ServerContext } from "@modelcontextprotocol/server";
2
+ export type UiDomain = string | ((context: ServerContext) => string | undefined);
3
+ /** Client hints select presentation metadata only, never credentials or access. */
4
+ export declare function hostedUiDomain(publicMcpUrl: string): (context: ServerContext) => string | undefined;
@@ -0,0 +1,28 @@
1
+ import { createHash } from "node:crypto";
2
+ import { CLIENT_INFO_META_KEY } from "@modelcontextprotocol/server";
3
+ /** Client hints select presentation metadata only, never credentials or access. */
4
+ export function hostedUiDomain(publicMcpUrl) {
5
+ const origin = new URL(publicMcpUrl).origin;
6
+ // Hash the exact configured connector URL, including its path and trailing slash.
7
+ const claudeDomain = `${createHash("sha256").update(publicMcpUrl).digest("hex").slice(0, 32)}.claudemcpcontent.com`;
8
+ return (context) => {
9
+ const envelope = context.mcpReq.envelope;
10
+ const clientInfo = envelope && CLIENT_INFO_META_KEY in envelope
11
+ ? envelope[CLIENT_INFO_META_KEY]
12
+ : undefined;
13
+ const clientName = typeof clientInfo === "object" && clientInfo !== null
14
+ && "name" in clientInfo && typeof clientInfo.name === "string"
15
+ ? clientInfo.name
16
+ : undefined;
17
+ // Stateless legacy HTTP has no retained initialize.clientInfo. Its
18
+ // per-request User-Agent is a fallback only when SDK clientInfo is absent.
19
+ const clientHint = clientName ?? context.http?.req?.headers.get("user-agent") ?? "";
20
+ if (/^(?:claude(?:ai)?(?:[-\s_./]|$)|anthropic\/claude(?:ai)?(?:[-\s_./]|$))/iu.test(clientHint)) {
21
+ return claudeDomain;
22
+ }
23
+ if (/^(?:chatgpt|openai-mcp)(?:[-\s_./]|$)/iu.test(clientHint))
24
+ return origin;
25
+ return undefined;
26
+ };
27
+ }
28
+ //# sourceMappingURL=ui-domain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-domain.js","sourceRoot":"","sources":["../src/ui-domain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAsB,MAAM,8BAA8B,CAAC;AAIxF,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,YAAoB;IACjD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;IAC5C,kFAAkF;IAClF,MAAM,YAAY,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,CAAC;IAEpH,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;QACzC,MAAM,UAAU,GAAG,QAAQ,IAAI,oBAAoB,IAAI,QAAQ;YAC7D,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAChC,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,UAAU,GAAG,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI;eACnE,MAAM,IAAI,UAAU,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ;YAC9D,CAAC,CAAC,UAAU,CAAC,IAAI;YACjB,CAAC,CAAC,SAAS,CAAC;QACd,mEAAmE;QACnE,2EAA2E;QAC3E,MAAM,UAAU,GAAG,UAAU,IAAI,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QACpF,IAAI,2EAA2E,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACjG,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,IAAI,yCAAyC,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO,MAAM,CAAC;QAC9E,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qyl-mcp-server",
3
- "version": "7.1.1",
3
+ "version": "7.2.0",
4
4
  "type": "module",
5
5
  "description": "qyl telemetry MCP Apps server: trace explorer and MCP dashboard for a live collector or explicit demo mode",
6
6
  "repository": {
@@ -74,10 +74,11 @@
74
74
  "test": "bun run verify:readme && bun run verify:frame && bun run build && tsc -p tsconfig.test.json && node -e \"const fs=require('node:fs'); for (const name of ['mcp-app.html','mcp-dashboard.html']) fs.copyFileSync('dist/'+name,'dist-test/'+name)\" && node --test dist-test/*.test.js",
75
75
  "smoke": "node smoke-test.mjs",
76
76
  "smoke:live": "node live-tools-smoke.mjs",
77
- "prepack": "bun run build"
77
+ "prepack": "bun run build",
78
+ "smoke:projects": "node project-access-smoke.mjs"
78
79
  },
79
80
  "dependencies": {
80
- "@ancplua/qyl-api-schema": "11.2.0",
81
+ "@ancplua/qyl-api-schema": "11.3.0",
81
82
  "@modelcontextprotocol/core": "2.3.1",
82
83
  "@modelcontextprotocol/server": "2.3.1",
83
84
  "@opentelemetry/api": "1.9.1",
@@ -99,7 +100,7 @@
99
100
  "@modelcontextprotocol/client": "2.3.1",
100
101
  "@types/node": "26.6.4",
101
102
  "typescript": "7.0.2",
102
- "vite": "8.3.2",
103
+ "vite": "8.3.3",
103
104
  "vite-plugin-singlefile": "2.3.3"
104
105
  },
105
106
  "engines": {