A production-ready Svelte MCP (Model Context Protocol) client library with SSE transport, reactive stores, context providers, and minimal UI components.
# Using bun
bun add svelte-mcp-client
# Using npm
npm install svelte-mcp-client
# Using pnpm
pnpm add svelte-mcp-client
<script lang="ts">
import {
createMcpClient,
SseTransport,
McpProvider,
McpConnectButton,
McpToolRunner,
McpLogPanel
} from 'svelte-mcp-client';
const transport = new SseTransport({
sseUrl: '/mcp/sse',
postUrl: '/mcp'
});
const client = createMcpClient(transport);
</script>
<McpProvider {client}>
<h1>MCP Client Demo</h1>
<McpConnectButton />
<McpToolRunner />
<McpLogPanel />
</McpProvider>
import { createMcpClient, SseTransport } from 'svelte-mcp-client';
const transport = new SseTransport({
sseUrl: '/api/mcp/sse', // EventSource endpoint
postUrl: '/api/mcp', // POST endpoint for outgoing messages
reconnect: {
baseDelayMs: 500,
maxDelayMs: 15000,
jitter: 0.25
}
});
const client = createMcpClient(transport, {
requestTimeoutMs: 15000,
logger: (log) => console.log(log)
});
// Connection management
await client.connect();
await client.disconnect();
const connected = client.isConnected();
// MCP operations
const tools = await client.listTools();
const resources = await client.listResources();
const result = await client.callTool('tool-name', { param: 'value' });
// Event subscriptions (all return unsubscribe functions)
const unsubStatus = client.onStatus((status) => console.log(status));
const unsubMessage = client.onMessage((msg) => console.log(msg));
const unsubError = client.onError((err) => console.error(err));
const unsubLog = client.onLog((log) => console.log(log));
// Cleanup
client.destroy();
The SseTransport uses Server-Sent Events for inbound messages and HTTP POST for outbound messages.
import { SseTransport } from 'svelte-mcp-client';
const transport = new SseTransport({
sseUrl: '/mcp/sse', // Required: SSE endpoint
postUrl: '/mcp', // Required: POST endpoint
fetchImpl: fetch, // Optional: custom fetch
EventSourceImpl: EventSource, // Optional: custom EventSource
reconnect: {
// Optional: reconnection config
baseDelayMs: 500,
maxDelayMs: 15000,
jitter: 0.25
}
});
Features:
The McpTransport interface is designed to support WebSocket and other transports in future versions without breaking the public API.
Create reactive Svelte stores from a client:
import { createMcpStores } from 'svelte-mcp-client';
const stores = createMcpStores(client);
// Available stores:
// - stores.connection: { status, isConnected, lastError }
// - stores.tools: McpTool[]
// - stores.resources: McpResource[]
// - stores.logs: McpLog[] (last 200 entries)
// Don't forget to cleanup
onDestroy(() => stores.destroy());
Usage in components:
<script lang="ts">
import { createMcpClient, SseTransport, createMcpStores } from 'svelte-mcp-client';
const transport = new SseTransport({ sseUrl: '/mcp/sse', postUrl: '/mcp' });
const client = createMcpClient(transport);
const stores = createMcpStores(client);
</script>
{#if $stores.connection.isConnected}
<p>Connected</p>
<ul>
{#each $stores.tools as tool}
<li>{tool.name}: {tool.description}</li>
{/each}
</ul>
{:else}
<p>Status: {$stores.connection.status}</p>
{/if}
Use McpProvider and useMcp() for component tree-wide access:
<!-- App.svelte -->
<script lang="ts">
import { McpProvider, createMcpClient, SseTransport } from 'svelte-mcp-client';
const transport = new SseTransport({ sseUrl: '/mcp/sse', postUrl: '/mcp' });
const client = createMcpClient(transport);
</script>
<McpProvider {client}>
<YourApp />
</McpProvider>
<!-- YourComponent.svelte -->
<script lang="ts">
import { useMcp } from 'svelte-mcp-client';
const { client, stores } = useMcp();
const { connection, tools } = stores;
async function handleConnect() {
await client.connect();
const toolList = await client.listTools();
tools.set(toolList);
}
</script>
<button on:click={handleConnect} disabled={$connection.isConnected}>
Connect
</button>
Three minimal, unstyled components are included for rapid prototyping:
<script lang="ts">
import { McpConnectButton } from 'svelte-mcp-client';
</script>
<McpConnectButton connectLabel="Connect" disconnectLabel="Disconnect" />
Interactive tool selector and executor:
<script lang="ts">
import { McpToolRunner } from 'svelte-mcp-client';
</script>
<McpToolRunner />
Displays recent log entries:
<script lang="ts">
import { McpLogPanel } from 'svelte-mcp-client';
</script>
<McpLogPanel />
All types are exported for use in your code:
import type {
// Core types
McpClient,
McpTransport,
McpClientOptions,
// Message types
McpMessage,
McpTool,
McpResource,
McpToolCall,
McpToolResult,
// Utility types
JsonValue,
JsonSchema,
McpStatus,
McpLog,
McpLogLevel
} from 'svelte-mcp-client';
# Install dependencies
bun install
# Type checking
bun run typecheck
# Linting
bun run lint
# Format code
bun run format
# Run tests
bun run test
# Build package
bun run build
The Model Context Protocol is an open protocol that enables seamless integration between LLM applications and external data sources and tools. This library provides a Svelte-native implementation of the MCP client specification.
Check out the examples directory for complete working examples demonstrating:
See CONTRIBUTING.md for development guidelines.
Created and maintained by rakinzisilver
MIT - see LICENSE for details.