feat: add mcp to sveltekit
This commit is contained in:
@@ -16,12 +16,16 @@
|
|||||||
"@sveltejs/adapter-vercel": "^6.3.4",
|
"@sveltejs/adapter-vercel": "^6.3.4",
|
||||||
"@sveltejs/kit": "^2.63.0",
|
"@sveltejs/kit": "^2.63.0",
|
||||||
"@sveltejs/vite-plugin-svelte": "^7.1.2",
|
"@sveltejs/vite-plugin-svelte": "^7.1.2",
|
||||||
|
"@types/node": "^20.19.43",
|
||||||
"svelte": "^5.56.1",
|
"svelte": "^5.56.1",
|
||||||
"svelte-check": "^4.6.0",
|
"svelte-check": "^4.6.0",
|
||||||
"typescript": "^6.0.3",
|
"typescript": "^6.0.3",
|
||||||
"vite": "^8.0.16"
|
"vite": "^8.0.16"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@duck/types": "workspace:*"
|
"@duck/types": "workspace:*",
|
||||||
|
"@modelcontextprotocol/server": "^2.0.0",
|
||||||
|
"mcp-handler": "^2.1.1",
|
||||||
|
"zod": "^4.5.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
Generated
+12
@@ -268,6 +268,15 @@ importers:
|
|||||||
'@duck/types':
|
'@duck/types':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../packages/types
|
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:
|
devDependencies:
|
||||||
'@sveltejs/adapter-vercel':
|
'@sveltejs/adapter-vercel':
|
||||||
specifier: ^6.3.4
|
specifier: ^6.3.4
|
||||||
@@ -278,6 +287,9 @@ importers:
|
|||||||
'@sveltejs/vite-plugin-svelte':
|
'@sveltejs/vite-plugin-svelte':
|
||||||
specifier: ^7.1.2
|
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))
|
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:
|
svelte:
|
||||||
specifier: ^5.56.1
|
specifier: ^5.56.1
|
||||||
version: 5.57.0
|
version: 5.57.0
|
||||||
|
|||||||
Reference in New Issue
Block a user