qyl-mcp-server 6.0.0 → 6.1.1
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 +47 -0
- package/dist/ci.js +30 -26
- package/dist/ci.js.map +1 -1
- package/dist/data.d.ts +8 -7
- package/dist/data.js +16 -19
- package/dist/data.js.map +1 -1
- package/dist/mcp-app.html +1 -1
- package/dist/mcp-dashboard.html +1 -1
- package/dist/mcp-home.html +1 -1
- package/dist/metrics-tools.js +24 -34
- package/dist/metrics-tools.js.map +1 -1
- package/dist/metrics.d.ts +4 -3
- package/dist/metrics.js +6 -13
- package/dist/metrics.js.map +1 -1
- package/dist/request-scope.d.ts +49 -0
- package/dist/request-scope.js +64 -0
- package/dist/request-scope.js.map +1 -0
- package/dist/server.js +70 -77
- package/dist/server.js.map +1 -1
- package/dist/tools.d.ts +3 -3
- package/dist/tools.js +37 -61
- package/dist/tools.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -52,6 +52,20 @@ mutates it. On the hosted server they all sit behind the single `qyl:read` scope
|
|
|
52
52
|
|
|
53
53
|
The `display_*` tools return MCP Apps UI resources as single-file viewers.
|
|
54
54
|
|
|
55
|
+
Every tool runs inside its request scope. Cancellation: a
|
|
56
|
+
`notifications/cancelled` for the request, or a closed connection, aborts the
|
|
57
|
+
in-flight collector fetch instead of waiting out its timeout. Progress: a
|
|
58
|
+
request that carries a `progressToken` gets `notifications/progress` per
|
|
59
|
+
completed step, one per collector round trip plus a final "Result ready"
|
|
60
|
+
(`ci_log` with a `run_id` reports the flatten into legs as a step of its own).
|
|
61
|
+
Logging: the server declares the `logging` capability and sends one
|
|
62
|
+
`notifications/message` per call, `info` on success and `warning` on failure,
|
|
63
|
+
under the logger `qyl.mcp`. On revision `2026-07-28` the client's level travels
|
|
64
|
+
per request in `_meta["io.modelcontextprotocol/logLevel"]`; a request without
|
|
65
|
+
it gets no log line, and `logging/setLevel` does not exist in that revision.
|
|
66
|
+
MCP logging is deprecated as of that revision (SEP-2577) and kept here through
|
|
67
|
+
the deprecation window beside stderr and OpenTelemetry.
|
|
68
|
+
|
|
55
69
|
Every inbound `tools/call` on a local server — `--stdio`, or HTTP without
|
|
56
70
|
`MCP_PUBLIC_URL` — is recorded natively: validated result, lifecycle, duration,
|
|
57
71
|
redacted JSON-RPC timeline, and trace/span correlation, persisted atomically to
|
|
@@ -82,6 +96,39 @@ so serving it requires Bun.
|
|
|
82
96
|
|
|
83
97
|
## Release notes
|
|
84
98
|
|
|
99
|
+
### 6.1.1
|
|
100
|
+
|
|
101
|
+
- The bundled viewers no longer ask for progress they never read: the MCP
|
|
102
|
+
Apps client passed a no-op `onprogress` on every `tools/call`, which put a
|
|
103
|
+
`progressToken` on each request and, since 6.1.0, had the server answer
|
|
104
|
+
with notifications nobody consumed. A viewer that wants progress passes its
|
|
105
|
+
own callback.
|
|
106
|
+
- `verify:frame` runs as a step of `bun run test`: every tool in the manifest
|
|
107
|
+
must be registered inside `runTool` under its own name, so a tool cannot
|
|
108
|
+
ship without cancellation, progress and its log line.
|
|
109
|
+
|
|
110
|
+
### 6.1.0
|
|
111
|
+
|
|
112
|
+
- Every tool handler runs inside `runTool`, which resolves the SDK request
|
|
113
|
+
context once and hands the work a plain scope. Cancellation: the request's
|
|
114
|
+
signal reaches every collector fetch, which already raced a signal against
|
|
115
|
+
its timeout but had no caller passing one, so a client's
|
|
116
|
+
`notifications/cancelled` or a dropped connection now aborts the fetch at
|
|
117
|
+
once. Data-layer functions (`fetchTraces`, `fetchLogs`, `listMetrics`, …)
|
|
118
|
+
gained a trailing `CollectorRequestOptions` argument; existing callers are
|
|
119
|
+
unaffected.
|
|
120
|
+
- Progress on every tool: a request with a `progressToken` gets one
|
|
121
|
+
`notifications/progress` per completed collector round trip and a final
|
|
122
|
+
"Result ready"; `ci_log` with a `run_id` reports its per-leg flatten as a
|
|
123
|
+
step of its own. Progress increases per token by construction. A request
|
|
124
|
+
without a token gets nothing.
|
|
125
|
+
- The `logging` capability is declared and every call sends one
|
|
126
|
+
`notifications/message` (`info` on success, `warning` on failure, logger
|
|
127
|
+
`qyl.mcp`) to a request that carries a log level in its `_meta` envelope.
|
|
128
|
+
Deprecated as of `2026-07-28` (SEP-2577), kept through the deprecation
|
|
129
|
+
window beside stderr and OpenTelemetry. Tool surface, manifest snapshot and
|
|
130
|
+
contract handshake are unchanged.
|
|
131
|
+
|
|
85
132
|
### 6.0.0
|
|
86
133
|
|
|
87
134
|
- Revision `2026-07-28` only, again, on both transports: `createMcpHandler`
|
package/dist/ci.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { CiLogInputSchema, CiLogOutputSchema, compactOutputSchema, } from "./contract-validation.js";
|
|
2
2
|
import { fetchSessions, fetchSessionTraces } from "./data.js";
|
|
3
|
+
import { runTool } from "./request-scope.js";
|
|
3
4
|
import { telemetryToolResult } from "./telemetry-redaction.js";
|
|
4
|
-
import { READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS
|
|
5
|
+
import { READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS } from "./tools.js";
|
|
5
6
|
/** Resource service-name prefix that marks telemetry as CI-emitted. */
|
|
6
7
|
export const CI_SERVICE_PREFIX = "qyl-ci";
|
|
7
8
|
/** CI sessions are the ones that carry at least one qyl-ci service. */
|
|
@@ -77,31 +78,34 @@ export function registerCiTools(server) {
|
|
|
77
78
|
inputSchema: CiLogInputSchema,
|
|
78
79
|
outputSchema: compactOutputSchema(CiLogOutputSchema),
|
|
79
80
|
annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
|
|
80
|
-
},
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
const
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
state: session.state,
|
|
94
|
-
start_time: session.start_time,
|
|
95
|
-
...(session.duration_ms === undefined ? {} : { duration_ms: session.duration_ms }),
|
|
96
|
-
error_count: session.error_count,
|
|
97
|
-
services: session.services,
|
|
98
|
-
}));
|
|
99
|
-
const output = { runs, mode };
|
|
100
|
-
return telemetryToolResult(summarizeCiRuns(runs, mode), output);
|
|
81
|
+
}, (args, ctx) =>
|
|
82
|
+
// A run breakdown is two units a client can watch: the collector round
|
|
83
|
+
// trip for the run's traces, then the flatten into per-leg phases. The
|
|
84
|
+
// run list is one round trip.
|
|
85
|
+
runTool(ctx, "ci_log", args.run_id ? 2 : 1, async (scope) => {
|
|
86
|
+
if (args.run_id) {
|
|
87
|
+
const { traces, mode } = await fetchSessionTraces(args.run_id, 100, scope.collector);
|
|
88
|
+
await scope.step(`Fetched ${traces.length} trace(s) of CI run ${args.run_id}`);
|
|
89
|
+
const phases = collectCiPhases(traces);
|
|
90
|
+
const legs = new Set(phases.map((phase) => phase.leg)).size;
|
|
91
|
+
await scope.step(`Collected ${phases.length} phase(s) across ${legs} leg(s)`);
|
|
92
|
+
const output = { run_id: args.run_id, phases, mode };
|
|
93
|
+
return telemetryToolResult(summarizeCiRun(args.run_id, phases, mode), output);
|
|
101
94
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
95
|
+
const { sessions, mode } = await fetchSessions(50, undefined, scope.collector);
|
|
96
|
+
const runs = filterCiSessions(sessions)
|
|
97
|
+
.slice(0, args.limit ?? 10)
|
|
98
|
+
.map((session) => ({
|
|
99
|
+
run_id: session["session_id"],
|
|
100
|
+
state: session.state,
|
|
101
|
+
start_time: session.start_time,
|
|
102
|
+
...(session.duration_ms === undefined ? {} : { duration_ms: session.duration_ms }),
|
|
103
|
+
error_count: session.error_count,
|
|
104
|
+
services: session.services,
|
|
105
|
+
}));
|
|
106
|
+
await scope.step(`Found ${runs.length} CI run(s) among ${sessions.length} session(s)`);
|
|
107
|
+
const output = { runs, mode };
|
|
108
|
+
return telemetryToolResult(summarizeCiRuns(runs, mode), output);
|
|
109
|
+
}));
|
|
106
110
|
}
|
|
107
111
|
//# sourceMappingURL=ci.js.map
|
package/dist/ci.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ci.js","sourceRoot":"","sources":["../src/ci.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,oCAAoC,EAAE,
|
|
1
|
+
{"version":3,"file":"ci.js","sourceRoot":"","sources":["../src/ci.ts"],"names":[],"mappings":"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"}
|
package/dist/data.d.ts
CHANGED
|
@@ -2,21 +2,22 @@
|
|
|
2
2
|
* Telemetry fetching (shared by model tools, display tools, fetch_telemetry —
|
|
3
3
|
* demo mode honors every filter the live endpoints support).
|
|
4
4
|
*/
|
|
5
|
+
import { type CollectorRequestOptions } from "./collector.js";
|
|
5
6
|
import type { SessionId, TraceId } from "@ancplua/qyl-api-schema/types";
|
|
6
7
|
import type { McpDashboardStats, Mode, QylLogRecord, QylSession, QylTrace } from "./wire.js";
|
|
7
|
-
export declare function fetchTraces(limit: number): Promise<{
|
|
8
|
+
export declare function fetchTraces(limit: number, options?: CollectorRequestOptions): Promise<{
|
|
8
9
|
traces: QylTrace[];
|
|
9
10
|
mode: Mode;
|
|
10
11
|
}>;
|
|
11
|
-
export declare function fetchTrace(traceId: string): Promise<{
|
|
12
|
+
export declare function fetchTrace(traceId: string, options?: CollectorRequestOptions): Promise<{
|
|
12
13
|
trace: QylTrace;
|
|
13
14
|
mode: Mode;
|
|
14
15
|
}>;
|
|
15
|
-
export declare function fetchSessionTraces(sessionId: string, limit: number): Promise<{
|
|
16
|
+
export declare function fetchSessionTraces(sessionId: string, limit: number, options?: CollectorRequestOptions): Promise<{
|
|
16
17
|
traces: QylTrace[];
|
|
17
18
|
mode: Mode;
|
|
18
19
|
}>;
|
|
19
|
-
export declare function fetchSessions(limit: number, activeOnly?: boolean): Promise<{
|
|
20
|
+
export declare function fetchSessions(limit: number, activeOnly?: boolean, options?: CollectorRequestOptions): Promise<{
|
|
20
21
|
sessions: QylSession[];
|
|
21
22
|
mode: Mode;
|
|
22
23
|
}>;
|
|
@@ -27,7 +28,7 @@ interface LogFilters {
|
|
|
27
28
|
query?: string;
|
|
28
29
|
limit: number;
|
|
29
30
|
}
|
|
30
|
-
export declare function fetchLogs(filters: LogFilters): Promise<{
|
|
31
|
+
export declare function fetchLogs(filters: LogFilters, options?: CollectorRequestOptions): Promise<{
|
|
31
32
|
logs: QylLogRecord[];
|
|
32
33
|
mode: Mode;
|
|
33
34
|
}>;
|
|
@@ -36,11 +37,11 @@ export declare function fetchTracesForDisplay(args: {
|
|
|
36
37
|
trace_id?: TraceId;
|
|
37
38
|
session_id?: SessionId;
|
|
38
39
|
limit: number;
|
|
39
|
-
}): Promise<{
|
|
40
|
+
}, options?: CollectorRequestOptions): Promise<{
|
|
40
41
|
traces: QylTrace[];
|
|
41
42
|
selected_trace_id?: TraceId;
|
|
42
43
|
mode: Mode;
|
|
43
44
|
}>;
|
|
44
45
|
/** Shared by display_mcp_dashboard and fetch_telemetry (view "mcp_stats"). */
|
|
45
|
-
export declare function fetchMcpStats(hours: number): Promise<McpDashboardStats>;
|
|
46
|
+
export declare function fetchMcpStats(hours: number, options?: CollectorRequestOptions): Promise<McpDashboardStats>;
|
|
46
47
|
export {};
|
package/dist/data.js
CHANGED
|
@@ -8,18 +8,18 @@ import { logBodyText } from "./log-body.js";
|
|
|
8
8
|
import { aggregateMcpStats, pickBucketMs } from "./stats.js";
|
|
9
9
|
import { redactTelemetry } from "./telemetry-redaction.js";
|
|
10
10
|
import { LogsListResponseSchema, SessionsListResponseSchema, SessionTracesListResponseSchema, TracesListResponseSchema, } from "./contract-validation.js";
|
|
11
|
-
export async function fetchTraces(limit) {
|
|
11
|
+
export async function fetchTraces(limit, options = {}) {
|
|
12
12
|
const mode = await resolveMode();
|
|
13
13
|
if (mode === "demo") {
|
|
14
14
|
return redactTelemetry({ traces: getDemo().traces.slice(0, limit), mode });
|
|
15
15
|
}
|
|
16
|
-
const body = await collectorGet("/api/v1/traces", { limit });
|
|
16
|
+
const body = await collectorGet("/api/v1/traces", { limit }, options);
|
|
17
17
|
return redactTelemetry({
|
|
18
18
|
traces: parseCollectorPage(body, "/api/v1/traces", TracesListResponseSchema, parseCollectorTrace).items,
|
|
19
19
|
mode,
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
|
-
export async function fetchTrace(traceId) {
|
|
22
|
+
export async function fetchTrace(traceId, options = {}) {
|
|
23
23
|
const mode = await resolveMode();
|
|
24
24
|
if (mode === "demo") {
|
|
25
25
|
const trace = getDemo().traces.find((t) => t.trace_id === traceId);
|
|
@@ -28,7 +28,7 @@ export async function fetchTrace(traceId) {
|
|
|
28
28
|
return redactTelemetry({ trace, mode });
|
|
29
29
|
}
|
|
30
30
|
try {
|
|
31
|
-
const trace = parseCollectorTrace(await collectorGet(`/api/v1/traces/${encodeURIComponent(traceId)}
|
|
31
|
+
const trace = parseCollectorTrace(await collectorGet(`/api/v1/traces/${encodeURIComponent(traceId)}`, {}, options), `/api/v1/traces/${traceId}`);
|
|
32
32
|
return redactTelemetry({ trace, mode });
|
|
33
33
|
}
|
|
34
34
|
catch (err) {
|
|
@@ -38,7 +38,7 @@ export async function fetchTrace(traceId) {
|
|
|
38
38
|
throw err;
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
-
export async function fetchSessionTraces(sessionId, limit) {
|
|
41
|
+
export async function fetchSessionTraces(sessionId, limit, options = {}) {
|
|
42
42
|
const mode = await resolveMode();
|
|
43
43
|
if (mode === "demo") {
|
|
44
44
|
const traces = getDemo().sessionTraces[sessionId];
|
|
@@ -47,7 +47,7 @@ export async function fetchSessionTraces(sessionId, limit) {
|
|
|
47
47
|
return redactTelemetry({ traces: traces.slice(0, limit), mode });
|
|
48
48
|
}
|
|
49
49
|
try {
|
|
50
|
-
const body = await collectorGet(`/api/v1/sessions/${encodeURIComponent(sessionId)}/traces`, { limit });
|
|
50
|
+
const body = await collectorGet(`/api/v1/sessions/${encodeURIComponent(sessionId)}/traces`, { limit }, options);
|
|
51
51
|
return redactTelemetry({
|
|
52
52
|
traces: parseCollectorPage(body, `/api/v1/sessions/${sessionId}/traces`, SessionTracesListResponseSchema, parseCollectorTrace).items,
|
|
53
53
|
mode,
|
|
@@ -60,22 +60,19 @@ export async function fetchSessionTraces(sessionId, limit) {
|
|
|
60
60
|
throw err;
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
-
export async function fetchSessions(limit, activeOnly) {
|
|
63
|
+
export async function fetchSessions(limit, activeOnly, options = {}) {
|
|
64
64
|
const mode = await resolveMode();
|
|
65
65
|
if (mode === "demo") {
|
|
66
66
|
const sessions = (activeOnly ? getDemo().sessions.filter((s) => s.state === "active") : getDemo().sessions).slice(0, limit);
|
|
67
67
|
return redactTelemetry({ sessions, mode });
|
|
68
68
|
}
|
|
69
|
-
const body = await collectorGet("/api/v1/sessions", {
|
|
70
|
-
limit,
|
|
71
|
-
is_active: activeOnly ? true : undefined,
|
|
72
|
-
});
|
|
69
|
+
const body = await collectorGet("/api/v1/sessions", { limit, is_active: activeOnly ? true : undefined }, options);
|
|
73
70
|
return redactTelemetry({
|
|
74
71
|
sessions: parseCollectorPage(body, "/api/v1/sessions", SessionsListResponseSchema, parseCollectorSession).items,
|
|
75
72
|
mode,
|
|
76
73
|
});
|
|
77
74
|
}
|
|
78
|
-
export async function fetchLogs(filters) {
|
|
75
|
+
export async function fetchLogs(filters, options = {}) {
|
|
79
76
|
const mode = await resolveMode();
|
|
80
77
|
if (mode === "demo") {
|
|
81
78
|
let logs = getDemo().logs;
|
|
@@ -100,25 +97,25 @@ export async function fetchLogs(filters) {
|
|
|
100
97
|
severity_min: filters.severity_min,
|
|
101
98
|
query: filters.query,
|
|
102
99
|
limit: filters.limit,
|
|
103
|
-
});
|
|
100
|
+
}, options);
|
|
104
101
|
return redactTelemetry({
|
|
105
102
|
logs: parseCollectorPage(body, "/api/v1/logs", LogsListResponseSchema, parseCollectorLog).items,
|
|
106
103
|
mode,
|
|
107
104
|
});
|
|
108
105
|
}
|
|
109
106
|
/** Shared by display_traces and fetch_telemetry (view "traces"). */
|
|
110
|
-
export async function fetchTracesForDisplay(args) {
|
|
107
|
+
export async function fetchTracesForDisplay(args, options = {}) {
|
|
111
108
|
if (args.trace_id) {
|
|
112
|
-
const { trace, mode } = await fetchTrace(args.trace_id);
|
|
109
|
+
const { trace, mode } = await fetchTrace(args.trace_id, options);
|
|
113
110
|
return { traces: [trace], selected_trace_id: args.trace_id, mode };
|
|
114
111
|
}
|
|
115
112
|
if (args.session_id) {
|
|
116
|
-
return fetchSessionTraces(args.session_id, args.limit);
|
|
113
|
+
return fetchSessionTraces(args.session_id, args.limit, options);
|
|
117
114
|
}
|
|
118
|
-
return fetchTraces(args.limit);
|
|
115
|
+
return fetchTraces(args.limit, options);
|
|
119
116
|
}
|
|
120
117
|
/** Shared by display_mcp_dashboard and fetch_telemetry (view "mcp_stats"). */
|
|
121
|
-
export async function fetchMcpStats(hours) {
|
|
118
|
+
export async function fetchMcpStats(hours, options = {}) {
|
|
122
119
|
const mode = await resolveMode();
|
|
123
120
|
const windowEnd = Date.now();
|
|
124
121
|
const windowStart = windowEnd - hours * 3_600_000;
|
|
@@ -127,7 +124,7 @@ export async function fetchMcpStats(hours) {
|
|
|
127
124
|
const stats = aggregateMcpStats(redactTelemetry(getDemoMcpSpans()), windowStart, windowEnd, bucketMs);
|
|
128
125
|
return redactTelemetry({ ...stats, truncated: false, mode });
|
|
129
126
|
}
|
|
130
|
-
const body = await collectorGet("/api/v1/traces", { limit: 1000 });
|
|
127
|
+
const body = await collectorGet("/api/v1/traces", { limit: 1000 }, options);
|
|
131
128
|
const page = parseCollectorPage(body, "/api/v1/traces", TracesListResponseSchema, parseCollectorTrace);
|
|
132
129
|
const traces = redactTelemetry(page.items);
|
|
133
130
|
const spans = traces.flatMap((t) => t.spans);
|
package/dist/data.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.js","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,cAAc,
|
|
1
|
+
{"version":3,"file":"data.js","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"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"}
|