@aotter/mantle-web 0.1.0-alpha.13 → 0.1.0-alpha.15

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
@@ -26,23 +26,97 @@ headless runtime operations.
26
26
 
27
27
  ## WebMCP (opt in)
28
28
 
29
- Browsers implementing the draft imperative WebMCP API can expose public Views
30
- as read-only tools. Importing the subpath has no registration side effect;
29
+ Browsers implementing the draft imperative WebMCP API can expose public Mantle
30
+ capabilities as tools. Importing the subpath has no registration side effect;
31
31
  registration begins only when `bindWebMcp` is called.
32
32
 
33
+ ### Fresh server-backed site
34
+
35
+ Declare a public View; the Cloudflare adapter publishes its safe tool descriptor
36
+ at `/api/views` and keeps the manifest server-side.
37
+
38
+ ```yaml
39
+ apiVersion: cms.mantle.aotter.net/v1
40
+ kind: View
41
+ metadata:
42
+ name: recent-posts
43
+ spec:
44
+ surface: public
45
+ from: posts
46
+ limit: 20
47
+ ```
48
+
49
+ The default binding discovers and invokes those same-origin View routes:
50
+
51
+ ```ts
52
+ import { bindWebMcp } from "@aotter/mantle-web/webmcp";
53
+
54
+ const binding = await bindWebMcp();
55
+ ```
56
+
57
+ ### Fresh browser-local SPA
58
+
59
+ Project the active plan and dispatch through the active local Runtime. Keeping
60
+ Runtime lookup inside `invoke` lets the SPA switch bundles without stale
61
+ closures.
62
+
33
63
  ```ts
34
64
  import { projectCallableCapabilities } from "@aotter/mantle-runtime";
35
65
  import { bindWebMcp } from "@aotter/mantle-web/webmcp";
36
66
 
37
- const binding = await bindWebMcp(
38
- projectCallableCapabilities(plan, { surface: "public" }),
39
- );
67
+ const capabilities = projectCallableCapabilities(plan, { surface: "public" });
68
+ async function invokeMantle(capability, input, signal) {
69
+ signal.throwIfAborted();
70
+ const runtime = await getRuntime();
71
+ if (capability.kind === "procedure") {
72
+ const result = await runtime.invokeTrigger({
73
+ trigger: capability.trigger,
74
+ input,
75
+ ctx: getContext(),
76
+ });
77
+ if (!result.ok) throw result.diagnostic;
78
+ return result.data;
79
+ }
80
+ const { page, show, ...params } = input;
81
+ const result = await runtime.executeView({
82
+ view: capability.ownerName,
83
+ options: {
84
+ params,
85
+ page: typeof page === "number" ? page : undefined,
86
+ show: typeof show === "number" ? show : undefined,
87
+ },
88
+ ctx: getContext(),
89
+ });
90
+ if (!result.ok) throw result.diagnostic;
91
+ return result.result;
92
+ }
93
+
94
+ const binding = await bindWebMcp({ capabilities, invoke: invokeMantle });
40
95
 
41
96
  // Unregister when the page/app scope ends.
42
97
  binding.dispose();
43
98
  ```
44
99
 
45
- Unsupported browsers return `{ supported: false }`. Only public View
46
- capabilities are registered; staff Views and Procedure mutations are excluded.
47
- Calls use the same-origin `/api/views/<name>` route, forward browser
48
- cancellation, and declare both `readOnlyHint` and `untrustedContentHint`.
100
+ ### Existing WebMCP site
101
+
102
+ Pass the host's current registry and optional hooks. Mantle inspects and skips
103
+ existing names; it does not replace host registrations.
104
+
105
+ ```ts
106
+ const binding = await bindWebMcp({
107
+ capabilities,
108
+ invoke: invokeMantle,
109
+ modelContext: document.modelContext,
110
+ before(call) {
111
+ analytics.track("webmcp:start", call);
112
+ },
113
+ after({ target }, result) {
114
+ if (result.status === "fulfilled") refreshUi(target);
115
+ },
116
+ });
117
+ ```
118
+
119
+ Unsupported browsers return `{ supported: false }`. Only public capabilities
120
+ are registered. Procedure tools must originate from explicit public MCP
121
+ Triggers, and execution must enter Runtime through that Trigger. `after` is
122
+ observational: its failure never replaces the invocation result.
package/dist/webmcp.d.ts CHANGED
@@ -1,12 +1,25 @@
1
1
  import type { RuntimeCallableCapability } from "@aotter/mantle-runtime";
2
+ export type WebMcpTarget = Readonly<{
3
+ readonly kind: "view";
4
+ readonly name: string;
5
+ }> | Readonly<{
6
+ readonly kind: "procedure";
7
+ readonly name: string;
8
+ }>;
9
+ export interface WebMcpCall {
10
+ readonly name: string;
11
+ readonly target: WebMcpTarget;
12
+ readonly input: Readonly<Record<string, unknown>>;
13
+ readonly signal: AbortSignal;
14
+ }
2
15
  export interface WebMcpTool {
3
16
  readonly name: string;
4
17
  readonly title?: string;
5
18
  readonly description: string;
6
19
  readonly inputSchema: Record<string, unknown>;
7
20
  readonly annotations: {
8
- readonly readOnlyHint: true;
9
- readonly untrustedContentHint: true;
21
+ readonly readOnlyHint: boolean;
22
+ readonly untrustedContentHint?: boolean;
10
23
  };
11
24
  execute(input: Record<string, unknown>, context: {
12
25
  readonly signal?: AbortSignal;
@@ -16,17 +29,46 @@ export interface WebMcpModelContext {
16
29
  registerTool(tool: WebMcpTool, options: {
17
30
  readonly signal: AbortSignal;
18
31
  }): void | Promise<void>;
32
+ getTools?(): readonly {
33
+ readonly name: string;
34
+ }[] | Promise<readonly {
35
+ readonly name: string;
36
+ }[]>;
19
37
  }
20
38
  export interface WebMcpBinding {
21
39
  readonly supported: boolean;
22
40
  readonly registered: readonly string[];
41
+ readonly skipped: readonly string[];
23
42
  dispose(): void;
24
43
  }
25
- export interface BindWebMcpOptions {
44
+ export interface PublicWebMcpView {
45
+ readonly name: string;
46
+ readonly target: Readonly<{
47
+ readonly kind: "view";
48
+ readonly name: string;
49
+ }>;
50
+ readonly title?: string;
51
+ readonly description: string;
52
+ readonly inputSchema: Record<string, unknown>;
53
+ }
54
+ export type WebMcpInvoker = (capability: RuntimeCallableCapability, input: Readonly<Record<string, unknown>>, signal: AbortSignal) => Promise<unknown>;
55
+ interface CommonBindWebMcpOptions {
26
56
  readonly modelContext?: WebMcpModelContext;
57
+ readonly before?: (call: WebMcpCall) => void | Promise<void>;
58
+ readonly after?: (call: WebMcpCall, result: PromiseSettledResult<unknown>) => void | Promise<void>;
59
+ }
60
+ export type BindWebMcpOptions = (CommonBindWebMcpOptions & {
61
+ readonly capabilities: readonly RuntimeCallableCapability[];
62
+ readonly invoke: WebMcpInvoker;
63
+ readonly fetch?: never;
64
+ readonly endpointPrefix?: never;
65
+ }) | (CommonBindWebMcpOptions & {
66
+ readonly capabilities?: never;
67
+ readonly invoke?: never;
27
68
  readonly fetch?: typeof fetch;
28
69
  readonly endpointPrefix?: string;
29
- }
30
- /** Opt-in browser binding for public, read-only View capabilities. */
31
- export declare function bindWebMcp(capabilities: readonly RuntimeCallableCapability[], options?: BindWebMcpOptions): Promise<WebMcpBinding>;
70
+ });
71
+ /** Opt-in browser binding over public callable capabilities. */
72
+ export declare function bindWebMcp(options?: BindWebMcpOptions): Promise<WebMcpBinding>;
73
+ export {};
32
74
  //# sourceMappingURL=webmcp.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"webmcp.d.ts","sourceRoot":"","sources":["../src/webmcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EAE1B,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE;QACpB,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;QAC5B,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC;KACrC,CAAC;IACF,OAAO,CACL,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACzC,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,CACV,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;KAAE,GACxC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,sEAAsE;AACtE,wBAAsB,UAAU,CAC9B,YAAY,EAAE,SAAS,yBAAyB,EAAE,EAClD,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,aAAa,CAAC,CAkCxB"}
1
+ {"version":3,"file":"webmcp.d.ts","sourceRoot":"","sources":["../src/webmcp.ts"],"names":[],"mappings":"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"}
package/dist/webmcp.js CHANGED
@@ -1,31 +1,175 @@
1
- /** Opt-in browser binding for public, read-only View capabilities. */
2
- export async function bindWebMcp(capabilities, options = {}) {
1
+ /** Opt-in browser binding over public callable capabilities. */
2
+ export async function bindWebMcp(options = {}) {
3
3
  const modelContext = options.modelContext ?? browserModelContext();
4
4
  if (!modelContext)
5
5
  return unsupportedBinding();
6
6
  const controller = new AbortController();
7
- const views = capabilities.filter((capability) => capability.kind === "view" && capability.surface === "public");
8
7
  try {
9
- await Promise.all(views.map((capability) => modelContext.registerTool({
10
- name: capability.name,
11
- ...(capability.title ? { title: capability.title } : {}),
12
- description: capability.description,
13
- inputSchema: capability.inputSchema,
14
- annotations: { readOnlyHint: true, untrustedContentHint: true },
15
- execute: (input, context) => queryView(capability, input, context.signal
16
- ? AbortSignal.any([context.signal, controller.signal])
17
- : controller.signal, options),
18
- }, { signal: controller.signal })));
8
+ const capabilities = await resolveCapabilities(options, controller.signal);
9
+ assertUniqueNames(capabilities);
10
+ const existing = modelContext.getTools
11
+ ? new Set((await modelContext.getTools()).map((tool) => tool.name))
12
+ : new Set();
13
+ const skipped = capabilities
14
+ .filter((capability) => existing.has(capability.name))
15
+ .map((capability) => capability.name);
16
+ const pending = capabilities.filter((capability) => !existing.has(capability.name));
17
+ await Promise.all(pending.map((capability) => modelContext.registerTool(toWebMcpTool(capability, options), { signal: controller.signal })));
18
+ return binding(pending.map((capability) => capability.name), skipped, controller);
19
19
  }
20
20
  catch (error) {
21
21
  controller.abort();
22
22
  throw error;
23
23
  }
24
- return Object.freeze({
25
- supported: true,
26
- registered: Object.freeze(views.map((view) => view.name)),
27
- dispose: () => controller.abort(),
24
+ }
25
+ function resolveCapabilities(options, signal) {
26
+ const capabilities = options.capabilities;
27
+ const invoke = options.invoke;
28
+ if (capabilities === undefined && invoke === undefined) {
29
+ return serverCapabilities(options, signal);
30
+ }
31
+ if (!Array.isArray(capabilities) || typeof invoke !== "function") {
32
+ throw new TypeError("WebMCP capabilities and invoke must be provided together.");
33
+ }
34
+ return localCapabilities(capabilities, invoke);
35
+ }
36
+ function localCapabilities(capabilities, invoke) {
37
+ return capabilities
38
+ .filter((capability) => capability.surface === "public")
39
+ .map((capability) => ({
40
+ name: capability.name,
41
+ ...(capability.title ? { title: capability.title } : {}),
42
+ description: capability.description,
43
+ inputSchema: capability.inputSchema,
44
+ annotations: {
45
+ readOnlyHint: capability.kind === "view" || capability.inputSchema.readOnly === true,
46
+ ...(capability.kind === "view" ? { untrustedContentHint: true } : {}),
47
+ },
48
+ target: Object.freeze({ kind: capability.kind, name: capability.ownerName }),
49
+ invoke: (input, signal) => invoke(capability, input, signal),
50
+ }));
51
+ }
52
+ async function serverCapabilities(options, signal) {
53
+ const prefix = endpointPrefix(options.endpointPrefix);
54
+ const fetcher = options.fetch ?? fetch;
55
+ const response = await fetcher(prefix, {
56
+ method: "GET",
57
+ credentials: "same-origin",
58
+ headers: { accept: "application/json" },
59
+ signal,
60
+ });
61
+ if (!response.ok)
62
+ throw new Error(`Mantle WebMCP catalog failed (${response.status}).`);
63
+ return readCatalog(await response.json()).map((view) => ({
64
+ ...view,
65
+ annotations: { readOnlyHint: true, untrustedContentHint: true },
66
+ invoke: (input, invocationSignal) => queryView(view, input, invocationSignal, prefix, fetcher),
67
+ }));
68
+ }
69
+ function toWebMcpTool(capability, options) {
70
+ return {
71
+ name: capability.name,
72
+ ...(capability.title ? { title: capability.title } : {}),
73
+ description: capability.description,
74
+ inputSchema: capability.inputSchema,
75
+ annotations: capability.annotations,
76
+ execute: async (input, context) => {
77
+ if (!input || typeof input !== "object" || Array.isArray(input)) {
78
+ throw new TypeError("WebMCP tool input must be an object.");
79
+ }
80
+ const signal = context.signal ?? new AbortController().signal;
81
+ const call = Object.freeze({
82
+ name: capability.name,
83
+ target: capability.target,
84
+ input,
85
+ signal,
86
+ });
87
+ let result;
88
+ try {
89
+ signal.throwIfAborted();
90
+ await options.before?.(call);
91
+ result = {
92
+ status: "fulfilled",
93
+ value: await capability.invoke(input, signal),
94
+ };
95
+ }
96
+ catch (reason) {
97
+ result = { status: "rejected", reason };
98
+ }
99
+ try {
100
+ await options.after?.(call, result);
101
+ }
102
+ catch {
103
+ // Observational hooks never change the domain result.
104
+ }
105
+ if (result.status === "fulfilled")
106
+ return result.value;
107
+ throw result.reason;
108
+ },
109
+ };
110
+ }
111
+ function endpointPrefix(prefix = "/api/views") {
112
+ const normalized = prefix.replace(/\/$/u, "");
113
+ if (!/^\/(?!\/)[^\\?#]*$/u.test(normalized)) {
114
+ throw new TypeError("WebMCP endpointPrefix must be a same-origin absolute path.");
115
+ }
116
+ return normalized;
117
+ }
118
+ async function queryView(view, input, signal, prefix, fetcher) {
119
+ const query = new URLSearchParams();
120
+ for (const [key, value] of Object.entries(input)) {
121
+ if (["string", "number", "boolean"].includes(typeof value)) {
122
+ query.set(key, String(value));
123
+ }
124
+ }
125
+ const search = query.size ? `?${query}` : "";
126
+ const response = await fetcher(`${prefix}/${encodeURIComponent(view.target.name)}${search}`, {
127
+ method: "GET",
128
+ credentials: "same-origin",
129
+ headers: { accept: "application/json" },
130
+ signal,
28
131
  });
132
+ if (!response.ok) {
133
+ throw new Error(`Mantle View '${view.target.name}' failed (${response.status}).`);
134
+ }
135
+ const body = await response.json();
136
+ return isRecord(body) && body.ok === true ? body.data : body;
137
+ }
138
+ function readCatalog(body) {
139
+ if (!isRecord(body) || body.ok !== true || !Array.isArray(body.data)) {
140
+ throw new TypeError("Mantle WebMCP catalog response is invalid.");
141
+ }
142
+ return body.data.map((value) => {
143
+ if (!isRecord(value)
144
+ || typeof value.name !== "string"
145
+ || typeof value.description !== "string"
146
+ || !isRecord(value.inputSchema)
147
+ || !isRecord(value.target)
148
+ || value.target.kind !== "view"
149
+ || typeof value.target.name !== "string"
150
+ || (value.title !== undefined && typeof value.title !== "string")) {
151
+ throw new TypeError("Mantle WebMCP catalog contains an invalid View.");
152
+ }
153
+ return Object.freeze({
154
+ name: value.name,
155
+ target: Object.freeze({ kind: "view", name: value.target.name }),
156
+ ...(value.title ? { title: value.title } : {}),
157
+ description: value.description,
158
+ inputSchema: value.inputSchema,
159
+ });
160
+ });
161
+ }
162
+ function isRecord(value) {
163
+ return !!value && typeof value === "object" && !Array.isArray(value);
164
+ }
165
+ function assertUniqueNames(capabilities) {
166
+ const names = new Set();
167
+ for (const capability of capabilities) {
168
+ if (names.has(capability.name)) {
169
+ throw new TypeError(`Duplicate WebMCP capability name '${capability.name}'.`);
170
+ }
171
+ names.add(capability.name);
172
+ }
29
173
  }
30
174
  function browserModelContext() {
31
175
  const modelContext = globalThis
@@ -34,36 +178,20 @@ function browserModelContext() {
34
178
  ? modelContext
35
179
  : undefined;
36
180
  }
181
+ function binding(registered, skipped, controller) {
182
+ return Object.freeze({
183
+ supported: true,
184
+ registered: Object.freeze(registered),
185
+ skipped: Object.freeze(skipped),
186
+ dispose: () => controller.abort(),
187
+ });
188
+ }
37
189
  function unsupportedBinding() {
38
190
  return Object.freeze({
39
191
  supported: false,
40
192
  registered: Object.freeze([]),
193
+ skipped: Object.freeze([]),
41
194
  dispose: () => { },
42
195
  });
43
196
  }
44
- async function queryView(capability, input, signal, options) {
45
- if (!input || typeof input !== "object" || Array.isArray(input)) {
46
- throw new TypeError("WebMCP View input must be an object.");
47
- }
48
- const query = Object.entries(input)
49
- .filter((entry) => ["string", "number", "boolean"].includes(typeof entry[1]))
50
- .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)
51
- .join("&");
52
- const prefix = (options.endpointPrefix ?? "/api/views").replace(/\/$/u, "");
53
- if (!/^\/(?!\/)[^\\?#]*$/u.test(prefix)) {
54
- throw new TypeError("WebMCP endpointPrefix must be a same-origin absolute path.");
55
- }
56
- const response = await (options.fetch ?? fetch)(`${prefix}/${encodeURIComponent(capability.ownerName)}${query ? `?${query}` : ""}`, {
57
- method: "GET",
58
- credentials: "same-origin",
59
- headers: { accept: "application/json" },
60
- signal,
61
- });
62
- if (!response.ok)
63
- throw new Error(`Mantle View '${capability.ownerName}' failed (${response.status}).`);
64
- const body = await response.json();
65
- return body && typeof body === "object" && body.ok === true
66
- ? body.data
67
- : body;
68
- }
69
197
  //# sourceMappingURL=webmcp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"webmcp.js","sourceRoot":"","sources":["../src/webmcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webmcp.js","sourceRoot":"","sources":["../src/webmcp.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aotter/mantle-web",
3
- "version": "0.1.0-alpha.13",
3
+ "version": "0.1.0-alpha.15",
4
4
  "description": "Optional public document composition for Mantle: HTML, Markdown, llms.txt, sitemap, SEO, and preview.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://mantle.tools/",
@@ -33,13 +33,13 @@
33
33
  "README.md"
34
34
  ],
35
35
  "dependencies": {
36
- "@aotter/mantle-spec": "0.1.0-alpha.13",
37
- "@aotter/mantle-runtime": "0.1.0-alpha.13"
36
+ "@aotter/mantle-runtime": "0.1.0-alpha.15",
37
+ "@aotter/mantle-spec": "0.1.0-alpha.15"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^26",
41
41
  "typescript": "^6.0.3",
42
- "vitest": "^4.1.10"
42
+ "vitest": "^4.1.11"
43
43
  },
44
44
  "scripts": {
45
45
  "prebuild": "rm -rf dist .tsbuildinfo",