@cyanheads/mcp-ts-core 0.8.1 → 0.8.3

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.
Files changed (50) hide show
  1. package/CLAUDE.md +8 -2
  2. package/README.md +1 -1
  3. package/changelog/0.8.x/0.8.2.md +18 -0
  4. package/changelog/0.8.x/0.8.3.md +43 -0
  5. package/dist/logs/combined.log +12 -4
  6. package/dist/logs/error.log +12 -4
  7. package/dist/mcp-server/resources/resource-registration.d.ts.map +1 -1
  8. package/dist/mcp-server/resources/resource-registration.js +2 -3
  9. package/dist/mcp-server/resources/resource-registration.js.map +1 -1
  10. package/dist/mcp-server/resources/utils/resourceDefinition.d.ts +3 -3
  11. package/dist/mcp-server/tools/tool-registration.d.ts.map +1 -1
  12. package/dist/mcp-server/tools/tool-registration.js +8 -12
  13. package/dist/mcp-server/tools/tool-registration.js.map +1 -1
  14. package/dist/mcp-server/tools/utils/toolDefinition.d.ts +2 -3
  15. package/dist/mcp-server/tools/utils/toolDefinition.d.ts.map +1 -1
  16. package/dist/mcp-server/tools/utils/toolDefinition.js.map +1 -1
  17. package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts +28 -0
  18. package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts.map +1 -1
  19. package/dist/mcp-server/tools/utils/toolHandlerFactory.js +64 -23
  20. package/dist/mcp-server/tools/utils/toolHandlerFactory.js.map +1 -1
  21. package/dist/mcp-server/transports/http/landing-page/assets/copy-script.d.ts +13 -4
  22. package/dist/mcp-server/transports/http/landing-page/assets/copy-script.d.ts.map +1 -1
  23. package/dist/mcp-server/transports/http/landing-page/assets/copy-script.js +99 -25
  24. package/dist/mcp-server/transports/http/landing-page/assets/copy-script.js.map +1 -1
  25. package/dist/mcp-server/transports/http/landing-page/assets/styles.d.ts.map +1 -1
  26. package/dist/mcp-server/transports/http/landing-page/assets/styles.js +318 -8
  27. package/dist/mcp-server/transports/http/landing-page/assets/styles.js.map +1 -1
  28. package/dist/mcp-server/transports/http/landing-page/sections/status-strip.d.ts.map +1 -1
  29. package/dist/mcp-server/transports/http/landing-page/sections/status-strip.js +20 -1
  30. package/dist/mcp-server/transports/http/landing-page/sections/status-strip.js.map +1 -1
  31. package/dist/mcp-server/transports/http/landing-page/sections/tools.d.ts +6 -5
  32. package/dist/mcp-server/transports/http/landing-page/sections/tools.d.ts.map +1 -1
  33. package/dist/mcp-server/transports/http/landing-page/sections/tools.js +114 -69
  34. package/dist/mcp-server/transports/http/landing-page/sections/tools.js.map +1 -1
  35. package/dist/types-global/errors.d.ts +3 -22
  36. package/dist/types-global/errors.d.ts.map +1 -1
  37. package/dist/types-global/errors.js +0 -19
  38. package/dist/types-global/errors.js.map +1 -1
  39. package/package.json +1 -1
  40. package/skills/add-app-tool/SKILL.md +24 -8
  41. package/skills/add-resource/SKILL.md +1 -1
  42. package/skills/add-tool/SKILL.md +87 -20
  43. package/skills/api-errors/SKILL.md +21 -7
  44. package/skills/api-linter/SKILL.md +1 -1
  45. package/skills/design-mcp-server/SKILL.md +1 -1
  46. package/skills/field-test/SKILL.md +15 -6
  47. package/skills/maintenance/SKILL.md +19 -7
  48. package/templates/AGENTS.md +3 -2
  49. package/templates/CLAUDE.md +3 -2
  50. package/templates/src/mcp-server/tools/definitions/echo.tool.ts +18 -1
@@ -6,6 +6,7 @@
6
6
  import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
7
7
  import type { CallToolResult, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
8
8
  import type { StorageService } from '../../../storage/core/StorageService.js';
9
+ import { type JsonRpcErrorCode } from '../../../types-global/errors.js';
9
10
  import type { Logger } from '../../../utils/internal/logger.js';
10
11
  import type { AnyToolDefinition } from './toolDefinition.js';
11
12
  type SdkExtra = RequestHandlerExtra<ServerRequest, ServerNotification>;
@@ -25,6 +26,33 @@ export interface HandlerNotifiers {
25
26
  notifyResourceListChanged?: () => void;
26
27
  notifyResourceUpdated?: (uri: string) => void;
27
28
  }
29
+ /**
30
+ * Shapes a `CallToolResult` for a tool error response with parity across both
31
+ * surfaces clients forward to the agent:
32
+ * - `content[]` — read by clients like Claude Desktop (markdown)
33
+ * - `structuredContent.error` — read by clients like Claude Code (JSON)
34
+ *
35
+ * Both surfaces carry the same payload. When `data.recovery.hint` is present,
36
+ * it is also mirrored into the `content[]` text so format()-only clients see
37
+ * the recovery guidance.
38
+ *
39
+ * Note: `_meta.error` is intentionally NOT emitted — the error code, message,
40
+ * and data live on `structuredContent.error` instead, mirroring the success
41
+ * path's `structuredContent` surface.
42
+ */
43
+ export declare function buildToolErrorResult(code: JsonRpcErrorCode, message: string, data: Record<string, unknown> | undefined): CallToolResult;
44
+ /**
45
+ * Builds an error `CallToolResult` from a raw thrown value. Classifies via
46
+ * {@link ErrorHandler.classifyOnly} when the value isn't already an
47
+ * `McpError`. Only propagates data from `McpError` (its declared `data`) or
48
+ * `ZodError` (its `issues`) — other thrown values get a `structuredContent.error`
49
+ * with `code` and `message` only, so internal classification context never
50
+ * leaks to clients.
51
+ *
52
+ * Use after invoking {@link ErrorHandler.handleError} for OTel/logging side
53
+ * effects — this helper does not log.
54
+ */
55
+ export declare function classifyAndBuildToolErrorResult(error: unknown): CallToolResult;
28
56
  /**
29
57
  * Creates an MCP tool handler from a tool definition.
30
58
  * The returned function is compatible with the MCP SDK's ToolCallback type.
@@ -1 +1 @@
1
- {"version":3,"file":"toolHandlerFactory.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/toolHandlerFactory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,KAAK,EACV,cAAc,EAEd,kBAAkB,EAClB,aAAa,EACd,MAAM,oCAAoC,CAAC;AAO5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAGvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAGzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAM7D,KAAK,QAAQ,GAAG,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;AAOvE,qEAAqE;AACrE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,CAAC;CACzB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yBAAyB,CAAC,EAAE,MAAM,IAAI,CAAC;IACvC,qBAAqB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AAgCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,sBAAsB,EAChC,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,cAAc,CAAC,CAwG9E"}
1
+ {"version":3,"file":"toolHandlerFactory.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/toolHandlerFactory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,KAAK,EACV,cAAc,EAEd,kBAAkB,EAClB,aAAa,EACd,MAAM,oCAAoC,CAAC;AAO5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,KAAK,gBAAgB,EAAY,MAAM,0BAA0B,CAAC;AAE3E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAGzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAM7D,KAAK,QAAQ,GAAG,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;AAOvE,qEAAqE;AACrE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,CAAC;CACzB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yBAAyB,CAAC,EAAE,MAAM,IAAI,CAAC;IACvC,qBAAqB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AAyBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACxC,cAAc,CAchB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAO9E;AAwBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,sBAAsB,EAChC,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,cAAc,CAAC,CAiF9E"}
@@ -6,7 +6,7 @@
6
6
  import { ZodError } from 'zod';
7
7
  import { attachTypedFail, createContext } from '../../../core/context.js';
8
8
  import { withRequiredScopes } from '../../../mcp-server/transports/auth/lib/authUtils.js';
9
- import { JsonRpcErrorCode, McpError } from '../../../types-global/errors.js';
9
+ import { McpError } from '../../../types-global/errors.js';
10
10
  import { ErrorHandler } from '../../../utils/internal/error-handler/errorHandler.js';
11
11
  import { measureToolExecution } from '../../../utils/internal/performance.js';
12
12
  import { requestContextService } from '../../../utils/internal/requestContext.js';
@@ -17,6 +17,67 @@ const defaultResponseFormatter = (result) => [
17
17
  { type: 'text', text: JSON.stringify(result, null, 2) },
18
18
  ];
19
19
  // ---------------------------------------------------------------------------
20
+ // Error response shaping
21
+ // ---------------------------------------------------------------------------
22
+ /**
23
+ * Pulls `data.recovery.hint` from an error data payload when present and
24
+ * non-empty. Returns `undefined` otherwise. Used to mirror the hint into
25
+ * `content[]` text so format()-only clients see the same recovery guidance
26
+ * structuredContent-only clients receive via `error.data.recovery.hint`.
27
+ */
28
+ function extractRecoveryHint(data) {
29
+ const hint = data?.recovery?.hint;
30
+ return typeof hint === 'string' && hint.length > 0 ? hint : undefined;
31
+ }
32
+ /**
33
+ * Shapes a `CallToolResult` for a tool error response with parity across both
34
+ * surfaces clients forward to the agent:
35
+ * - `content[]` — read by clients like Claude Desktop (markdown)
36
+ * - `structuredContent.error` — read by clients like Claude Code (JSON)
37
+ *
38
+ * Both surfaces carry the same payload. When `data.recovery.hint` is present,
39
+ * it is also mirrored into the `content[]` text so format()-only clients see
40
+ * the recovery guidance.
41
+ *
42
+ * Note: `_meta.error` is intentionally NOT emitted — the error code, message,
43
+ * and data live on `structuredContent.error` instead, mirroring the success
44
+ * path's `structuredContent` surface.
45
+ */
46
+ export function buildToolErrorResult(code, message, data) {
47
+ const hint = extractRecoveryHint(data);
48
+ const text = hint ? `Error: ${message}\n\nRecovery: ${hint}` : `Error: ${message}`;
49
+ return {
50
+ isError: true,
51
+ content: [{ type: 'text', text }],
52
+ structuredContent: {
53
+ error: {
54
+ code,
55
+ message,
56
+ ...(data !== undefined && { data }),
57
+ },
58
+ },
59
+ };
60
+ }
61
+ /**
62
+ * Builds an error `CallToolResult` from a raw thrown value. Classifies via
63
+ * {@link ErrorHandler.classifyOnly} when the value isn't already an
64
+ * `McpError`. Only propagates data from `McpError` (its declared `data`) or
65
+ * `ZodError` (its `issues`) — other thrown values get a `structuredContent.error`
66
+ * with `code` and `message` only, so internal classification context never
67
+ * leaks to clients.
68
+ *
69
+ * Use after invoking {@link ErrorHandler.handleError} for OTel/logging side
70
+ * effects — this helper does not log.
71
+ */
72
+ export function classifyAndBuildToolErrorResult(error) {
73
+ if (error instanceof McpError) {
74
+ return buildToolErrorResult(error.code, error.message, error.data);
75
+ }
76
+ const { code, message } = ErrorHandler.classifyOnly(error);
77
+ const data = error instanceof ZodError ? { issues: error.issues } : undefined;
78
+ return buildToolErrorResult(code, message, data);
79
+ }
80
+ // ---------------------------------------------------------------------------
20
81
  // Capability detection helpers
21
82
  // ---------------------------------------------------------------------------
22
83
  function wrapElicit(sdkContext) {
@@ -104,31 +165,11 @@ export function createToolHandler(def, services, notifiers) {
104
165
  };
105
166
  }
106
167
  catch (error) {
107
- const handled = ErrorHandler.handleError(error, {
168
+ ErrorHandler.handleError(error, {
108
169
  operation: `tool:${def.name}`,
109
170
  context: appContext,
110
171
  });
111
- const mcpError = handled instanceof McpError
112
- ? handled
113
- : new McpError(JsonRpcErrorCode.InternalError, handled.message, {
114
- originalError: handled.name,
115
- });
116
- // Surface error classification via _meta so programmatic clients can distinguish error types (auth, validation, not-found, etc.) without parsing the text message. Only propagate data from explicitly thrown McpError instances and ZodError (structured validation issues) — ErrorHandler enrichment contains internal context (stack traces, operation details) that shouldn't be client-visible.
117
- const originalData = error instanceof McpError
118
- ? error.data
119
- : error instanceof ZodError
120
- ? { issues: error.issues }
121
- : undefined;
122
- return {
123
- isError: true,
124
- content: [{ type: 'text', text: `Error: ${mcpError.message}` }],
125
- _meta: {
126
- error: {
127
- code: mcpError.code,
128
- ...(originalData !== undefined && { data: originalData }),
129
- },
130
- },
131
- };
172
+ return classifyAndBuildToolErrorResult(error);
132
173
  }
133
174
  };
134
175
  }
@@ -1 +1 @@
1
- {"version":3,"file":"toolHandlerFactory.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/toolHandlerFactory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toolHandlerFactory.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/toolHandlerFactory.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,17 @@
1
1
  /**
2
- * @fileoverview Inlined copy-to-clipboard script. Single delegated click
3
- * handler triggered by any element carrying `[data-copy]`; the copy target is
4
- * either a CSS selector (`[data-copy-target]`) or the literal `data-copy`
5
- * value. Renders under 1 KB so it ships inline with the page.
2
+ * @fileoverview Inlined client-side scripts for the landing page. Two
3
+ * delegated handlers, both keyed by data attributes:
4
+ *
5
+ * - Copy-to-clipboard: any element carrying `[data-copy]` triggers a copy
6
+ * of the target's `textContent` (CSS selector via `[data-copy-target]`)
7
+ * or the literal `data-copy` value.
8
+ * - Tool filtering: chip clicks toggle a mutability filter, the search
9
+ * input filters by `data-name` + indexed `data-search` substring, and
10
+ * cards/groups update via `hidden`. No framework, no transitions,
11
+ * fully accessible (chips use `aria-pressed`).
12
+ *
13
+ * The whole bundle stays well under 2 KB so it ships inline alongside the
14
+ * page HTML.
6
15
  *
7
16
  * @module src/mcp-server/transports/http/landing-page/assets/copy-script
8
17
  */
@@ -1 +1 @@
1
- {"version":3,"file":"copy-script.d.ts","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/assets/copy-script.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,QAAQ,EAAa,MAAM,4BAA4B,CAAC;AAEtE,wBAAgB,gBAAgB,IAAI,QAAQ,CAyB3C"}
1
+ {"version":3,"file":"copy-script.d.ts","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/assets/copy-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,KAAK,QAAQ,EAAa,MAAM,4BAA4B,CAAC;AAEtE,wBAAgB,gBAAgB,IAAI,QAAQ,CA0F3C"}
@@ -1,36 +1,110 @@
1
1
  /**
2
- * @fileoverview Inlined copy-to-clipboard script. Single delegated click
3
- * handler triggered by any element carrying `[data-copy]`; the copy target is
4
- * either a CSS selector (`[data-copy-target]`) or the literal `data-copy`
5
- * value. Renders under 1 KB so it ships inline with the page.
2
+ * @fileoverview Inlined client-side scripts for the landing page. Two
3
+ * delegated handlers, both keyed by data attributes:
4
+ *
5
+ * - Copy-to-clipboard: any element carrying `[data-copy]` triggers a copy
6
+ * of the target's `textContent` (CSS selector via `[data-copy-target]`)
7
+ * or the literal `data-copy` value.
8
+ * - Tool filtering: chip clicks toggle a mutability filter, the search
9
+ * input filters by `data-name` + indexed `data-search` substring, and
10
+ * cards/groups update via `hidden`. No framework, no transitions,
11
+ * fully accessible (chips use `aria-pressed`).
12
+ *
13
+ * The whole bundle stays well under 2 KB so it ships inline alongside the
14
+ * page HTML.
6
15
  *
7
16
  * @module src/mcp-server/transports/http/landing-page/assets/copy-script
8
17
  */
9
18
  import { unsafeRaw } from '../../../../../utils/formatting/html.js';
10
19
  export function renderCopyScript() {
11
20
  const js = `
12
- document.addEventListener('click', function(e) {
13
- var btn = e.target.closest('[data-copy]');
14
- if (!btn) return;
15
- var selector = btn.getAttribute('data-copy-target');
16
- var text = '';
17
- if (selector) {
18
- var node = document.querySelector(selector);
19
- if (node) text = node.textContent || '';
20
- } else {
21
- text = btn.getAttribute('data-copy') || '';
22
- }
23
- if (!text || !navigator.clipboard) return;
24
- navigator.clipboard.writeText(text).then(function() {
25
- var prev = btn.textContent;
26
- btn.setAttribute('data-copied', 'true');
27
- btn.textContent = 'Copied';
28
- setTimeout(function() {
29
- btn.removeAttribute('data-copied');
30
- btn.textContent = prev;
31
- }, 1500);
21
+ (function() {
22
+ // ---------- Copy to clipboard ----------
23
+ document.addEventListener('click', function(e) {
24
+ var btn = e.target.closest('[data-copy]');
25
+ if (!btn) return;
26
+ var selector = btn.getAttribute('data-copy-target');
27
+ var text = '';
28
+ if (selector) {
29
+ var node = document.querySelector(selector);
30
+ if (node) text = node.textContent || '';
31
+ } else {
32
+ text = btn.getAttribute('data-copy') || '';
33
+ }
34
+ if (!text || !navigator.clipboard) return;
35
+ navigator.clipboard.writeText(text).then(function() {
36
+ var prev = btn.textContent;
37
+ btn.setAttribute('data-copied', 'true');
38
+ btn.textContent = 'Copied';
39
+ setTimeout(function() {
40
+ btn.removeAttribute('data-copied');
41
+ btn.textContent = prev;
42
+ }, 1500);
43
+ });
32
44
  });
33
- });`;
45
+
46
+ // ---------- Tool filter + search ----------
47
+ var section = document.querySelector('[data-tools-section]');
48
+ if (!section) return;
49
+ var cards = Array.prototype.slice.call(section.querySelectorAll('[data-tool-card]'));
50
+ if (cards.length === 0) return;
51
+ var chips = Array.prototype.slice.call(section.querySelectorAll('[data-filter-mutability]'));
52
+ var searchInput = section.querySelector('[data-tool-search]');
53
+ var groups = Array.prototype.slice.call(section.querySelectorAll('[data-group]'));
54
+ var grids = Array.prototype.slice.call(section.querySelectorAll('[data-grid]'));
55
+ var emptyState = section.querySelector('.tools-empty');
56
+
57
+ var activeMutability = 'all';
58
+ var query = '';
59
+
60
+ function apply() {
61
+ var visibleCount = 0;
62
+ var perGroup = Object.create(null);
63
+ for (var i = 0; i < cards.length; i++) {
64
+ var card = cards[i];
65
+ var m = card.getAttribute('data-mutability') || '';
66
+ var search = card.getAttribute('data-search') || '';
67
+ var matchesMutability = activeMutability === 'all' || m === activeMutability;
68
+ var matchesSearch = query === '' || search.indexOf(query) !== -1;
69
+ var visible = matchesMutability && matchesSearch;
70
+ card.hidden = !visible;
71
+ if (visible) {
72
+ visibleCount++;
73
+ perGroup[m] = (perGroup[m] || 0) + 1;
74
+ }
75
+ }
76
+ // Hide group headings + grids whose buckets are now empty.
77
+ for (var g = 0; g < groups.length; g++) {
78
+ var key = groups[g].getAttribute('data-group');
79
+ groups[g].hidden = !perGroup[key];
80
+ }
81
+ for (var k = 0; k < grids.length; k++) {
82
+ var gk = grids[k].getAttribute('data-grid');
83
+ grids[k].hidden = !perGroup[gk];
84
+ }
85
+ if (emptyState) emptyState.hidden = visibleCount > 0;
86
+ }
87
+
88
+ for (var c = 0; c < chips.length; c++) {
89
+ chips[c].addEventListener('click', function(ev) {
90
+ var target = ev.currentTarget;
91
+ var value = target.getAttribute('data-filter-mutability') || 'all';
92
+ activeMutability = value;
93
+ for (var j = 0; j < chips.length; j++) {
94
+ var pressed = chips[j] === target;
95
+ chips[j].setAttribute('aria-pressed', pressed ? 'true' : 'false');
96
+ }
97
+ apply();
98
+ });
99
+ }
100
+
101
+ if (searchInput) {
102
+ searchInput.addEventListener('input', function(ev) {
103
+ query = (ev.currentTarget.value || '').trim().toLowerCase();
104
+ apply();
105
+ });
106
+ }
107
+ })();`;
34
108
  return unsafeRaw(`<script>${js}</script>`);
35
109
  }
36
110
  //# sourceMappingURL=copy-script.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"copy-script.js","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/assets/copy-script.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAiB,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,UAAU,gBAAgB;IAC9B,MAAM,EAAE,GAAG;;;;;;;;;;;;;;;;;;;;;;IAsBT,CAAC;IACH,OAAO,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"copy-script.js","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/assets/copy-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAiB,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,UAAU,gBAAgB;IAC9B,MAAM,EAAE,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAuFP,CAAC;IACL,OAAO,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAC7C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/assets/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,KAAK,QAAQ,EAAa,MAAM,4BAA4B,CAAC;AAKtE;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAi4BrD"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/assets/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,KAAK,QAAQ,EAAa,MAAM,4BAA4B,CAAC;AAKtE;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAurCrD"}