feat: add mcp to sveltekit

This commit is contained in:
2026-09-04 17:06:53 +05:00
parent 8ecc4c1110
commit 20bd9cfe88
4 changed files with 77 additions and 1 deletions
+5 -1
View File
@@ -16,12 +16,16 @@
"@sveltejs/adapter-vercel": "^6.3.4",
"@sveltejs/kit": "^2.63.0",
"@sveltejs/vite-plugin-svelte": "^7.1.2",
"@types/node": "^20.19.43",
"svelte": "^5.56.1",
"svelte-check": "^4.6.0",
"typescript": "^6.0.3",
"vite": "^8.0.16"
},
"dependencies": {
"@duck/types": "workspace:*"
"@duck/types": "workspace:*",
"@modelcontextprotocol/server": "^2.0.0",
"mcp-handler": "^2.1.1",
"zod": "^4.5.4"
}
}
+40
View File
@@ -0,0 +1,40 @@
import type { McpServer } from "@modelcontextprotocol/server";
import { z } from "zod";
export const QUACK_TOOL_NAME = "quack";
const QUACKS = {
happy: ["QUACK! 🎉", "Quack quack! 😄", "QUAAACK! 🦆✨"],
confused: ["Qu...ack?", "Quack? 🤔", "Quaaack...?"],
excited: ["QUACK QUACK QUACK!", "QUAAACK!! 🔥", "Quack! Quack! Quack!"],
sleepy: ["quack... 😴", "quaack... 💤", "quack. *yawn*"],
default: ["Quack!", "Quack quack!", "QUACK!", "Quaaack!", "Quack. 🦆"],
} as const;
const MOODS = ["happy", "confused", "excited", "sleepy"] as const;
function randomFrom<T>(arr: readonly T[]): T {
return arr[Math.floor(Math.random() * arr.length)];
}
export function registerDuckTools(server: McpServer): void {
server.registerTool(
QUACK_TOOL_NAME,
{
title: "Quack",
description:
"Rubber duck quacks. Use when you're stuck, looping, or hallucinating. " +
"The act of calling forces you to articulate your current thinking out loud.",
inputSchema: z.object({
mood: z
.enum(MOODS)
.optional()
.describe("Mood of the duck. Omit for a random quack."),
}),
},
async ({ mood }) => {
const text = mood ? randomFrom(QUACKS[mood]) : randomFrom(QUACKS.default);
return { content: [{ type: "text", text }] };
},
);
}
+20
View File
@@ -0,0 +1,20 @@
import type { RequestEvent } from "@sveltejs/kit";
import { createMcpHandler } from "mcp-handler";
import { registerDuckTools } from "$lib/mcp";
const handler = createMcpHandler(
async (server) => {
registerDuckTools(server);
},
{
serverInfo: { name: "rubber-duck-mcp", version: "1.0.0" },
},
);
export function GET(event: RequestEvent): Promise<Response> {
return handler(event.request);
}
export function POST(event: RequestEvent): Promise<Response> {
return handler(event.request);
}
+12
View File
@@ -268,6 +268,15 @@ importers:
'@duck/types':
specifier: workspace:*
version: link:../../packages/types
'@modelcontextprotocol/server':
specifier: ^2.0.0
version: 2.0.0
mcp-handler:
specifier: ^2.1.1
version: 2.1.1(@modelcontextprotocol/server@2.0.0)(next@16.3.3(@types/node@20.19.43)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))
zod:
specifier: ^4.5.4
version: 4.5.4
devDependencies:
'@sveltejs/adapter-vercel':
specifier: ^6.3.4
@@ -278,6 +287,9 @@ importers:
'@sveltejs/vite-plugin-svelte':
specifier: ^7.1.2
version: 7.3.0(svelte@5.57.0)(vite@8.2.2(@types/node@20.19.43)(esbuild@0.28.2)(tsx@4.23.13))
'@types/node':
specifier: ^20.19.43
version: 20.19.43
svelte:
specifier: ^5.56.1
version: 5.57.0