Full Example
Production-ready Svelte example with runes and actions
Quick start
The pattern
UseonMount/onDestroy for lifecycle management:
SvelteKit SSR
Add thebrowser check to avoid SSR errors:
Documentation Index
Fetch the complete documentation index at: /llms.txt
Use this file to discover all available pages before exploring further.
Integrate WebMCP tools with Svelte and SvelteKit.
git clone https://github.com/WebMCP-org/examples.git
cd examples/svelte && pnpm install && pnpm dev
onMount/onDestroy for lifecycle management:
<script lang="ts">
import { onMount, onDestroy } from 'svelte';
import '@mcp-b/global';
let count = $state(0);
let reg: { unregister: () => void } | null = null;
onMount(() => {
reg = navigator.modelContext.registerTool({
name: 'increment',
description: 'Increment the counter',
inputSchema: {
type: 'object',
properties: { amount: { type: 'number' } }
},
async execute({ amount = 1 }) {
count += amount as number;
return { content: [{ type: 'text', text: `Count: ${count}` }] };
}
});
});
onDestroy(() => reg?.unregister());
</script>
<p>Count: {count}</p>
browser check to avoid SSR errors:
<script lang="ts">
import { browser } from '$app/environment';
import { onMount, onDestroy } from 'svelte';
import '@mcp-b/global';
let reg: { unregister: () => void } | null = null;
onMount(() => {
if (!browser) return;
reg = navigator.modelContext.registerTool({ /* ... */ });
});
onDestroy(() => reg?.unregister());
</script>
import '@mcp-b/global';
export function webmcp(node: HTMLElement, tool: Parameters<typeof navigator.modelContext.registerTool>[0]) {
const reg = navigator.modelContext.registerTool(tool);
return { destroy: () => reg.unregister() };
}
<div use:webmcp={{ name: 'my_tool', description: 'My tool', ... }}>
Content
</div>
'navigator is not defined' during SSR
browser check from $app/environment in SvelteKit.Tools disappear after navigation
+layout.svelte for persistence across routes.Was this page helpful?
