import type {
GetPromptRequest,
GetPromptResult,
ListPromptsRequest,
ListPromptsResult,
PromptMessage,
} from "@modelcontextprotocol/sdk/types.js";
import { PROMPTS } from "../constants/sampling-prompts.js";
import { injectVariablesIntoText } from "../utils/message-handlers.js";
export async function handleListPrompts(request: ListPromptsRequest): Promise<ListPromptsResult> {
try {
if (!PROMPTS || !Array.isArray(PROMPTS)) {
throw new Error("Failed to fetch prompts");
}
return {
prompts: PROMPTS.map(({ messages, ...rest }) => rest),
};
} catch (error: any) {
console.error("Failed to fetch prompts:", error);
throw error;
}
}
export async function handleGetPrompt(request: GetPromptRequest): Promise<GetPromptResult> {
try {
if (!PROMPTS || !Array.isArray(PROMPTS)) {
throw new Error("Failed to fetch prompts");
}
const foundPrompt = PROMPTS.find((p) => p.name === request.params.name);
if (!foundPrompt) {
throw new Error(`Prompt not found: ${request.params.name}`);
}
if (
!foundPrompt.messages ||
!Array.isArray(foundPrompt.messages) ||
foundPrompt.messages.length === 0
) {
throw new Error(`Messages not found for prompt: ${request.params.name}`);
}
const injectedMessages = foundPrompt.messages.map((message) => {
if (message.role === "user" && message.content.type === "text" && request.params.arguments) {
return {
role: message.role,
content: {
type: "text" as const,
text: injectVariablesIntoText(message.content.text, request.params.arguments),
},
} satisfies PromptMessage;
}
return message;
});
return {
name: foundPrompt.name,
description: foundPrompt.description,
arguments: foundPrompt.arguments || [],
messages: injectedMessages,
_meta: foundPrompt._meta,
};
} catch (error: any) {
console.error("Failed to fetch prompt:", error);
throw error;
}
}