qyl-mcp-server 7.3.1 → 7.4.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 +44 -5
- package/dist/ci.js +1 -1
- package/dist/ci.js.map +1 -1
- package/dist/collector.d.ts +9 -6
- package/dist/collector.js +4 -1
- package/dist/collector.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 +1 -1
- 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/paging.d.ts +16 -0
- package/dist/paging.js +33 -0
- package/dist/paging.js.map +1 -0
- package/dist/server.js +44 -38
- 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/tools.js +66 -16
- package/dist/tools.js.map +1 -1
- 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
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool INPUT shapes derived from the published operation parameters.
|
|
3
|
-
*
|
|
4
|
-
* contract-validation.ts binds every response body and every `Mcp.Tools.*`
|
|
5
|
-
* shape the contract publishes. The metrics read API arrived in
|
|
6
|
-
* @ancplua/qyl-api-schema 8.0.0 with its response bodies but without
|
|
7
|
-
* `Mcp.Tools.*Metric*` input shapes, so there is nothing there to bind for the
|
|
8
|
-
* arguments of `list_metrics`, `get_metric_series`, and `query_metric`.
|
|
9
|
-
*
|
|
10
|
-
* Hand-writing those three objects is exactly what architecture gate G10a
|
|
11
|
-
* exists to prevent, and an exemption would carve the hole in the one place the
|
|
12
|
-
* gate names first ("request, response, or tool-input shapes"). So the inputs
|
|
13
|
-
* are generated too — from the other artifact the contract package publishes,
|
|
14
|
-
* its OpenAPI document. Every name, type, bound, default, enum, and description
|
|
15
|
-
* a metrics tool advertises is read out of `@ancplua/qyl-api-schema/openapi` at
|
|
16
|
-
* startup; nothing here is typed by hand except which operation a tool wraps,
|
|
17
|
-
* which is the same standing as `Operations.TracesApi_list.Response.200` being
|
|
18
|
-
* named in contract-validation.ts. A parameter added, retyped, or re-bounded on
|
|
19
|
-
* the collector side therefore moves the tool's advertised input and fails the
|
|
20
|
-
* G10b manifest snapshot, instead of drifting silently.
|
|
21
|
-
*
|
|
22
|
-
* This module is deliberately NOT re-exported through contract-validation.ts:
|
|
23
|
-
* the OpenAPI document is ~730 KB and that module is also imported by the
|
|
24
|
-
* dashboard and workbench browser bundles.
|
|
25
|
-
*
|
|
26
|
-
* When the contract publishes `Mcp.Tools.ListMetricsInput` and friends, delete
|
|
27
|
-
* this file and bind them in contract-validation.ts like every other tool.
|
|
28
|
-
*/
|
|
29
|
-
import { createRequire } from "node:module";
|
|
30
|
-
import * as z from "zod/v4";
|
|
31
|
-
const COMPONENT_SCHEMA_PREFIX = "#/components/schemas/";
|
|
32
|
-
// require() rather than an import attribute: the package's "./openapi" export
|
|
33
|
-
// declares no "types" condition, so a static JSON import has no type to resolve
|
|
34
|
-
// and `verbatimModuleSyntax` would have to be worked around at every call site.
|
|
35
|
-
const publishedOpenApi = createRequire(import.meta.url)("@ancplua/qyl-api-schema/openapi");
|
|
36
|
-
/**
|
|
37
|
-
* Rewrite a published parameter schema into the subset `z.fromJSONSchema`
|
|
38
|
-
* accepts, resolving component references as it goes.
|
|
39
|
-
*
|
|
40
|
-
* Two published constructs need it, for the same reasons the contract package's
|
|
41
|
-
* own zod adapter documents: `unevaluatedProperties` is rejected outright by
|
|
42
|
-
* `z.fromJSONSchema` and is only ever used to seal an object, and a
|
|
43
|
-
* `#/components/schemas/...` reference has no meaning once the parameter is
|
|
44
|
-
* lifted out of the OpenAPI document. Resolution is by inlining, which is exact
|
|
45
|
-
* for the enums and scalars parameters actually use and would need a `$defs`
|
|
46
|
-
* carrier if a parameter ever referenced a recursive model.
|
|
47
|
-
*/
|
|
48
|
-
function resolvePublishedSchema(node, seen = []) {
|
|
49
|
-
if (Array.isArray(node))
|
|
50
|
-
return node.map((item) => resolvePublishedSchema(item, seen));
|
|
51
|
-
if (typeof node !== "object" || node === null)
|
|
52
|
-
return node;
|
|
53
|
-
const source = node;
|
|
54
|
-
const resolved = {};
|
|
55
|
-
for (const [key, value] of Object.entries(source)) {
|
|
56
|
-
if (key === "unevaluatedProperties" || key === "$ref")
|
|
57
|
-
continue;
|
|
58
|
-
resolved[key] = resolvePublishedSchema(value, seen);
|
|
59
|
-
}
|
|
60
|
-
const reference = source.$ref;
|
|
61
|
-
if (typeof reference !== "string")
|
|
62
|
-
return resolved;
|
|
63
|
-
if (!reference.startsWith(COMPONENT_SCHEMA_PREFIX)) {
|
|
64
|
-
throw new Error(`contract-operations: unsupported parameter reference ${reference}`);
|
|
65
|
-
}
|
|
66
|
-
const name = reference.slice(COMPONENT_SCHEMA_PREFIX.length);
|
|
67
|
-
if (seen.includes(name)) {
|
|
68
|
-
throw new Error(`contract-operations: ${name} is recursive; a parameter referencing it needs a ` +
|
|
69
|
-
"$defs carrier rather than inlining");
|
|
70
|
-
}
|
|
71
|
-
const target = publishedOpenApi.components.schemas[name];
|
|
72
|
-
if (target === undefined) {
|
|
73
|
-
throw new Error(`contract-operations: ${reference} is not a published component schema`);
|
|
74
|
-
}
|
|
75
|
-
// A `$ref` with siblings is how the contract spells "this published model,
|
|
76
|
-
// with this default" — `aggregation` is `MetricAggregation` plus
|
|
77
|
-
// `default: "avg"`. Dropping the siblings would silently drop the default and
|
|
78
|
-
// leave the tool advertising a required-looking enum with no fallback, so the
|
|
79
|
-
// resolved target is merged UNDER them: the local keywords win.
|
|
80
|
-
return { ...resolvePublishedSchema(target, [...seen, name]), ...resolved };
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* The tool-input schema for one published GET operation.
|
|
84
|
-
*
|
|
85
|
-
* Header parameters are excluded: `ProjectScopeHeader` is the server-owned
|
|
86
|
-
* collector project scope, which QYL_PROJECT sets and a model never supplies —
|
|
87
|
-
* the same boundary the root README states for every other tool.
|
|
88
|
-
*/
|
|
89
|
-
export function operationInputSchema(pathname) {
|
|
90
|
-
const operation = publishedOpenApi.paths[pathname]?.get;
|
|
91
|
-
if (operation === undefined) {
|
|
92
|
-
throw new Error(`contract-operations: the contract publishes no GET ${pathname}`);
|
|
93
|
-
}
|
|
94
|
-
const properties = {};
|
|
95
|
-
const required = [];
|
|
96
|
-
for (const parameter of operation.parameters ?? []) {
|
|
97
|
-
// A $ref parameter is a shared component; the only one the metrics
|
|
98
|
-
// operations use is the project-scope header.
|
|
99
|
-
if (parameter.$ref !== undefined || parameter.name === undefined)
|
|
100
|
-
continue;
|
|
101
|
-
if (parameter.in === "header")
|
|
102
|
-
continue;
|
|
103
|
-
const schema = resolvePublishedSchema(parameter.schema);
|
|
104
|
-
properties[parameter.name] = parameter.description === undefined
|
|
105
|
-
? schema
|
|
106
|
-
: { ...schema, description: parameter.description };
|
|
107
|
-
if (parameter.required === true)
|
|
108
|
-
required.push(parameter.name);
|
|
109
|
-
}
|
|
110
|
-
if (Object.keys(properties).length === 0) {
|
|
111
|
-
throw new Error(`contract-operations: GET ${pathname} publishes no model-supplied parameters`);
|
|
112
|
-
}
|
|
113
|
-
// The assembled document is JSON Schema by construction — every property came
|
|
114
|
-
// out of the published parameter list — but it is built as plain data, so the
|
|
115
|
-
// cast is what tells the compiler that.
|
|
116
|
-
const assembled = {
|
|
117
|
-
type: "object",
|
|
118
|
-
properties,
|
|
119
|
-
...(required.length === 0 ? {} : { required }),
|
|
120
|
-
additionalProperties: false,
|
|
121
|
-
};
|
|
122
|
-
return z.fromJSONSchema(assembled);
|
|
123
|
-
}
|
|
124
|
-
//# sourceMappingURL=contract-operations.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contract-operations.js","sourceRoot":"","sources":["../src/contract-operations.ts"],"names":[],"mappings":"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"}
|