Retrofit your app in one command
Ships a working poll widget, an MCP endpoint, and a dev tunnel you can point a real host at.
A schematic and a signals-native library that retrofits an existing Angular app with MCP views that render inside Claude, ChatGPT, and any MCP-Apps host. One ng add. No new runtime.
This is 0.2.x, the line today's hosts connect to. Targeting the MCP 2026-07-28 revision? Read the 1.x beta docs →
The library
One Adaptor interface abstracts the OpenAI Apps SDK and the open MCP-Apps postMessage spec. Your widget code is identical across hosts.
Architecture
The MCP JSON-RPC endpoint and widget asset routes mount into your existing Angular server.ts before the SSR catch-all. Views are client-bootstrapped widgets, code-split by the standard Angular builder, hydrated from host-pushed tool data.
import { Component, computed } from '@angular/core';import { injectCallTool, injectToolInfo } from 'ng-mcp-ui/web';@Component({ selector: 'poll-widget', template: ` @let p = poll(); @if (p) { <h1>{{ p.question }}</h1> @for (o of p.options; track o) { <button (click)="vote(o)">{{ o }}</button> } } `,})export default class PollWidget { // the tool that rendered this view, as a state signal private readonly tool = injectToolInfo<{ output: Poll }>(); private readonly castVote = injectCallTool<VoteArgs, VoteResult>('cast_vote'); protected readonly poll = computed(() => { const s = this.tool(); return s.isSuccess ? s.output : null; }); protected vote(option: string) { this.castVote.callTool({ pollId: this.poll()?.pollId, option }); }}Compatibility
Ships a working poll widget, an MCP endpoint, and a dev tunnel you can point a real host at.