@mcp-b/global 2.0.0 → 2.0.2-beta.20260125195014
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 +344 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.iife.js +2 -2
- package/dist/index.js +16 -4
- package/dist/index.js.map +1 -1
- package/package.json +15 -5
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,40 @@ 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
|
+
| Package Version | Zod Version | Notes |
|
|
1601
|
+
|-----------------|-------------|-------|
|
|
1602
|
+
| `@mcp-b/global@2.x` | **Zod 4** | Uses `zod/v4` imports, `z.toJSONSchema()`, `z.fromJSONSchema()` |
|
|
1603
|
+
| `@mcp-b/global@1.x` | **Zod 3** | Compatible with Zod 3.x projects |
|
|
1604
|
+
|
|
1605
|
+
**If your project uses Zod 3:**
|
|
1606
|
+
- Use `@mcp-b/global@1.x`: `npm install @mcp-b/global@1`
|
|
1607
|
+
- Or use JSON schemas instead of Zod schemas (works with any version):
|
|
1608
|
+
|
|
1609
|
+
```javascript
|
|
1610
|
+
// JSON Schema works regardless of Zod version
|
|
1611
|
+
window.navigator.modelContext.provideContext({
|
|
1612
|
+
tools: [{
|
|
1613
|
+
name: "my-tool",
|
|
1614
|
+
inputSchema: {
|
|
1615
|
+
type: "object",
|
|
1616
|
+
properties: {
|
|
1617
|
+
name: { type: "string" }
|
|
1618
|
+
},
|
|
1619
|
+
required: ["name"]
|
|
1620
|
+
},
|
|
1621
|
+
async execute({ name }) {
|
|
1622
|
+
return { content: [{ type: "text", text: `Hello, ${name}!` }] };
|
|
1623
|
+
}
|
|
1624
|
+
}]
|
|
1625
|
+
});
|
|
1626
|
+
```
|
|
1627
|
+
|
|
1628
|
+
**If your project uses Zod 4:**
|
|
1629
|
+
- Use `@mcp-b/global@2.x` (latest): `npm install @mcp-b/global`
|
|
1630
|
+
- Full Zod schema support with automatic JSON Schema conversion
|
|
1631
|
+
|
|
1288
1632
|
## 📦 What's Included
|
|
1289
1633
|
|
|
1290
1634
|
- **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
|
|
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
|
|
53
|
+
* import { z } from 'zod';
|
|
54
54
|
*
|
|
55
55
|
* const mySchema: ZodSchemaObject = {
|
|
56
56
|
* query: z.string().describe('Search query'),
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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":";;;;;;;;AAkoBA;;;;;;;;;;;;;;AAoCA;;;;;AAOmB,UA7jBF,WAAA,CA6jBE;EAAO;EAWT,IAAA,EAAA,MAAA;EAMF;EAEE,UAAA,CAAA,EA5kBF,MA4kBE,CAAA,MAAA,EAAA;IAED;IAAe,IAAA,EAAA,MAAA;IAOd;IAeA,WAAA,CAAA,EAAA,MAAkB;IAalB;IAOT,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAA;EALI,CAAA,CAAA;EAkBI;EASH,QAAA,CAAA,EAAA,MAAA,EAAA;EAAM;EAOF,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAc;AAc/B;AA+BA;AAeA;AAKA;AAeA;;;;;AAuBA;;;;;AAqBA;;;AAgB2C,KAhwB/B,eAAA,GAAkB,MAgwBa,CAAA,MAAA,EAhwBE,CAAA,CAAE,UAgwBJ,CAAA;;;;;;AA2FnB,KAt0BZ,YAAA,GAAe,cAs0BH;;;;;;;;;;;;;;AA+DxB;;;;;;;;;;;AAyBA;;;;;;;;;;;;AA2BA;AAqBA;;;;;;;;;AAoEC;;;;;;;;;;;UAn9BgB,kBAAA;EC5LG;;;;EAWqC,YAAA,EAAA,IAAA;
|
|
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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"}
|