@mcp-b/global 2.0.2 → 2.0.3-canary.1

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
@@ -127,6 +127,316 @@ window.navigator.modelContext.provideContext({
127
127
  });
128
128
  ```
129
129
 
130
+ ## 📜 Traditional Web Standard Usage
131
+
132
+ The Web Model Context API follows the same patterns as other browser APIs. Here's how to use it as a traditional web standard:
133
+
134
+ ### Basic Pattern (Vanilla JavaScript)
135
+
136
+ ```html
137
+ <!DOCTYPE html>
138
+ <html>
139
+ <head>
140
+ <title>Web Model Context API Example</title>
141
+ <script src="https://unpkg.com/@mcp-b/global@latest/dist/index.iife.js"></script>
142
+ </head>
143
+ <body>
144
+ <h1>Counter App</h1>
145
+ <p>Count: <span id="count">0</span></p>
146
+ <button id="increment">+</button>
147
+ <button id="decrement">-</button>
148
+
149
+ <script>
150
+ // State
151
+ let count = 0;
152
+
153
+ // DOM elements
154
+ const countEl = document.getElementById('count');
155
+ const incrementBtn = document.getElementById('increment');
156
+ const decrementBtn = document.getElementById('decrement');
157
+
158
+ // Update UI
159
+ function updateUI() {
160
+ countEl.textContent = count;
161
+ }
162
+
163
+ // Button handlers
164
+ incrementBtn.addEventListener('click', () => { count++; updateUI(); });
165
+ decrementBtn.addEventListener('click', () => { count--; updateUI(); });
166
+
167
+ // Feature detection (like navigator.geolocation)
168
+ if ('modelContext' in navigator) {
169
+ // Register tools with the Web Model Context API
170
+ navigator.modelContext.provideContext({
171
+ tools: [
172
+ {
173
+ name: 'counter_get',
174
+ description: 'Get the current counter value',
175
+ inputSchema: { type: 'object', properties: {} },
176
+ execute: async () => ({
177
+ content: [{ type: 'text', text: String(count) }]
178
+ })
179
+ },
180
+ {
181
+ name: 'counter_set',
182
+ description: 'Set the counter to a specific value',
183
+ inputSchema: {
184
+ type: 'object',
185
+ properties: {
186
+ value: { type: 'number', description: 'The new counter value' }
187
+ },
188
+ required: ['value']
189
+ },
190
+ execute: async ({ value }) => {
191
+ count = value;
192
+ updateUI();
193
+ return {
194
+ content: [{ type: 'text', text: `Counter set to ${count}` }]
195
+ };
196
+ }
197
+ },
198
+ {
199
+ name: 'counter_increment',
200
+ description: 'Increment the counter by a specified amount',
201
+ inputSchema: {
202
+ type: 'object',
203
+ properties: {
204
+ amount: { type: 'number', description: 'Amount to increment by', default: 1 }
205
+ }
206
+ },
207
+ execute: async ({ amount = 1 }) => {
208
+ count += amount;
209
+ updateUI();
210
+ return {
211
+ content: [{ type: 'text', text: `Counter incremented to ${count}` }]
212
+ };
213
+ }
214
+ }
215
+ ]
216
+ });
217
+
218
+ console.log('Web Model Context API: Tools registered');
219
+ } else {
220
+ console.warn('Web Model Context API not supported');
221
+ }
222
+ </script>
223
+ </body>
224
+ </html>
225
+ ```
226
+
227
+ ### Single Tool Registration Pattern
228
+
229
+ Like `navigator.permissions.query()`, you can register tools one at a time:
230
+
231
+ ```javascript
232
+ // Feature detection
233
+ if ('modelContext' in navigator) {
234
+ // Register a single tool (returns an object with unregister method)
235
+ const registration = navigator.modelContext.registerTool({
236
+ name: 'get_page_info',
237
+ description: 'Get information about the current page',
238
+ inputSchema: { type: 'object', properties: {} },
239
+ execute: async () => ({
240
+ content: [{
241
+ type: 'text',
242
+ text: JSON.stringify({
243
+ title: document.title,
244
+ url: location.href,
245
+ timestamp: new Date().toISOString()
246
+ }, null, 2)
247
+ }]
248
+ })
249
+ });
250
+
251
+ // Later, unregister if needed (e.g., when component unmounts)
252
+ // registration.unregister();
253
+ }
254
+ ```
255
+
256
+ ### Event-Driven Pattern
257
+
258
+ Similar to other DOM events, you can listen for tool calls:
259
+
260
+ ```javascript
261
+ if ('modelContext' in navigator) {
262
+ // Listen for tool calls (like 'message' or 'click' events)
263
+ navigator.modelContext.addEventListener('toolcall', (event) => {
264
+ console.log(`Tool "${event.name}" called with:`, event.arguments);
265
+
266
+ // Optionally intercept and provide custom response
267
+ if (event.name === 'custom_handler') {
268
+ event.preventDefault();
269
+ event.respondWith({
270
+ content: [{ type: 'text', text: 'Custom response' }]
271
+ });
272
+ }
273
+ });
274
+ }
275
+ ```
276
+
277
+ ### Complete Standalone Example
278
+
279
+ Save this as `index.html` and open in a browser:
280
+
281
+ ```html
282
+ <!DOCTYPE html>
283
+ <html lang="en">
284
+ <head>
285
+ <meta charset="UTF-8">
286
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
287
+ <title>WebMCP Demo</title>
288
+ <script src="https://unpkg.com/@mcp-b/global@latest/dist/index.iife.js"></script>
289
+ <style>
290
+ body { font-family: system-ui; max-width: 600px; margin: 2rem auto; padding: 0 1rem; }
291
+ .card { border: 1px solid #ddd; border-radius: 8px; padding: 1rem; margin: 1rem 0; }
292
+ button { padding: 0.5rem 1rem; margin: 0.25rem; cursor: pointer; }
293
+ #log { font-family: monospace; font-size: 0.85rem; background: #f5f5f5; padding: 1rem; max-height: 200px; overflow-y: auto; }
294
+ </style>
295
+ </head>
296
+ <body>
297
+ <h1>🤖 WebMCP Demo</h1>
298
+
299
+ <div class="card">
300
+ <h2>Notes App</h2>
301
+ <input type="text" id="noteInput" placeholder="Enter a note..." style="width: 100%; padding: 0.5rem; box-sizing: border-box;">
302
+ <button id="addNote">Add Note</button>
303
+ <ul id="notesList"></ul>
304
+ </div>
305
+
306
+ <div class="card">
307
+ <h3>Tool Call Log</h3>
308
+ <div id="log">Waiting for AI tool calls...</div>
309
+ </div>
310
+
311
+ <script>
312
+ // Application state
313
+ const notes = [];
314
+
315
+ // DOM elements
316
+ const noteInput = document.getElementById('noteInput');
317
+ const addNoteBtn = document.getElementById('addNote');
318
+ const notesList = document.getElementById('notesList');
319
+ const logEl = document.getElementById('log');
320
+
321
+ // UI functions
322
+ function renderNotes() {
323
+ notesList.innerHTML = notes.map((note, i) =>
324
+ `<li>${note} <button onclick="deleteNote(${i})">×</button></li>`
325
+ ).join('');
326
+ }
327
+
328
+ function log(message) {
329
+ const time = new Date().toLocaleTimeString();
330
+ logEl.innerHTML = `[${time}] ${message}\n` + logEl.innerHTML;
331
+ }
332
+
333
+ // User interactions
334
+ addNoteBtn.addEventListener('click', () => {
335
+ if (noteInput.value.trim()) {
336
+ notes.push(noteInput.value.trim());
337
+ noteInput.value = '';
338
+ renderNotes();
339
+ }
340
+ });
341
+
342
+ window.deleteNote = (index) => {
343
+ notes.splice(index, 1);
344
+ renderNotes();
345
+ };
346
+
347
+ // Web Model Context API - Register tools for AI agents
348
+ if ('modelContext' in navigator) {
349
+ navigator.modelContext.provideContext({
350
+ tools: [
351
+ {
352
+ name: 'notes_list',
353
+ description: 'Get all notes',
354
+ inputSchema: { type: 'object', properties: {} },
355
+ execute: async () => {
356
+ log('🔧 notes_list called');
357
+ return {
358
+ content: [{
359
+ type: 'text',
360
+ text: notes.length ? notes.map((n, i) => `${i + 1}. ${n}`).join('\n') : 'No notes yet'
361
+ }]
362
+ };
363
+ }
364
+ },
365
+ {
366
+ name: 'notes_add',
367
+ description: 'Add a new note',
368
+ inputSchema: {
369
+ type: 'object',
370
+ properties: {
371
+ text: { type: 'string', description: 'The note text' }
372
+ },
373
+ required: ['text']
374
+ },
375
+ execute: async ({ text }) => {
376
+ log(`🔧 notes_add called: "${text}"`);
377
+ notes.push(text);
378
+ renderNotes();
379
+ return {
380
+ content: [{ type: 'text', text: `Added note: "${text}"` }]
381
+ };
382
+ }
383
+ },
384
+ {
385
+ name: 'notes_delete',
386
+ description: 'Delete a note by index (1-based)',
387
+ inputSchema: {
388
+ type: 'object',
389
+ properties: {
390
+ index: { type: 'number', description: 'Note index (1-based)' }
391
+ },
392
+ required: ['index']
393
+ },
394
+ execute: async ({ index }) => {
395
+ log(`🔧 notes_delete called: index ${index}`);
396
+ if (index < 1 || index > notes.length) {
397
+ return { content: [{ type: 'text', text: 'Invalid index' }], isError: true };
398
+ }
399
+ const deleted = notes.splice(index - 1, 1)[0];
400
+ renderNotes();
401
+ return {
402
+ content: [{ type: 'text', text: `Deleted: "${deleted}"` }]
403
+ };
404
+ }
405
+ },
406
+ {
407
+ name: 'notes_clear',
408
+ description: 'Delete all notes',
409
+ inputSchema: { type: 'object', properties: {} },
410
+ execute: async () => {
411
+ log('🔧 notes_clear called');
412
+ const count = notes.length;
413
+ notes.length = 0;
414
+ renderNotes();
415
+ return {
416
+ content: [{ type: 'text', text: `Cleared ${count} notes` }]
417
+ };
418
+ }
419
+ }
420
+ ]
421
+ });
422
+
423
+ log('✅ Web Model Context API initialized');
424
+ log('📋 Tools: notes_list, notes_add, notes_delete, notes_clear');
425
+ } else {
426
+ log('❌ Web Model Context API not available');
427
+ }
428
+ </script>
429
+ </body>
430
+ </html>
431
+ ```
432
+
433
+ This example demonstrates:
434
+ - **Feature detection** using `'modelContext' in navigator`
435
+ - **Tool registration** via `navigator.modelContext.provideContext()`
436
+ - **Standard input schemas** following JSON Schema specification
437
+ - **Async execute functions** returning MCP-compatible responses
438
+ - **Real-time UI updates** when AI agents call tools
439
+
130
440
  ## ⚙️ Configuration
131
441
 
132
442
  The polyfill exposes `initializeWebModelContext(options?: WebModelContextInitOptions)` to let you control transport behaviour. When you import `@mcp-b/global` as a module it auto-initializes by default, but you can customise or defer initialization:
@@ -1285,6 +1595,49 @@ test('todo tool creates correct response', async () => {
1285
1595
 
1286
1596
  The polyfill automatically detects and defers to the native implementation when available, ensuring forward compatibility as browsers adopt this standard.
1287
1597
 
1598
+ ## Zod Version Compatibility
1599
+
1600
+ This package supports **Zod 3.25+** and **Zod 4.x**. Simply use the standard import:
1601
+
1602
+ ```typescript
1603
+ import { z } from 'zod';
1604
+
1605
+ window.navigator.modelContext.provideContext({
1606
+ tools: [{
1607
+ name: "my-tool",
1608
+ inputSchema: {
1609
+ name: z.string().describe('User name'),
1610
+ age: z.number().min(0)
1611
+ },
1612
+ async execute({ name, age }) {
1613
+ return { content: [{ type: "text", text: `Hello, ${name}!` }] };
1614
+ }
1615
+ }]
1616
+ });
1617
+ ```
1618
+
1619
+ ### JSON Schema Alternative
1620
+
1621
+ JSON Schema is also supported if you prefer not to use Zod:
1622
+
1623
+ ```javascript
1624
+ window.navigator.modelContext.provideContext({
1625
+ tools: [{
1626
+ name: "my-tool",
1627
+ inputSchema: {
1628
+ type: "object",
1629
+ properties: {
1630
+ name: { type: "string" }
1631
+ },
1632
+ required: ["name"]
1633
+ },
1634
+ async execute({ name }) {
1635
+ return { content: [{ type: "text", text: `Hello, ${name}!` }] };
1636
+ }
1637
+ }]
1638
+ });
1639
+ ```
1640
+
1288
1641
  ## 📦 What's Included
1289
1642
 
1290
1643
  - **Web Model Context API** - Standard `window.navigator.modelContext` interface
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { IframeChildTransportOptions, TabServerTransportOptions } from "@mcp-b/transports";
2
2
  import { CallToolResult, CreateMessageRequest, CreateMessageResult, ElicitRequest, ElicitResult, Prompt, PromptMessage, Resource, ResourceContents, ResourceTemplate, Server, ToolAnnotations, Transport } from "@mcp-b/webmcp-ts-sdk";
3
- import { z } from "zod/v4";
3
+ import { z } from "zod";
4
4
 
5
5
  //#region src/types.d.ts
6
6
 
@@ -50,7 +50,7 @@ interface InputSchema {
50
50
  *
51
51
  * @example
52
52
  * ```typescript
53
- * import { z } from 'zod/v4';
53
+ * import { z } from 'zod';
54
54
  *
55
55
  * const mySchema: ZodSchemaObject = {
56
56
  * query: z.string().describe('Search query'),
@@ -1091,8 +1091,11 @@ declare function createLogger(namespace: string): Logger;
1091
1091
  //#endregion
1092
1092
  //#region src/validation.d.ts
1093
1093
  /**
1094
- * Convert Zod schema object to JSON Schema
1095
- * Uses Zod 4's native z.toJSONSchema() for conversion
1094
+ * Convert Zod schema object to JSON Schema.
1095
+ * Uses toJSONSchema from 'zod/v4' which is available in Zod 3.25+ and Zod 4.
1096
+ *
1097
+ * Works with schemas created from both `import { z } from 'zod'` (Zod 3.25+ compat)
1098
+ * and `import { z } from 'zod/v4'` (native Zod 4).
1096
1099
  *
1097
1100
  * @param schema - Record of Zod type definitions (e.g., { name: z.string(), age: z.number() })
1098
1101
  * @returns JSON Schema object compatible with MCP InputSchema
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/global.ts","../src/logger.ts","../src/validation.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/global.ts","../src/logger.ts","../src/validation.ts"],"sourcesContent":[],"mappings":"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"}