qyl-mcp-server 8.1.0 → 8.1.2

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 CHANGED
@@ -182,8 +182,7 @@ this JSON configuration. Keep the map in host secrets and out of the plugin ZIP.
182
182
  writes included, viewer query paths and both protocol eras against a
183
183
  real local Collector with two temporary projects. It reuses the completed Release
184
184
  build; set `QYL_COLLECTOR_DLL` for another build. The script uses local test identities
185
- and an in-process signed webhook receiver; the hosted reviewer OAuth login and
186
- real ChatGPT demonstration are separate checks before upload.
185
+ and an in-process signed webhook receiver.
187
186
 
188
187
  ### Seeded analysis verification
189
188
 
@@ -198,357 +197,4 @@ all 32 tools against an isolated collector started by the published CLI.
198
197
 
199
198
  ## Release notes
200
199
 
201
- ### 8.1.0
202
-
203
- - Serve the qyl-investigate skill from the server through the MCP skills extension (`io.modelcontextprotocol/skills`: `skills/list`, `skills/get` and `resources/read` under `skill://qyl/`), so the OpenAI plugin portal imports it at Scan Tools and the npm package carries it in `dist/skills`. The skill now names the tool to start with for each question, the defaults every tool applies, the accepted `aggregate_telemetry` measures, and the one-call connection rule: no fan-out before one call has returned telemetry, one retry after sign-in, then stop.
204
- - Advertise output schemas inlined rather than hoisted into `$defs`: ChatGPT does not resolve `$ref`, so `verify_fix.verdict` and most of `get_failure_context` reached the model as `unknown`. The redundant date-time regex is dropped from advertised schemas.
205
- - Use collector contract 12.1.2, whose tool descriptions state the default window, baseline, page sizes, span selection and the accepted measure and ordering values.
206
-
207
- ### 8.0.0
208
-
209
- - The executable now requires Bun 1.4 or later, including stdio. Library subpaths remain usable on Node 24; TypeScript 7 continues to emit the package.
210
- - Start HTTP explicitly with a 60-second idle timeout so quiet SSE responses survive the SDK keep-alive. Stop the HTTP server during shutdown.
211
- - Request read, write and delete scopes at initial sign-in; step-up challenges name only missing scopes.
212
- - Return useful text summaries, bounded evidence and continuations; validate failure updates and make create retries idempotent by default.
213
- - Use collector contract 12.1.1 for corrected analysis paging, coverage and failure timestamps. Remove the obsolete demo runtime and duplicate read implementations.
214
- - Pin SemanticConventions 9.9.1, including the canonical `qyl.gen_ai.tool.call.arguments_hash` definition used by collector 12.1.1 for repeated-call analysis.
215
- - Preserve note drafts, render trace drill-down results and use consistent dashboard filters. Gate the real OTLP answer-key and Bun quiet-stream regressions.
216
-
217
- ### 7.7.0
218
-
219
- - Expand to 32 tools: failure triage and lifecycle, trace/group comparisons, fix verification, telemetry aggregation and discovery, agent runs, releases, service maps, telemetry health and MCP statistics.
220
- - Use the collector's shared typed analysis contracts for filtering, pagination, coverage and saved-query execution; retain official SDKs/exporters and project-scoped authorization.
221
- - Add responsive trace comparison, explicit note/bookmark controls, dashboard filters and drill-downs, with denominator counts behind rates.
222
- - Preserve numeric agent token usage during secret redaction, and verify the new surface against real OTLP fixtures plus both protocol eras.
223
-
224
-
225
- ### 7.6.1
226
-
227
- - Manage existing Auth0 API permissions, client grants and mapped-user permissions with scoped tenant configuration and a drift check.
228
-
229
- - Use the qyl-owned semantic conventions package generated from the same registry as C#. MCP attribute names, values, operation events, duration metrics and seconds remain consistent across both languages. The official OpenTelemetry SDKs and exporters and the shared API contracts remain in use.
230
-
231
- ### 7.6.0
232
-
233
- - Contract 12.0.0 (`@ancplua/qyl-api-schema` 12.0.0, revision
234
- `sha256:b29439eba28e752b`): the server is generated from it and refuses a
235
- Collector on another revision, so it deploys only after the Collector serves
236
- 12.0.0.
237
- - Every problem the Collector or the workbench reports is RFC 9457 with a
238
- `type` URI (`https://qyl.at/problems/<name>`) and a stable `code`. A tool
239
- error's code now follows the problem's `code` (`not_found`, `conflict`,
240
- `precondition_failed`, `precondition_required`, `collector_unauthorized`,
241
- `collector_error`) and falls back to the HTTP status only for a body
242
- without one.
243
- - One page limit on every list: 1 to 1000, 100 when omitted. The workbench
244
- reads Collector logs in pages of 1000 following `next_cursor` (up to ten
245
- pages, the same bound as before), and its protocol-event page defaults to
246
- 100. `next_cursor` is absent on the last page.
247
- - The workbench's HTTP errors no longer carry `X-Request-Id`; no server sent
248
- it.
249
-
250
- ### 7.5.0
251
-
252
- - Write tools, each a separate tool so a host can approve it on its own:
253
- `create_annotation` and `update_annotation` (notes on a trace, span or
254
- session), `create_saved_query` and `update_saved_query` (named filters), and
255
- one `delete` for either kind. They change only those objects, in the
256
- caller's Collector project; no tool deletes or edits telemetry.
257
- `list_saved_queries` and `run_saved_query` read saved queries, and
258
- `get_trace` and `list_sessions` return annotations.
259
- - Scopes: `qyl:write` for create and update, `qyl:delete` for `delete`;
260
- `qyl:read` alone keeps the read tools. The protected-resource metadata lists
261
- all three, and a call without the scope it needs gets a `403`
262
- `insufficient_scope` challenge. The Collector key needs the `write` and
263
- `delete` roles.
264
-
265
- ### 7.4.0
266
-
267
- - Contract package `@ancplua/qyl-api-schema` 11.6.0 (revision
268
- `sha256:d926c3c6ab829cbf`). The hosted server starts only against a
269
- Collector built from `Qyl.Api.Contracts` 11.6.0, so the Collector deploys
270
- first.
271
- - Paging on every list tool: `list_traces`, `list_sessions`, `search_logs`,
272
- `list_metrics` and `get_metric_series` return `has_more` and `next_cursor`
273
- and take `cursor`. Demo mode pages too, with its own opaque cursor.
274
- - `list_traces` filters: `start_time`, `end_time`, `service_name`,
275
- `errors_only`. `list_sessions` and `search_logs` take the window;
276
- `search_logs` also takes `session_id`.
277
- - Metric matchers are structured: `matchers: [{ key, op: "eq" | "prefix",
278
- value }]` replaces the `attr` / `attr_prefix` strings on `get_metric_series`
279
- and `query_metric`; `step_ms` and `hours` are integers.
280
- - `fetch_telemetry` input is a discriminated union over `view`, published with
281
- an object root, and the tool now advertises its output schema. The `traces`
282
- view accepts a `trace_id` to return that one trace selected.
283
- - Every tool output model admits `error`; the server's error codes are the
284
- contract's `ToolErrorCode` enum.
285
-
286
- ### 7.3.1
287
-
288
- - Transient answers without a contract body keep their status code: an HTML
289
- `502`/`503` from the edge during a deploy window, or an empty `429`, now
290
- yield `collector_error` or `collector_rate_limited` with `retryable: true`
291
- instead of `contract_mismatch`. Any other unexpected body stays
292
- `contract_mismatch`.
293
-
294
- ### 7.3.0
295
-
296
- - Every failed tool call now carries `structuredContent.error` with a stable
297
- `code`, the `message` and `retryable`, next to the unchanged text content and
298
- `isError: true`. Codes: `invalid_argument`, `not_found`, `no_project_access`,
299
- `collector_unreachable`, `collector_timeout`, `cancelled`,
300
- `collector_unauthorized`, `collector_rate_limited`, `collector_rejected`,
301
- `collector_error`, `contract_mismatch`, `internal`. Additive: clients that read
302
- only the text see no change.
303
- - `list_metrics` and `get_metric_series` report the page's own `has_more`
304
- instead of a hardcoded `false`, so a catalog truncated by `limit` no longer
305
- reads as complete.
306
- - Contract package `@ancplua/qyl-api-schema` stays 11.5.0 (revision
307
- `sha256:3605ae27d2edf632`); no Collector change is needed.
308
-
309
- ### 7.2.3
310
-
311
- - Contract package `@ancplua/qyl-api-schema` 11.5.0. The release changes only
312
- qyl-api-schema's toolchain: the contract revision stays
313
- `sha256:3605ae27d2edf632`, so a Collector built from `Qyl.Api.Contracts`
314
- 11.4.0 or 11.5.0 passes the startup handshake.
315
-
316
- ### 7.2.2
317
-
318
- - MCP Apps viewers check both the SDK client name and the `User-Agent` when
319
- choosing their domain. A recognized client name wins over a conflicting
320
- User-Agent, and an unknown name no longer hides a recognized one; 7.2.0 and
321
- 7.2.1 read the User-Agent only when no client name was sent. When neither is
322
- recognized, `ui.domain` and `openai/widgetDomain` are both omitted and the
323
- host uses its default sandbox.
324
- - The viewers are now `ui://qyl-explorer/mcp-app-v6.html` and
325
- `ui://qyl-explorer/mcp-dashboard-v4.html`, so hosts drop metadata cached for
326
- the previous versions.
327
-
328
- ### 7.2.1
329
-
330
- - Contract package `@ancplua/qyl-api-schema` 11.4.0 (TypeSpec 1.17). The
331
- contract revision is now `sha256:3605ae27d2edf632`. The server refuses to
332
- start against a Collector that advertises another revision, so run it with a
333
- Collector built from `Qyl.Api.Contracts` 11.4.0.
334
- - OpenTelemetry 0.223.0 / 2.12.0 and the remaining dependencies at their latest
335
- releases.
336
-
337
- ### 7.2.0
338
-
339
- - Removed deprecated MCP logging capability and per-call log notifications;
340
- retained requested progress, cancellation and native operation telemetry.
341
- [Dated verification, 2026-10-08](https://github.com/ANcpLua/qyl.mcp/blob/main/docs/evidence/2026-10-08-followup-01.md).
342
-
343
- - Optional Auth0-account-to-Collector project isolation, also applied to Events.
344
- - Events share polling for accounts assigned to the same project; independent
345
- projects are polled concurrently. Invalid stdio project configuration fails
346
- before accepting a connection.
347
- - Workbench telemetry recognizes the SDK's per-request server factory so native
348
- tool spans are not duplicated by the surrounding protocol journal, while
349
- failed server construction still produces a correlated failure span.
350
- - `get_trace` accepts optional `errors_only`, `max_spans` and
351
- `include_attributes`; `ci_log` accepts an optional `service_prefix` (default
352
- `qyl-ci`).
353
- - Advertised output schemas use portable spelling (`additionalProperties: true`,
354
- `anyOf` instead of type arrays); validation is unchanged.
355
- - MCP Apps viewers declare the UI domain Claude and ChatGPT each expect, and
356
- none for other hosts.
357
-
358
- ### 7.1.1
359
-
360
- - SDK v2.3.1 serving defaults accept modern and 2025-era tool clients over HTTP
361
- and stdio. The workbench negotiates automatically. The strict policy described
362
- under 6.0.0 below has been removed.
363
- - Events recheck account status, explicit client access, user permissions and
364
- consent through Auth0. Unsubscribe aborts outstanding deliveries; restart
365
- cleanup removes expired subscriptions and obsolete signing keys.
366
- - Public viewers declare their deployment origin and keep the requested trace
367
- limit on refresh. Release verification exercises a fresh npm consumer with
368
- modern and 2025-era discovery and a real demo-tool call.
369
-
370
- ### 7.1.0
371
-
372
- - The hosted server can sit behind Cloudflare Access Managed OAuth:
373
- `MCP_AUTH_PROVIDER=cloudflare-access` with `MCP_ACCESS_TEAM_DOMAIN` and
374
- `MCP_ACCESS_AUD`. Access performs the client OAuth flow and owns discovery;
375
- the origin serves `/mcp` only for a `Cf-Access-Jwt-Assertion` it has verified
376
- against the team's signing keys for RS256, issuer, application audience,
377
- expiry and subject, so a direct request to the origin without one is
378
- rejected. The default stays the pinned Auth0 issuer; unknown modes, partial
379
- Access settings and non-Cloudflare team URLs fail closed.
380
- - The assertion header is redacted from diagnostic objects and text, like the
381
- other credentials.
382
-
383
- ### 7.0.0
384
-
385
- - Contract `@ancplua/qyl-api-schema` 11.1.0 -> 11.2.0. Demo series ids are
386
- computed with the contract's `attributeIdentity`, the same string the
387
- collector computes in C#, so a demo series id and a live one are comparable;
388
- every demo series id changes, which is why this is a major. A contract major
389
- moves this package's major from now on.
390
-
391
- ### 6.2.1
392
-
393
- - Contract `@ancplua/qyl-api-schema` 11.0.1 -> 11.1.0. Every tool shape is
394
- `contractSchema("<definition>")`, typed by the contract at compile time, so
395
- the textual shape gate is gone; trace, span and session ids are parsed
396
- through the contract's generated parsers instead of cast; the nanosecond
397
- helpers come from the contract's `/runtime`.
398
-
399
- ### 6.2.0
400
-
401
- - Contract `@ancplua/qyl-api-schema` 10.0.1 -> 11.0.1, revision
402
- `sha256:cd69d9c37a41916c` -> `sha256:5c1aa27ccdf48067`. Attribute values are
403
- decoded through the contract's own `/runtime` subpath instead of a local
404
- copy of the dashboard's decoder; bytes and key-value lists render as their
405
- values, never as `[object Object]`. A log body is an `AttributeValue`: a plain
406
- string body is a bare string, and the three body shapes the collector never
407
- produced are gone from the contract and from this server.
408
-
409
- ### 6.1.2
410
-
411
- - The landing page at `mcp.qyl.at` states what 6.1.0 added: a request-scope
412
- section for cancellation, progress and the per-call log line, the full
413
- eleven-tool surface, and a hero fact for it. Surfaces take the ink of the
414
- original qyl site (`#050706`) and its family; the cyan accent is unchanged.
415
- - The page no longer embeds the whole `package.json`: a default JSON import
416
- inlined the dependency and export tables into every visitor's download; a
417
- named import of `version` ships the one field the footer shows.
418
-
419
- ### 6.1.1
420
-
421
- - The bundled viewers no longer ask for progress they never read: the MCP
422
- Apps client passed a no-op `onprogress` on every `tools/call`, which put a
423
- `progressToken` on each request and, since 6.1.0, had the server answer
424
- with notifications nobody consumed. A viewer that wants progress passes its
425
- own callback.
426
- - `verify:frame` runs as a step of `bun run test`: every tool in the manifest
427
- must be registered inside `runTool` under its own name, so a tool cannot
428
- ship without cancellation, progress and its log line.
429
-
430
- ### 6.1.0
431
-
432
- - Every tool handler runs inside `runTool`, which resolves the SDK request
433
- context once and hands the work a plain scope. Cancellation: the request's
434
- signal reaches every collector fetch, which already raced a signal against
435
- its timeout but had no caller passing one, so a client's
436
- `notifications/cancelled` or a dropped connection now aborts the fetch at
437
- once. Data-layer functions (`fetchTraces`, `fetchLogs`, `listMetrics`, …)
438
- gained a trailing `CollectorRequestOptions` argument; existing callers are
439
- unaffected.
440
- - Progress on every tool: a request with a `progressToken` gets one
441
- `notifications/progress` per completed collector round trip and a final
442
- "Result ready"; `ci_log` with a `run_id` reports its per-leg flatten as a
443
- step of its own. Progress increases per token by construction. A request
444
- without a token gets nothing.
445
- - The `logging` capability is declared and every call sends one
446
- `notifications/message` (`info` on success, `warning` on failure, logger
447
- `qyl.mcp`) to a request that carries a log level in its `_meta` envelope.
448
- Deprecated as of `2026-07-28` (SEP-2577), kept through the deprecation
449
- window beside stderr and OpenTelemetry. Tool surface, manifest snapshot and
450
- contract handshake are unchanged.
451
-
452
- ### 6.0.0
453
-
454
- - Revision `2026-07-28` only, again, on both transports: `createMcpHandler`
455
- and `serveStdio` run with `legacy: "reject"`, so a 2025-era `initialize` is
456
- answered with `-32022` naming the served revision. 5.2.0 served the 2025 era
457
- for one release; that serving mode is withdrawn. Breaking for any host that
458
- opens with `initialize`, Claude Code's stdio client included: such a host
459
- needs a client that opens with `server/discover`. On the SDK's own client that
460
- is `versionNegotiation: { mode: "auto" }` (or a pin on `2026-07-28`); the
461
- default `mode: "legacy"` cannot reach this server.
462
- - Gate for the flip: three independent agents, given only the endpoint and the
463
- stdio command and forbidden to read the source, each connected over both
464
- transports on their own and listed the eleven tools; each also confirmed that
465
- the SDK default is refused. The tool surface, manifest snapshot and contract
466
- handshake are unchanged from 5.2.0.
467
-
468
- ### 5.2.0
469
-
470
- - 2025-era MCP clients are served again. Since 4.0.0 both transports rejected
471
- any client that did not speak revision `2026-07-28` with `-32022`, which
472
- refused every shipping host of the day, including Claude Code's stdio
473
- client on `2025-11-25`. The hosted handler now serves those clients
474
- statelessly (`legacy: "stateless"`, the SDK default) and the stdio server
475
- takes `serveStdio`'s default legacy serving. Modern clients are unchanged;
476
- the manifest, the contract handshake and the tool surface are the same at
477
- either revision.
478
- - The README no longer points at `qyl/ARCHITECTURE-1.0.0.md`, which was
479
- deleted on 2026-09-07; the qyl README states the architecture in place.
480
-
481
- ### 5.1.0
482
-
483
- - Contract `@ancplua/qyl-api-schema` 10.0.0 -> 10.0.1, revision
484
- `sha256:264a9e4f1d70289a` -> `sha256:cd69d9c37a41916c`. The contract's
485
- operations and shapes are unchanged; the revision moved because the
486
- TypeSpec toolchain that emits the canonical OpenAPI projection did. The
487
- startup handshake refuses a collector on the old revision, so this server
488
- pairs with `qyl` 5.1.0 and later; `server/tool-manifest.snapshot.json`
489
- differs only in its `contract_revision`.
490
- - The workspace root package no longer pins its own members, and the matrix
491
- no longer compares itself to a tool inventory that no longer exists.
492
-
493
- ### 5.0.0
494
-
495
- - **Breaking.** Contract major: `@ancplua/qyl-api-schema` 9.0.0 -> 10.0.0,
496
- revision `sha256:d1c859393b628164` -> `sha256:264a9e4f1d70289a`. The
497
- startup handshake refuses a collector that advertises anything else, so
498
- this server and the collector move together.
499
- - The contract's revision scheme moved to `qyl-contract-revision-v3`; the
500
- revision string is read from the package at build time, so nothing in this
501
- server encodes it by hand.
502
- - The contract's `./generated/otel-keys` TypeSpec keys projection was
503
- removed upstream. This server never imported it — the tool surface,
504
- schemas, and protocol are unchanged, and
505
- `server/tool-manifest.snapshot.json` differs only in its
506
- `contract_revision`.
507
-
508
- ### 4.0.1
509
-
510
- - Dependencies only; no tool, schema, or protocol change. The published
511
- package's runtime dependencies move to their latest stable versions, so
512
- the tarball no longer describes a tree that has since moved on.
513
- - OpenTelemetry: `@opentelemetry/api-logs`, `exporter-logs-otlp-proto`,
514
- `exporter-metrics-otlp-proto`, `exporter-trace-otlp-proto` and `sdk-logs`
515
- `^0.221.0` -> `^0.222.0`; `core`, `resources`, `sdk-metrics`,
516
- `sdk-trace-base` and `sdk-trace-node` `^2.10.0` -> `^2.11.0`.
517
- - `jose` `^6.2.3` -> `^6.2.10`, `zod` `^4.5.0` -> `^4.5.4`.
518
- - `@ancplua/qyl-api-schema` stays 9.0.0, revision
519
- `sha256:d1c859393b628164`, and `@opentelemetry/semantic-conventions`
520
- stays `^1.43.0` — the contract and the startup handshake are unchanged,
521
- so this server and the collector do not have to move together.
522
-
523
- ### 4.0.0
524
-
525
- - **Breaking.** The Codex workflow tools are gone: `list_workflow_runs`,
526
- `get_workflow_graph`, `display_workflow_graph`, `inspect_workflow_events`,
527
- `fetch_workflow_graph_updates`, and `control_workflow_run`. The tool surface is
528
- 11 read-only tools; `tools/list` shrank about 31%.
529
- - The `ui://qyl-explorer/observe-graph.html` MCP App resource and its viewer
530
- bundle are gone with them, as is the `qyl:control` OAuth scope — no tool
531
- required it any more, so the hosted server advertises `qyl:read` alone.
532
- - These existed only to observe and control Codex runs, and were removed in one
533
- wave with the qyl observer and the qyl-api-schema contract.
534
- - Contract major: `@ancplua/qyl-api-schema` 9.0.0, revision
535
- `sha256:d1c859393b628164`. The startup handshake refuses a collector that
536
- advertises anything else, so this server and the collector move together.
537
-
538
- ### 3.0.0
539
-
540
- - Metrics reading: `list_metrics`, `get_metric_series`, and `query_metric` over
541
- the collector's metrics API. Each carries the read-only safety annotations.
542
- - Contract major: `@ancplua/qyl-api-schema` 8.0.0, revision
543
- `sha256:64c464569005a485`. The startup handshake refuses a collector that
544
- advertises anything else, so this server and the collector move together.
545
-
546
- ### 2.1.0
547
-
548
- - `tools/list` shrank 44.6%: shared models in the output schemas are emitted as
549
- `$defs`/`$ref` where that is smaller, and the app-only tools no longer publish
550
- an output schema at all.
551
- - Native execution evidence is written only by a local server; see above.
552
-
553
- Full documentation, the workbench, and self-hosting:
554
- [github.com/ANcpLua/qyl.mcp](https://github.com/ANcpLua/qyl.mcp)
200
+ In the repository's [CHANGELOG.md](https://github.com/ANcpLua/qyl.mcp/blob/main/CHANGELOG.md).