39 lines
1.3 KiB
TypeScript
39 lines
1.3 KiB
TypeScript
import type { McpServer } from "@modelcontextprotocol/server";
|
|
import { z } from "zod";
|
|
|
|
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",
|
|
{
|
|
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 }] };
|
|
},
|
|
);
|
|
}
|