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.
- package/README.md +71 -11
- package/dist/ci.d.ts +5 -5
- package/dist/ci.js +23 -18
- package/dist/ci.js.map +1 -1
- package/dist/collector-access.d.ts +17 -0
- package/dist/collector-access.js +61 -0
- package/dist/collector-access.js.map +1 -0
- package/dist/collector.d.ts +4 -1
- package/dist/collector.js +6 -2
- package/dist/collector.js.map +1 -1
- package/dist/config.d.ts +4 -3
- package/dist/config.js +5 -5
- package/dist/config.js.map +1 -1
- package/dist/contract-operations.d.ts +1 -1
- package/dist/contract-operations.js +1 -1
- package/dist/contract-operations.js.map +1 -1
- package/dist/contract-validation.d.ts +1 -1
- package/dist/contract-validation.js +45 -1
- package/dist/contract-validation.js.map +1 -1
- package/dist/events-authorization.js +1 -1
- package/dist/events-authorization.js.map +1 -1
- package/dist/events.d.ts +5 -4
- package/dist/events.js +88 -37
- package/dist/events.js.map +1 -1
- package/dist/main.d.ts +3 -6
- package/dist/main.js +18 -8
- package/dist/main.js.map +1 -1
- package/dist/mcp-app.html +1 -1
- package/dist/mcp-dashboard.html +1 -1
- package/dist/mcp-home.html +3 -3
- package/dist/metrics-tools.js +12 -12
- package/dist/metrics-tools.js.map +1 -1
- package/dist/native-execution.d.ts +8 -52
- package/dist/native-execution.js +51 -222
- package/dist/native-execution.js.map +1 -1
- package/dist/request-scope.d.ts +4 -12
- package/dist/request-scope.js +9 -22
- package/dist/request-scope.js.map +1 -1
- package/dist/server.d.ts +4 -3
- package/dist/server.js +36 -25
- package/dist/server.js.map +1 -1
- package/dist/summaries.d.ts +1 -1
- package/dist/summaries.js +2 -2
- package/dist/summaries.js.map +1 -1
- package/dist/telemetry-redaction.js +13 -0
- package/dist/telemetry-redaction.js.map +1 -1
- package/dist/tools.js +65 -18
- package/dist/tools.js.map +1 -1
- package/dist/trace-query.d.ts +5 -0
- package/dist/trace-query.js +8 -0
- package/dist/trace-query.js.map +1 -0
- package/dist/ui-domain.d.ts +4 -0
- package/dist/ui-domain.js +28 -0
- package/dist/ui-domain.js.map +1 -0
- 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
|
|
32
|
-
"
|
|
33
|
-
"
|
|
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,
|
|
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
|
|
50
|
-
"
|
|
51
|
-
"
|
|
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,
|
|
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
|
|
60
|
-
|
|
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
|
|
65
|
-
"
|
|
66
|
-
"session's traces in the explorer
|
|
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,
|
|
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
|
|
80
|
-
"
|
|
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,
|
|
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":"AAAA,4DAA4D;AAkB5D,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC9E,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
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.
|
|
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.
|
|
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.
|
|
103
|
+
"vite": "8.3.3",
|
|
103
104
|
"vite-plugin-singlefile": "2.3.3"
|
|
104
105
|
},
|
|
105
106
|
"engines": {
|