prompt-handlers.ts•2.04 kB
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;
  }
}