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