qyl-mcp-server 7.3.1 → 7.5.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 +87 -13
- package/dist/ci.js +1 -1
- package/dist/ci.js.map +1 -1
- package/dist/cloudflare-access.d.ts +3 -2
- package/dist/cloudflare-access.js +3 -2
- package/dist/cloudflare-access.js.map +1 -1
- package/dist/collector-resources.d.ts +45 -0
- package/dist/collector-resources.js +295 -0
- package/dist/collector-resources.js.map +1 -0
- package/dist/collector.d.ts +21 -6
- package/dist/collector.js +33 -1
- package/dist/collector.js.map +1 -1
- package/dist/contract-headers.d.ts +10 -0
- package/dist/contract-headers.js +10 -0
- package/dist/contract-headers.js.map +1 -1
- package/dist/contract-validation.d.ts +17 -0
- package/dist/contract-validation.js +65 -0
- package/dist/contract-validation.js.map +1 -1
- package/dist/data.d.ts +36 -13
- package/dist/data.js +74 -23
- package/dist/data.js.map +1 -1
- package/dist/events.js +1 -1
- package/dist/events.js.map +1 -1
- package/dist/http-security.d.ts +1 -0
- package/dist/http-security.js +1 -1
- package/dist/http-security.js.map +1 -1
- package/dist/main.js +1 -4
- 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 +10 -3
- package/dist/metrics-tools.d.ts +4 -11
- package/dist/metrics-tools.js +43 -44
- package/dist/metrics-tools.js.map +1 -1
- package/dist/metrics.d.ts +21 -39
- package/dist/metrics.js +58 -53
- package/dist/metrics.js.map +1 -1
- package/dist/oauth.d.ts +8 -1
- package/dist/oauth.js +16 -2
- package/dist/oauth.js.map +1 -1
- package/dist/paging.d.ts +16 -0
- package/dist/paging.js +33 -0
- package/dist/paging.js.map +1 -0
- package/dist/request-scope.js +8 -0
- package/dist/request-scope.js.map +1 -1
- package/dist/server.d.ts +4 -0
- package/dist/server.js +57 -42
- package/dist/server.js.map +1 -1
- package/dist/summaries.d.ts +13 -2
- package/dist/summaries.js +20 -4
- package/dist/summaries.js.map +1 -1
- package/dist/telemetry.js +7 -0
- package/dist/telemetry.js.map +1 -1
- package/dist/tool-scopes.d.ts +42 -0
- package/dist/tool-scopes.js +97 -0
- package/dist/tool-scopes.js.map +1 -0
- package/dist/tools.js +82 -20
- package/dist/tools.js.map +1 -1
- package/dist/write-tools.d.ts +41 -0
- package/dist/write-tools.js +214 -0
- package/dist/write-tools.js.map +1 -0
- package/package.json +2 -2
- package/dist/contract-operations.d.ts +0 -37
- package/dist/contract-operations.js +0 -124
- package/dist/contract-operations.js.map +0 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The OAuth scope a write tool needs beyond `qyl:read`, and how a call
|
|
3
|
+
* without it is refused.
|
|
4
|
+
*
|
|
5
|
+
* Every hosted request already carries `qyl:read`: it is the endpoint's
|
|
6
|
+
* required scope, which the bearer gate checks (authorization.ts). The create
|
|
7
|
+
* and update tools also need `qyl:write`, the delete tool `qyl:delete`.
|
|
8
|
+
*
|
|
9
|
+
* A write tool registers an SDK `scopeChallenge`. The SDK's HTTP serving runs
|
|
10
|
+
* it before the handler, in both protocol eras, and answers a token without
|
|
11
|
+
* the scope with `403` and `WWW-Authenticate: Bearer error="insufficient_scope"`
|
|
12
|
+
* naming the scopes to request — the MCP authorization "scope challenge" a
|
|
13
|
+
* client answers with step-up authorization. The handler checks again
|
|
14
|
+
* (`assertToolScopes`), so a transport that runs no scope challenge still
|
|
15
|
+
* refuses the call, as an `isError` result whose `structuredContent.error.code`
|
|
16
|
+
* is `insufficient_scope` and whose `_meta["mcp/www_authenticate"]` carries
|
|
17
|
+
* the same challenge (OpenAI's documented in-band form).
|
|
18
|
+
*
|
|
19
|
+
* Without verified authentication — stdio, local HTTP — there is no token to
|
|
20
|
+
* check: the operator's Collector key decides what the server may change.
|
|
21
|
+
* Scopes are compared as issued; an explicit scope hierarchy configured on
|
|
22
|
+
* the bearer gate covers the endpoint's required scopes only.
|
|
23
|
+
*/
|
|
24
|
+
import { getOAuthProtectedResourceMetadataUrl, } from "@modelcontextprotocol/server";
|
|
25
|
+
import { QYL_MCP_SCOPES_SUPPORTED } from "./oauth.js";
|
|
26
|
+
/** The tool-result `_meta` key OpenAI documents for an authentication challenge. */
|
|
27
|
+
export const WWW_AUTHENTICATE_META_KEY = "mcp/www_authenticate";
|
|
28
|
+
/** A verified token lacks a scope the tool needs; the message says which. */
|
|
29
|
+
export class InsufficientScopeError extends Error {
|
|
30
|
+
challenge;
|
|
31
|
+
name = "InsufficientScopeError";
|
|
32
|
+
constructor(message,
|
|
33
|
+
/** The RFC 6750 `WWW-Authenticate` value a client can answer with step-up. */
|
|
34
|
+
challenge) {
|
|
35
|
+
super(message);
|
|
36
|
+
this.challenge = challenge;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function missingScopes(required, authInfo) {
|
|
40
|
+
const granted = new Set(authInfo.scopes);
|
|
41
|
+
return required.filter((scope) => !granted.has(scope));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The scopes a challenge names: the tool's own plus the qyl scopes the token
|
|
45
|
+
* already holds, so re-authorizing for this tool does not drop another
|
|
46
|
+
* tool's grant (MCP authorization, "Scope challenge handling").
|
|
47
|
+
*/
|
|
48
|
+
function challengeScopes(required, authInfo) {
|
|
49
|
+
const supported = new Set(QYL_MCP_SCOPES_SUPPORTED);
|
|
50
|
+
const kept = authInfo.scopes.filter((scope) => supported.has(scope));
|
|
51
|
+
const scopes = [...new Set([...required, ...kept])].sort();
|
|
52
|
+
return [scopes[0] ?? required[0], ...scopes.slice(1)];
|
|
53
|
+
}
|
|
54
|
+
function errorDescription(tool, missing) {
|
|
55
|
+
return `${tool} needs the ${missing.join(" and ")} scope`;
|
|
56
|
+
}
|
|
57
|
+
/** The SDK registration hook: a challenge for a verified token without `required`. */
|
|
58
|
+
export function toolScopeChallenge(tool, required) {
|
|
59
|
+
return ({ authInfo }) => {
|
|
60
|
+
if (authInfo === undefined)
|
|
61
|
+
return undefined;
|
|
62
|
+
const missing = missingScopes(required, authInfo);
|
|
63
|
+
if (missing.length === 0)
|
|
64
|
+
return undefined;
|
|
65
|
+
return {
|
|
66
|
+
scopes: challengeScopes(required, authInfo),
|
|
67
|
+
errorDescription: errorDescription(tool, missing),
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** The same Protected Resource Metadata URL the SDK's scope challenge names. */
|
|
72
|
+
function resourceMetadataUrl(authInfo) {
|
|
73
|
+
if (authInfo.resourceMetadataUrl !== undefined)
|
|
74
|
+
return authInfo.resourceMetadataUrl;
|
|
75
|
+
const resource = authInfo.resource;
|
|
76
|
+
return resource !== undefined && (resource.protocol === "https:" || resource.protocol === "http:")
|
|
77
|
+
? getOAuthProtectedResourceMetadataUrl(resource)
|
|
78
|
+
: undefined;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The handler's own check: throws `InsufficientScopeError` when a verified
|
|
82
|
+
* token lacks one of `required`. No verified authentication, no check.
|
|
83
|
+
*/
|
|
84
|
+
export function assertToolScopes(tool, required, authInfo) {
|
|
85
|
+
if (authInfo === undefined)
|
|
86
|
+
return;
|
|
87
|
+
const missing = missingScopes(required, authInfo);
|
|
88
|
+
if (missing.length === 0)
|
|
89
|
+
return;
|
|
90
|
+
const metadata = resourceMetadataUrl(authInfo);
|
|
91
|
+
const challenge = `Bearer error="insufficient_scope", error_description="${errorDescription(tool, missing)}", ` +
|
|
92
|
+
`scope="${challengeScopes(required, authInfo).join(" ")}"` +
|
|
93
|
+
(metadata === undefined ? "" : `, resource_metadata="${metadata}"`);
|
|
94
|
+
throw new InsufficientScopeError(`${errorDescription(tool, missing)}, which this sign-in does not grant. ` +
|
|
95
|
+
`Reconnect qyl and allow ${missing.join(" and ")} to use it.`, challenge);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=tool-scopes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-scopes.js","sourceRoot":"","sources":["../src/tool-scopes.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/** Qyl's directly registered, read-only telemetry tools. */
|
|
2
2
|
import { GetTraceInputSchema, GetTraceOutputSchema, ListSessionsInputSchema, ListSessionsOutputSchema, ListTracesInputSchema, ListTracesOutputSchema, SearchLogsInputSchema, SearchLogsOutputSchema, compactOutputSchema, } from "./contract-validation.js";
|
|
3
3
|
import { fetchLogs, fetchSessions, fetchTrace, fetchTraces } from "./data.js";
|
|
4
|
-
import { summarizeLogs, summarizeSessions, summarizeTrace, summarizeTraceTable, } from "./summaries.js";
|
|
4
|
+
import { filterNote, pageNote, summarizeLogs, summarizeSessions, summarizeTrace, summarizeTraceTable, } from "./summaries.js";
|
|
5
5
|
import { runTool } from "./request-scope.js";
|
|
6
|
+
import { readSessionAnnotations, readTraceAnnotations } from "./collector-resources.js";
|
|
6
7
|
import { telemetryToolResult } from "./telemetry-redaction.js";
|
|
7
8
|
import { QYL_MCP_SCOPE } from "./oauth.js";
|
|
8
9
|
/**
|
|
@@ -60,12 +61,22 @@ function projectTrace(trace, args) {
|
|
|
60
61
|
matchingSpanCount: matching.length,
|
|
61
62
|
};
|
|
62
63
|
}
|
|
64
|
+
/** `from …`, `until …` for a list header; the window is what the caller asked for. */
|
|
65
|
+
function windowNote(range) {
|
|
66
|
+
return [
|
|
67
|
+
range.start_time === undefined ? undefined : `from ${range.start_time}`,
|
|
68
|
+
range.end_time === undefined ? undefined : `until ${range.end_time}`,
|
|
69
|
+
];
|
|
70
|
+
}
|
|
63
71
|
/** Register the four model-visible read tools against published contract schemas. */
|
|
64
72
|
export function registerTelemetryTools(server) {
|
|
65
73
|
server.registerTool("list_traces", {
|
|
66
74
|
title: "List Traces",
|
|
67
75
|
description: "List recent qyl traces when the user wants a compact overview of activity " +
|
|
68
76
|
"and failures: root span, services, duration, span count, and error flag. " +
|
|
77
|
+
"Filters: a start_time/end_time window (RFC 3339), service_name (traces with " +
|
|
78
|
+
"a span from that service) and errors_only. Pages: when has_more is true, " +
|
|
79
|
+
"pass next_cursor as cursor with the same filters for the next page. " +
|
|
69
80
|
"Spans are omitted; get_trace returns the full span tree, while display_traces " +
|
|
70
81
|
"provides the interactive explorer.",
|
|
71
82
|
inputSchema: ListTracesInputSchema,
|
|
@@ -73,13 +84,27 @@ export function registerTelemetryTools(server) {
|
|
|
73
84
|
annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
|
|
74
85
|
_meta: TELEMETRY_TOOL_AUTH_META,
|
|
75
86
|
}, (args, ctx) => runTool(ctx, 1, async (scope) => {
|
|
76
|
-
const
|
|
77
|
-
|
|
87
|
+
const page = await fetchTraces({
|
|
88
|
+
limit: args.limit ?? 20,
|
|
89
|
+
start_time: args.start_time,
|
|
90
|
+
end_time: args.end_time,
|
|
91
|
+
service_name: args.service_name,
|
|
92
|
+
errors_only: args.errors_only,
|
|
93
|
+
cursor: args.cursor,
|
|
94
|
+
}, scope.collector);
|
|
95
|
+
await scope.step(`Fetched ${page.traces.length} trace(s)`);
|
|
78
96
|
const output = {
|
|
79
|
-
traces: traces.map(({ spans: _spans, ...summary }) => summary),
|
|
80
|
-
mode,
|
|
97
|
+
traces: page.traces.map(({ spans: _spans, ...summary }) => summary),
|
|
98
|
+
mode: page.mode,
|
|
99
|
+
has_more: page.hasMore,
|
|
100
|
+
...(page.nextCursor === undefined ? {} : { next_cursor: page.nextCursor }),
|
|
81
101
|
};
|
|
82
|
-
|
|
102
|
+
const filters = filterNote([
|
|
103
|
+
args.errors_only ? "errors only" : undefined,
|
|
104
|
+
args.service_name === undefined ? undefined : `service ${args.service_name}`,
|
|
105
|
+
...windowNote(args),
|
|
106
|
+
]);
|
|
107
|
+
return telemetryToolResult(summarizeTraceTable(page.traces, page.mode, filters) + pageNote(page), output);
|
|
83
108
|
}));
|
|
84
109
|
server.registerTool("get_trace", {
|
|
85
110
|
title: "Get Trace",
|
|
@@ -89,58 +114,95 @@ export function registerTelemetryTools(server) {
|
|
|
89
114
|
"and include_attributes=false omits attribute collections. Trace totals " +
|
|
90
115
|
"are preserved and the summary reports returned and matching counts. " +
|
|
91
116
|
"The root span is omitted when excluded by the filter or cap. " +
|
|
117
|
+
"It also returns the annotations on the trace and its spans, with the id and " +
|
|
118
|
+
"etag that update_annotation and delete take. " +
|
|
92
119
|
"display_traces provides the visual waterfall.",
|
|
93
120
|
inputSchema: GetTraceInputSchema,
|
|
94
121
|
outputSchema: compactOutputSchema(GetTraceOutputSchema),
|
|
95
122
|
annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
|
|
96
123
|
_meta: TELEMETRY_TOOL_AUTH_META,
|
|
97
|
-
}, (args, ctx) => runTool(ctx,
|
|
124
|
+
}, (args, ctx) => runTool(ctx, 2, async (scope) => {
|
|
98
125
|
const { trace, mode } = await fetchTrace(args.trace_id, scope.collector);
|
|
99
126
|
await scope.step(`Fetched trace ${args.trace_id} (${trace.span_count} spans)`);
|
|
100
127
|
const projected = projectTrace(trace, args);
|
|
101
|
-
const
|
|
128
|
+
const notes = await readTraceAnnotations(args.trace_id, scope);
|
|
129
|
+
const output = {
|
|
130
|
+
trace: projected.trace,
|
|
131
|
+
mode,
|
|
132
|
+
...(notes.annotations === undefined ? {} : { annotations: notes.annotations }),
|
|
133
|
+
};
|
|
102
134
|
const rootExcluded = trace.root_span !== undefined && projected.trace.root_span === undefined;
|
|
103
135
|
const summary = summarizeTrace(projected.trace, mode, rootExcluded) +
|
|
104
136
|
`\nReturned ${projected.trace.spans.length} of ${projected.matchingSpanCount} matching spans ` +
|
|
105
137
|
`(${trace.span_count} total)${args.errors_only ? "; error status only" : ""}.` +
|
|
106
|
-
(args.include_attributes === false ? " Attribute collections omitted." : "")
|
|
138
|
+
(args.include_attributes === false ? " Attribute collections omitted." : "") +
|
|
139
|
+
notes.text;
|
|
107
140
|
return telemetryToolResult(summary, output);
|
|
108
141
|
}));
|
|
109
142
|
server.registerTool("list_sessions", {
|
|
110
143
|
title: "List Sessions",
|
|
111
144
|
description: "List qyl sessions when the user wants to find active or failing sessions, " +
|
|
112
145
|
"with trace/span/error counts, state, and GenAI token usage where present. " +
|
|
146
|
+
"Filters: active_only and a start_time/end_time window (RFC 3339) on the " +
|
|
147
|
+
"session start. Pages: when has_more is true, pass next_cursor as cursor with " +
|
|
148
|
+
"the same filters for the next page. It also returns the annotations on the " +
|
|
149
|
+
"listed sessions. " +
|
|
113
150
|
"display_traces accepts a session_id to show that session's traces in the explorer.",
|
|
114
151
|
inputSchema: ListSessionsInputSchema,
|
|
115
152
|
outputSchema: compactOutputSchema(ListSessionsOutputSchema),
|
|
116
153
|
annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
|
|
117
154
|
_meta: TELEMETRY_TOOL_AUTH_META,
|
|
118
|
-
}, (args, ctx) => runTool(ctx,
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
155
|
+
}, (args, ctx) => runTool(ctx, 2, async (scope) => {
|
|
156
|
+
const page = await fetchSessions({
|
|
157
|
+
limit: args.limit ?? 20,
|
|
158
|
+
active_only: args.active_only,
|
|
159
|
+
start_time: args.start_time,
|
|
160
|
+
end_time: args.end_time,
|
|
161
|
+
cursor: args.cursor,
|
|
162
|
+
}, scope.collector);
|
|
163
|
+
await scope.step(`Fetched ${page.sessions.length} session(s)`);
|
|
164
|
+
const notes = await readSessionAnnotations(page.sessions.map((session) => session.session_id), scope);
|
|
165
|
+
const output = {
|
|
166
|
+
sessions: page.sessions,
|
|
167
|
+
mode: page.mode,
|
|
168
|
+
has_more: page.hasMore,
|
|
169
|
+
...(page.nextCursor === undefined ? {} : { next_cursor: page.nextCursor }),
|
|
170
|
+
...(notes.annotations === undefined ? {} : { annotations: notes.annotations }),
|
|
171
|
+
};
|
|
172
|
+
const filters = filterNote([args.active_only ? "active only" : undefined, ...windowNote(args)]);
|
|
173
|
+
return telemetryToolResult(summarizeSessions(page.sessions, page.mode, filters) + pageNote(page) + notes.text, output);
|
|
123
174
|
}));
|
|
124
175
|
server.registerTool("search_logs", {
|
|
125
176
|
title: "Search Logs",
|
|
126
177
|
description: "Search qyl log records when the user wants error details or logs correlated " +
|
|
127
|
-
"with a trace. Filters include trace_id, service_name,
|
|
128
|
-
"(OTel numbers: 9 INFO, 13 WARN, 17 ERROR),
|
|
178
|
+
"with a trace or a session. Filters include trace_id, session_id, service_name, " +
|
|
179
|
+
"minimum severity (OTel numbers: 9 INFO, 13 WARN, 17 ERROR), a body substring " +
|
|
180
|
+
"query, and a start_time/end_time window (RFC 3339). Pages: when has_more is " +
|
|
181
|
+
"true, pass next_cursor as cursor with the same filters for the next page.",
|
|
129
182
|
inputSchema: SearchLogsInputSchema,
|
|
130
183
|
outputSchema: compactOutputSchema(SearchLogsOutputSchema),
|
|
131
184
|
annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
|
|
132
185
|
_meta: TELEMETRY_TOOL_AUTH_META,
|
|
133
186
|
}, (args, ctx) => runTool(ctx, 1, async (scope) => {
|
|
134
|
-
const
|
|
187
|
+
const page = await fetchLogs({
|
|
135
188
|
trace_id: args.trace_id,
|
|
189
|
+
session_id: args.session_id,
|
|
136
190
|
service_name: args.service_name,
|
|
137
191
|
severity_min: args.severity_min,
|
|
138
192
|
query: args.query,
|
|
193
|
+
start_time: args.start_time,
|
|
194
|
+
end_time: args.end_time,
|
|
139
195
|
limit: args.limit ?? 50,
|
|
196
|
+
cursor: args.cursor,
|
|
140
197
|
}, scope.collector);
|
|
141
|
-
await scope.step(`Fetched ${logs.length} log record(s)`);
|
|
142
|
-
const output = {
|
|
143
|
-
|
|
198
|
+
await scope.step(`Fetched ${page.logs.length} log record(s)`);
|
|
199
|
+
const output = {
|
|
200
|
+
logs: page.logs,
|
|
201
|
+
mode: page.mode,
|
|
202
|
+
has_more: page.hasMore,
|
|
203
|
+
...(page.nextCursor === undefined ? {} : { next_cursor: page.nextCursor }),
|
|
204
|
+
};
|
|
205
|
+
return telemetryToolResult(summarizeLogs(page.logs, page.mode) + pageNote(page), output);
|
|
144
206
|
}));
|
|
145
207
|
}
|
|
146
208
|
//# sourceMappingURL=tools.js.map
|
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,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The tools that change something: annotations, saved queries and the one
|
|
3
|
+
* delete tool, plus the two saved-query reads that belong with them.
|
|
4
|
+
*
|
|
5
|
+
* What they change is limited to objects users create in qyl, inside the
|
|
6
|
+
* verified caller's Collector project: a note on a trace, span or session, and
|
|
7
|
+
* a named filter. No tool here edits or deletes a trace, log or metric;
|
|
8
|
+
* retention alone removes telemetry. Reading and writing stay separate tools,
|
|
9
|
+
* so a host can approve them separately, and each write is its own tool:
|
|
10
|
+
* create, update and delete are never one generic executor.
|
|
11
|
+
*
|
|
12
|
+
* Annotations follow the contract's tool table: create is not idempotent (each
|
|
13
|
+
* call adds a note), update and delete are destructive and idempotent (they
|
|
14
|
+
* replace or remove a version named by its etag, and repeating them changes
|
|
15
|
+
* nothing more). The create and update tools need `qyl:write`, delete needs
|
|
16
|
+
* `qyl:delete`, and the saved-query reads keep `qyl:read` (tool-scopes.ts).
|
|
17
|
+
*/
|
|
18
|
+
import type { McpServer } from "@modelcontextprotocol/server";
|
|
19
|
+
/** Adds an object; a repeated call adds another. */
|
|
20
|
+
export declare const CREATE_TOOL_ANNOTATIONS: {
|
|
21
|
+
readonly readOnlyHint: false;
|
|
22
|
+
readonly destructiveHint: false;
|
|
23
|
+
readonly idempotentHint: false;
|
|
24
|
+
readonly openWorldHint: false;
|
|
25
|
+
};
|
|
26
|
+
/** Replaces the version an etag names; repeating it changes nothing more. */
|
|
27
|
+
export declare const UPDATE_TOOL_ANNOTATIONS: {
|
|
28
|
+
readonly readOnlyHint: false;
|
|
29
|
+
readonly destructiveHint: true;
|
|
30
|
+
readonly idempotentHint: true;
|
|
31
|
+
readonly openWorldHint: false;
|
|
32
|
+
};
|
|
33
|
+
/** Removes the version an etag names; repeating it removes nothing more. */
|
|
34
|
+
export declare const DELETE_TOOL_ANNOTATIONS: {
|
|
35
|
+
readonly readOnlyHint: false;
|
|
36
|
+
readonly destructiveHint: true;
|
|
37
|
+
readonly idempotentHint: true;
|
|
38
|
+
readonly openWorldHint: false;
|
|
39
|
+
};
|
|
40
|
+
/** Registers the seven tools; every handler runs inside runTool. */
|
|
41
|
+
export declare function registerWriteTools(server: McpServer): void;
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The tools that change something: annotations, saved queries and the one
|
|
3
|
+
* delete tool, plus the two saved-query reads that belong with them.
|
|
4
|
+
*
|
|
5
|
+
* What they change is limited to objects users create in qyl, inside the
|
|
6
|
+
* verified caller's Collector project: a note on a trace, span or session, and
|
|
7
|
+
* a named filter. No tool here edits or deletes a trace, log or metric;
|
|
8
|
+
* retention alone removes telemetry. Reading and writing stay separate tools,
|
|
9
|
+
* so a host can approve them separately, and each write is its own tool:
|
|
10
|
+
* create, update and delete are never one generic executor.
|
|
11
|
+
*
|
|
12
|
+
* Annotations follow the contract's tool table: create is not idempotent (each
|
|
13
|
+
* call adds a note), update and delete are destructive and idempotent (they
|
|
14
|
+
* replace or remove a version named by its etag, and repeating them changes
|
|
15
|
+
* nothing more). The create and update tools need `qyl:write`, delete needs
|
|
16
|
+
* `qyl:delete`, and the saved-query reads keep `qyl:read` (tool-scopes.ts).
|
|
17
|
+
*/
|
|
18
|
+
import { compactOutputSchema, contractSchema } from "./contract-validation.js";
|
|
19
|
+
import { annotationLine, createAnnotation, createSavedQuery, deleteResource, describeTarget, listSavedQueries, runSavedQuery, updateAnnotation, updateSavedQuery, } from "./collector-resources.js";
|
|
20
|
+
import { QYL_MCP_DELETE_SCOPE, QYL_MCP_SCOPE, QYL_MCP_WRITE_SCOPE } from "./oauth.js";
|
|
21
|
+
import { runTool } from "./request-scope.js";
|
|
22
|
+
import { humanizeNs, pageNote, shortId } from "./summaries.js";
|
|
23
|
+
import { telemetryToolResult } from "./telemetry-redaction.js";
|
|
24
|
+
import { assertToolScopes, toolScopeChallenge } from "./tool-scopes.js";
|
|
25
|
+
import { READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS, TELEMETRY_TOOL_AUTH_META } from "./tools.js";
|
|
26
|
+
/** Adds an object; a repeated call adds another. */
|
|
27
|
+
export const CREATE_TOOL_ANNOTATIONS = {
|
|
28
|
+
readOnlyHint: false,
|
|
29
|
+
destructiveHint: false,
|
|
30
|
+
idempotentHint: false,
|
|
31
|
+
openWorldHint: false,
|
|
32
|
+
};
|
|
33
|
+
/** Replaces the version an etag names; repeating it changes nothing more. */
|
|
34
|
+
export const UPDATE_TOOL_ANNOTATIONS = {
|
|
35
|
+
readOnlyHint: false,
|
|
36
|
+
destructiveHint: true,
|
|
37
|
+
idempotentHint: true,
|
|
38
|
+
openWorldHint: false,
|
|
39
|
+
};
|
|
40
|
+
/** Removes the version an etag names; repeating it removes nothing more. */
|
|
41
|
+
export const DELETE_TOOL_ANNOTATIONS = {
|
|
42
|
+
readOnlyHint: false,
|
|
43
|
+
destructiveHint: true,
|
|
44
|
+
idempotentHint: true,
|
|
45
|
+
openWorldHint: false,
|
|
46
|
+
};
|
|
47
|
+
const WRITE_SCOPES = [QYL_MCP_SCOPE, QYL_MCP_WRITE_SCOPE];
|
|
48
|
+
const DELETE_SCOPES = [QYL_MCP_SCOPE, QYL_MCP_DELETE_SCOPE];
|
|
49
|
+
/** OpenAI's per-tool `securitySchemes`, in the `_meta` form the read tools use. */
|
|
50
|
+
function securityMeta(scopes) {
|
|
51
|
+
return { securitySchemes: [{ type: "oauth2", scopes: [...scopes] }] };
|
|
52
|
+
}
|
|
53
|
+
const CreateAnnotationInputSchema = contractSchema("Mcp.Tools.CreateAnnotationInput");
|
|
54
|
+
const UpdateAnnotationInputSchema = contractSchema("Mcp.Tools.UpdateAnnotationInput");
|
|
55
|
+
const AnnotationOutputSchema = contractSchema("Mcp.Tools.AnnotationOutput");
|
|
56
|
+
const CreateSavedQueryInputSchema = contractSchema("Mcp.Tools.CreateSavedQueryInput");
|
|
57
|
+
const UpdateSavedQueryInputSchema = contractSchema("Mcp.Tools.UpdateSavedQueryInput");
|
|
58
|
+
const SavedQueryOutputSchema = contractSchema("Mcp.Tools.SavedQueryOutput");
|
|
59
|
+
const ListSavedQueriesInputSchema = contractSchema("Mcp.Tools.ListSavedQueriesInput");
|
|
60
|
+
const ListSavedQueriesOutputSchema = contractSchema("Mcp.Tools.ListSavedQueriesOutput");
|
|
61
|
+
const RunSavedQueryInputSchema = contractSchema("Mcp.Tools.RunSavedQueryInput");
|
|
62
|
+
const RunSavedQueryOutputSchema = contractSchema("Mcp.Tools.RunSavedQueryOutput");
|
|
63
|
+
const DeleteInputSchema = contractSchema("Mcp.Tools.DeleteInput");
|
|
64
|
+
const DeleteOutputSchema = contractSchema("Mcp.Tools.DeleteOutput");
|
|
65
|
+
function savedQueryLine(query) {
|
|
66
|
+
const description = query.description ? ` — ${query.description.replace(/\s+/gu, " ").slice(0, 120)}` : "";
|
|
67
|
+
return `- ${query.name} (${query.filter.signal}) · id ${query.id} · etag ${query.etag}${description}`;
|
|
68
|
+
}
|
|
69
|
+
function summarizeRun(id, result) {
|
|
70
|
+
switch (result.signal) {
|
|
71
|
+
case "traces": {
|
|
72
|
+
const rows = result.items.map((trace) => `- ${shortId(trace.trace_id)} ${trace.root_span?.name ?? "unknown root"} · ${humanizeNs(trace.duration_ns)} · ` +
|
|
73
|
+
`${trace.span_count} spans · ${trace.has_error ? "ERROR" : "OK"} · ${trace.services.slice(0, 3).join(", ")}`);
|
|
74
|
+
return `Saved query ${id}: ${result.items.length} trace(s)` +
|
|
75
|
+
(rows.length === 0 ? "." : `\n${rows.join("\n")}`) + pageNote({ hasMore: result.has_more });
|
|
76
|
+
}
|
|
77
|
+
case "logs":
|
|
78
|
+
return `Saved query ${id}: ${result.items.length} log record(s); the records are in the structured result.` +
|
|
79
|
+
pageNote({ hasMore: result.has_more });
|
|
80
|
+
case "metrics":
|
|
81
|
+
return `Saved query ${id}: ${result.result.name} ${result.result.aggregation} over ` +
|
|
82
|
+
`${result.result.start_time}..${result.result.end_time}, ${result.result.series.length} series` +
|
|
83
|
+
(result.result.truncated ? " (truncated at the series limit)" : "") + ".";
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/** Registers the seven tools; every handler runs inside runTool. */
|
|
87
|
+
export function registerWriteTools(server) {
|
|
88
|
+
server.registerTool("create_annotation", {
|
|
89
|
+
title: "Create Annotation",
|
|
90
|
+
description: "Attach a plain-text note of at most 2000 characters to a trace, a span or a session " +
|
|
91
|
+
"in the user's qyl project when the user wants to record a finding next to the telemetry. " +
|
|
92
|
+
"The note leaves the telemetry it points at unchanged; get_trace and list_sessions return " +
|
|
93
|
+
"it with its id and etag. Each call adds a new annotation.",
|
|
94
|
+
inputSchema: CreateAnnotationInputSchema,
|
|
95
|
+
outputSchema: compactOutputSchema(AnnotationOutputSchema),
|
|
96
|
+
annotations: CREATE_TOOL_ANNOTATIONS,
|
|
97
|
+
scopeChallenge: toolScopeChallenge("create_annotation", WRITE_SCOPES),
|
|
98
|
+
_meta: securityMeta(WRITE_SCOPES),
|
|
99
|
+
}, (args, ctx) => runTool(ctx, 1, async (scope) => {
|
|
100
|
+
assertToolScopes("create_annotation", WRITE_SCOPES, ctx.http?.authInfo);
|
|
101
|
+
const annotation = await createAnnotation(args, scope.collector);
|
|
102
|
+
await scope.step(`Created annotation ${annotation.id}`);
|
|
103
|
+
const output = { annotation };
|
|
104
|
+
return telemetryToolResult(`Created annotation ${annotation.id} on ${describeTarget(annotation.target)} (etag ${annotation.etag}).`, output);
|
|
105
|
+
}));
|
|
106
|
+
server.registerTool("update_annotation", {
|
|
107
|
+
title: "Update Annotation",
|
|
108
|
+
description: "Replace the text of one annotation when the user wants to correct or extend a note. " +
|
|
109
|
+
"Pass its id and current etag from get_trace, list_sessions or create_annotation; a stale " +
|
|
110
|
+
"etag is refused instead of overwriting a newer version. What the note is attached to stays fixed.",
|
|
111
|
+
inputSchema: UpdateAnnotationInputSchema,
|
|
112
|
+
outputSchema: compactOutputSchema(AnnotationOutputSchema),
|
|
113
|
+
annotations: UPDATE_TOOL_ANNOTATIONS,
|
|
114
|
+
scopeChallenge: toolScopeChallenge("update_annotation", WRITE_SCOPES),
|
|
115
|
+
_meta: securityMeta(WRITE_SCOPES),
|
|
116
|
+
}, (args, ctx) => runTool(ctx, 1, async (scope) => {
|
|
117
|
+
assertToolScopes("update_annotation", WRITE_SCOPES, ctx.http?.authInfo);
|
|
118
|
+
const annotation = await updateAnnotation(args, scope.collector);
|
|
119
|
+
await scope.step(`Updated annotation ${annotation.id}`);
|
|
120
|
+
const output = { annotation };
|
|
121
|
+
return telemetryToolResult(`Updated annotation ${annotation.id}; its etag is now ${annotation.etag}.\n${annotationLine(annotation)}`, output);
|
|
122
|
+
}));
|
|
123
|
+
server.registerTool("create_saved_query", {
|
|
124
|
+
title: "Create Saved Query",
|
|
125
|
+
description: "Save a named filter for traces, logs or metrics in the user's qyl project when the user " +
|
|
126
|
+
"wants to ask the same question again later. Names are unique per project. Only the filter " +
|
|
127
|
+
"is stored, never results; run_saved_query evaluates it against the telemetry of that moment.",
|
|
128
|
+
inputSchema: CreateSavedQueryInputSchema,
|
|
129
|
+
outputSchema: compactOutputSchema(SavedQueryOutputSchema),
|
|
130
|
+
annotations: CREATE_TOOL_ANNOTATIONS,
|
|
131
|
+
scopeChallenge: toolScopeChallenge("create_saved_query", WRITE_SCOPES),
|
|
132
|
+
_meta: securityMeta(WRITE_SCOPES),
|
|
133
|
+
}, (args, ctx) => runTool(ctx, 1, async (scope) => {
|
|
134
|
+
assertToolScopes("create_saved_query", WRITE_SCOPES, ctx.http?.authInfo);
|
|
135
|
+
const savedQuery = await createSavedQuery(args, scope.collector);
|
|
136
|
+
await scope.step(`Created saved query ${savedQuery.id}`);
|
|
137
|
+
const output = { saved_query: savedQuery };
|
|
138
|
+
return telemetryToolResult(`Created saved query ${savedQuery.name} (${savedQuery.filter.signal}), id ${savedQuery.id}, ` +
|
|
139
|
+
`etag ${savedQuery.etag}.`, output);
|
|
140
|
+
}));
|
|
141
|
+
server.registerTool("update_saved_query", {
|
|
142
|
+
title: "Update Saved Query",
|
|
143
|
+
description: "Rename a saved query or change its description or filter when the user wants to adjust a " +
|
|
144
|
+
"stored question. Pass its id and current etag from list_saved_queries or create_saved_query; " +
|
|
145
|
+
"omitted fields keep their value, and a stale etag is refused instead of overwriting a newer version.",
|
|
146
|
+
inputSchema: UpdateSavedQueryInputSchema,
|
|
147
|
+
outputSchema: compactOutputSchema(SavedQueryOutputSchema),
|
|
148
|
+
annotations: UPDATE_TOOL_ANNOTATIONS,
|
|
149
|
+
scopeChallenge: toolScopeChallenge("update_saved_query", WRITE_SCOPES),
|
|
150
|
+
_meta: securityMeta(WRITE_SCOPES),
|
|
151
|
+
}, (args, ctx) => runTool(ctx, 1, async (scope) => {
|
|
152
|
+
assertToolScopes("update_saved_query", WRITE_SCOPES, ctx.http?.authInfo);
|
|
153
|
+
const savedQuery = await updateSavedQuery(args, scope.collector);
|
|
154
|
+
await scope.step(`Updated saved query ${savedQuery.id}`);
|
|
155
|
+
const output = { saved_query: savedQuery };
|
|
156
|
+
return telemetryToolResult(`Updated saved query ${savedQuery.id}; its etag is now ${savedQuery.etag}.\n${savedQueryLine(savedQuery)}`, output);
|
|
157
|
+
}));
|
|
158
|
+
server.registerTool("list_saved_queries", {
|
|
159
|
+
title: "List Saved Queries",
|
|
160
|
+
description: "List the saved queries in the user's qyl project by name when the user wants to find a " +
|
|
161
|
+
"stored question to run, change or delete, optionally only those for traces, logs or metrics. " +
|
|
162
|
+
"Each entry carries its id, etag and filter; pass next_cursor as cursor for the next page.",
|
|
163
|
+
inputSchema: ListSavedQueriesInputSchema,
|
|
164
|
+
outputSchema: compactOutputSchema(ListSavedQueriesOutputSchema),
|
|
165
|
+
annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
|
|
166
|
+
_meta: TELEMETRY_TOOL_AUTH_META,
|
|
167
|
+
}, (args, ctx) => runTool(ctx, 1, async (scope) => {
|
|
168
|
+
const page = await listSavedQueries(args, scope.collector);
|
|
169
|
+
await scope.step(`Fetched ${page.savedQueries.length} saved query(s)`);
|
|
170
|
+
const output = {
|
|
171
|
+
saved_queries: page.savedQueries,
|
|
172
|
+
has_more: page.hasMore,
|
|
173
|
+
...(page.nextCursor === undefined ? {} : { next_cursor: page.nextCursor }),
|
|
174
|
+
};
|
|
175
|
+
const text = page.savedQueries.length === 0
|
|
176
|
+
? `No saved queries${args.signal === undefined ? "" : ` for ${args.signal}`} in this project.`
|
|
177
|
+
: `Saved queries (${page.savedQueries.length}):\n${page.savedQueries.map(savedQueryLine).join("\n")}`;
|
|
178
|
+
return telemetryToolResult(text + pageNote(page), output);
|
|
179
|
+
}));
|
|
180
|
+
server.registerTool("run_saved_query", {
|
|
181
|
+
title: "Run Saved Query",
|
|
182
|
+
description: "Run one saved query against the current telemetry when the user wants the stored question's " +
|
|
183
|
+
"answer now: trace summaries, log records or a metric range result, depending on its signal. " +
|
|
184
|
+
"It only reads. start_time and end_time replace the saved look-back window, and next_cursor " +
|
|
185
|
+
"pages trace and log results.",
|
|
186
|
+
inputSchema: RunSavedQueryInputSchema,
|
|
187
|
+
outputSchema: compactOutputSchema(RunSavedQueryOutputSchema),
|
|
188
|
+
annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
|
|
189
|
+
_meta: TELEMETRY_TOOL_AUTH_META,
|
|
190
|
+
}, (args, ctx) => runTool(ctx, 1, async (scope) => {
|
|
191
|
+
const result = await runSavedQuery(args, scope.collector);
|
|
192
|
+
await scope.step(`Ran saved query ${args.id}`);
|
|
193
|
+
const output = { result, mode: "live" };
|
|
194
|
+
return telemetryToolResult(summarizeRun(args.id, result), output);
|
|
195
|
+
}));
|
|
196
|
+
server.registerTool("delete", {
|
|
197
|
+
title: "Delete Annotation or Saved Query",
|
|
198
|
+
description: "Delete one annotation or saved query by id when the user asks to remove it. Pass its current " +
|
|
199
|
+
"etag; a stale etag is refused instead of deleting a newer version. It deletes only objects users " +
|
|
200
|
+
"created in qyl, never traces, logs or metrics: retention removes telemetry.",
|
|
201
|
+
inputSchema: DeleteInputSchema,
|
|
202
|
+
outputSchema: compactOutputSchema(DeleteOutputSchema),
|
|
203
|
+
annotations: DELETE_TOOL_ANNOTATIONS,
|
|
204
|
+
scopeChallenge: toolScopeChallenge("delete", DELETE_SCOPES),
|
|
205
|
+
_meta: securityMeta(DELETE_SCOPES),
|
|
206
|
+
}, (args, ctx) => runTool(ctx, 1, async (scope) => {
|
|
207
|
+
assertToolScopes("delete", DELETE_SCOPES, ctx.http?.authInfo);
|
|
208
|
+
await deleteResource(args.kind, args.id, args.etag, scope.collector);
|
|
209
|
+
await scope.step(`Deleted ${args.kind} ${args.id}`);
|
|
210
|
+
const output = { deleted: true };
|
|
211
|
+
return telemetryToolResult(`Deleted ${args.kind === "annotation" ? "annotation" : "saved query"} ${args.id}.`, output);
|
|
212
|
+
}));
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=write-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-tools.js","sourceRoot":"","sources":["../src/write-tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "qyl-mcp-server",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.5.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": {
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"smoke:projects": "node project-access-smoke.mjs"
|
|
79
79
|
},
|
|
80
80
|
"dependencies": {
|
|
81
|
-
"@ancplua/qyl-api-schema": "11.
|
|
81
|
+
"@ancplua/qyl-api-schema": "11.6.0",
|
|
82
82
|
"@modelcontextprotocol/core": "2.3.1",
|
|
83
83
|
"@modelcontextprotocol/server": "2.3.1",
|
|
84
84
|
"@opentelemetry/api": "1.9.1",
|