Skip to content

Commit de80f12

Browse files
committed
docs(blog): Expand WebMCP section with implementation details and examples
- Correct WebMCP repository link to official webmachinelearning organization - Add explanation of tool registration across three levels (global, route, service) - Include complete code example for global WebMCP tool registration with BookStore service - Document Signal Forms integration with WebMCP via experimentalWebMcpTool option - Add step-by-step setup guide for provideExperimentalWebMcpForms provider - Provide comprehensive Signal Form example with validation and WebMCP tool declaration - Add browser testing section with Chrome flag configuration - Include console API example for manual tool execution via navigator.modelContextTesting - Clarify that Angular handles automatic tool deregistration on injector destruction - Emphasize tool name uniqueness requirement and runtime error handling
1 parent 372247d commit de80f12

1 file changed

Lines changed: 127 additions & 24 deletions

File tree

blog/2026-06-angular22/README.md

Lines changed: 127 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -343,44 +343,147 @@ So bleibt das Initial-Bundle schlank, und die Nutzer:innen müssen trotzdem nich
343343
## WebMCP: KI-Agenten in Web-Apps integrieren
344344

345345
Ein Thema, das uns in den nächsten Jahren noch intensiv begleiten wird, ist die Integration von KI-Agenten in unsere Anwendungen.
346-
Mit dem aufkommenden Webstandard **[WebMCP](https://github.com/MiguelsPizza/WebMCP)** lässt sich aus einer Webseite heraus dem Browser – und damit angeschlossenen KI-Agenten – ein Set von **Tools** zur Verfügung stellen.
347-
348-
Tools werden über die neue Browser-API `navigator.modelContext.registerTool()` registriert.
349-
Externe Agenten wie Claude, ChatGPT-Erweiterungen oder Gemini können diese Tools entdecken und auf Wunsch der Nutzer:innen aufrufen.
346+
Mit dem aufkommenden Webstandard **[WebMCP](https://github.com/webmachinelearning/webmcp)** (Web Model Context Protocol) lässt sich aus einer Webseite heraus dem Browser – und damit angeschlossenen KI-Agenten – ein Set von **Tools** zur Verfügung stellen.
347+
Statt dass ein Agent die DOM-Struktur einer Seite analysieren und Klicks simulieren muss, kann eine Web-App ihre Funktionalität als strukturierte Tools deklarieren.
348+
Externe Agenten wie Gemini, Claude oder ChatGPT-Erweiterungen können diese Tools entdecken und auf Wunsch der Nutzer:innen aufrufen.
350349
Damit verschmelzen Web-App und Agent: Aktionen, die sonst über die UI ausgeführt werden, können auch direkt aus einem Chat-Kontext heraus ausgelöst werden.
351350

352-
Angular 22 bringt dafür erste Bausteine mit, um diese Welt sauber an die Komponenten- und Service-Architektur anzudocken:
351+
Angular 22 bringt experimentelle Unterstützung für WebMCP mit und dockt das Konzept sauber an die bestehende Komponenten- und Service-Architektur an.
352+
Tools lassen sich auf drei Ebenen registrieren:
353+
354+
- **Global** für die gesamte Anwendung (über `provideExperimentalWebMcpTools()` in der App-Config)
355+
- **Pro Route** (über `provideExperimentalWebMcpTools()` in den Route-Providers)
356+
- **In Services** (über `declareExperimentalWebMcpTool()` im Injection Context)
357+
358+
Angular übernimmt dabei das Lifecycle-Handling: Tools werden automatisch wieder abgemeldet, wenn der zugehörige Injector zerstört wird.
359+
Wichtig ist, dass Tool-Namen eindeutig sein müssen – eine doppelte Registrierung führt zu einem Laufzeitfehler.
353360

354-
- Tools können direkt in Services oder Komponenten definiert und über die Dependency Injection bereitgestellt werden.
355-
- Das Lifecycle-Handling übernimmt Angular: Tools werden automatisch wieder abgemeldet, wenn die zugehörige Komponente zerstört wird.
361+
Ein einfaches Beispiel für ein globales Tool:
356362

357363
```ts
358-
// TODO: konkretes Codebeispiel und Quelle prüfen (Doku/PR-Link), sobald die offizielle Doku verfügbar ist
364+
import { provideExperimentalWebMcpTools, Service, inject } from '@angular/core';
365+
import { bootstrapApplication } from '@angular/platform-browser';
366+
367+
@Service()
368+
class BookStore {
369+
search(query: string) { /* ... */ }
370+
}
371+
372+
bootstrapApplication(AppRoot, {
373+
providers: [
374+
provideExperimentalWebMcpTools([{
375+
name: 'searchBooks',
376+
description: 'Searches the book catalog.',
377+
inputSchema: {
378+
type: 'object',
379+
properties: {
380+
query: { type: 'string', description: 'Search keywords.' }
381+
},
382+
required: ['query'],
383+
additionalProperties: false,
384+
},
385+
execute: ({ query }) => {
386+
const store = inject(BookStore);
387+
return { content: [{ type: 'text', text: store.search(query) }] };
388+
},
389+
}]),
390+
],
391+
});
359392
```
360393

361-
### Signal Forms: `experimentalWebMcpTool`
394+
Der `execute`-Callback wird im Injection Context des zugehörigen Injectors ausgeführt – wir können also direkt `inject()` verwenden, um auf Services zuzugreifen.
395+
396+
### Signal Forms als WebMCP-Tools
362397

363398
Besonders charmant ist die Brücke zwischen Signal Forms und WebMCP:
364-
Mit der Funktion **`experimentalWebMcpTool`** lässt sich ein Formular deklarativ als WebMCP-Tool registrieren.
365-
Angular leitet das JSON-Schema automatisch aus der Form-Definition ab – inklusive aller Validierungsregeln.
399+
Mit der Option `experimentalWebMcpTool` in der `form()`-Funktion lässt sich ein Formular deklarativ als WebMCP-Tool registrieren.
400+
Angular leitet das JSON-Schema automatisch aus dem initialen Wert des Form-Models ab – inklusive aller hinterlegter Validierungen.
401+
Damit kann ein KI-Agent ein Formular stellvertretend "ausfüllen" und absenden, ohne dass wir per Hand ein eigenes Tool mit JSON-Schema definieren müssen.
366402

367-
Damit kann ein KI-Agent ein Formular stellvertretend "ausfüllen", ohne dass wir per Hand ein eigenes Tool definieren müssen.
368-
Praktische Anwendungsfälle gibt es viele: Eine Buchsuche, eine Buchung oder eine strukturierte Datenerfassung, die der Agent im Auftrag der Nutzer:innen vornimmt.
403+
Um das Feature zu aktivieren, registrieren wir zunächst den Provider `provideExperimentalWebMcpForms()`:
369404

370405
```ts
371-
// TODO: Beispielcode aus offizieller Doku prüfen / einfügen
372-
import { form, schema, experimentalWebMcpTool } from '@angular/forms/signals';
373-
374-
protected readonly bookForm = form(this.bookData, bookFormSchema, {
375-
webMcpTool: experimentalWebMcpTool({
376-
name: 'create-book',
377-
description: 'Legt ein neues Buch im System an.',
378-
}),
379-
});
406+
import { ApplicationConfig } from '@angular/core';
407+
import { provideExperimentalWebMcpForms } from '@angular/forms/signals';
408+
409+
export const appConfig: ApplicationConfig = {
410+
providers: [
411+
provideExperimentalWebMcpForms()
412+
]
413+
};
414+
```
415+
416+
Anschließend können wir ein Signal Form als WebMCP-Tool deklarieren, indem wir die Option `experimentalWebMcpTool` mit einem Namen und einer Beschreibung übergeben:
417+
418+
```ts
419+
import { Component, signal } from '@angular/core';
420+
import { form, required, minLength, FormField } from '@angular/forms/signals';
421+
422+
@Component({/* ... */})
423+
export class BookCreatePage {
424+
readonly #bookFormData = signal({
425+
isbn: '',
426+
title: '',
427+
subtitle: '',
428+
authors: [''],
429+
description: '',
430+
imageUrl: '',
431+
});
432+
433+
protected readonly bookForm = form(
434+
this.#bookFormData,
435+
(path) => {
436+
required(path.title, { message: 'Title is required.' });
437+
// ... weitere Validierungen
438+
},
439+
{
440+
experimentalWebMcpTool: {
441+
name: 'createBook',
442+
description: 'Create a new book',
443+
},
444+
submission: {
445+
action: async (bookForm) => {
446+
// Formular absenden ...
447+
}
448+
}
449+
}
450+
);
451+
}
380452
```
381453

382-
Wie der Name verrät, ist diese Schnittstelle noch experimentell.
383-
Die genaue Form der API kann sich also noch ändern – wir behalten das Thema im Auge und werden hier in Kürze einen ausführlichen Blogpost dazu veröffentlichen.
454+
Angular generiert daraus ein WebMCP-Tool, dessen JSON-Schema die Felder des Formular-Modells mit ihren Validierungsregeln enthält.
455+
Wenn der Agent das Tool aufruft, validiert Angular die Eingaben gegen die definierten Regeln und gibt eventuelle Fehler zurück – der Agent kann sich also selbst korrigieren und es erneut versuchen.
456+
457+
### Testen im Browser
458+
459+
Um WebMCP lokal zu testen, muss das experimentelle Feature im Browser aktiviert werden.
460+
In Chrome geht das über das Flag:
461+
462+
```text
463+
chrome://flags/#enable-webmcp-testing
464+
```
465+
466+
Anschließend steht die Testing-API `navigator.modelContextTesting` in der Browser-Konsole zur Verfügung.
467+
Damit lässt sich ein registriertes Tool manuell in der Browser-Konsole aufrufen:
468+
469+
```js
470+
const result = await navigator.modelContextTesting.executeTool(
471+
'createBook',
472+
JSON.stringify({
473+
title: 'Web MCP',
474+
isbn: '9871234567890',
475+
description: 'A brand new book about Web MCP',
476+
authors: ['Claude Opus 4.6'],
477+
imageUrl: 'https://picsum.photos/200'
478+
})
479+
);
480+
console.log(JSON.parse(result));
481+
```
482+
483+
Wie der Name "experimental" verrät, ist diese Schnittstelle noch nicht stabil.
484+
Die WebMCP-Spezifikation selbst befindet sich in einem frühen Stadium und wird aktiv weiterentwickelt – die Angular-APIs können sich daher auch außerhalb von Major-Releases ändern.
485+
486+
Alle Details zur WebMCP-Integration in Angular findest du im offiziellen [Angular WebMCP Guide](https://angular.dev/ai/webmcp).
384487

385488

386489
## Deprecation der Webpack-basierten Builder

0 commit comments

Comments
 (0)