UNPKG

@modelcontextprotocol/server-everything

Version:

MCP server that exercises all the features of the MCP protocol

64 lines (63 loc) • 2.57 kB
import { z } from "zod"; import { resourceTypeCompleter, resourceIdForPromptCompleter, } from "../resources/templates.js"; import { textResource, textResourceUri, blobResourceUri, blobResource, RESOURCE_TYPE_BLOB, RESOURCE_TYPE_TEXT, RESOURCE_TYPES, } from "../resources/templates.js"; import { PROMPT_ICONS } from "../server/icons.js"; /** * Register a prompt with an embedded resource reference * - Takes a resource type and id * - Returns the corresponding dynamically created resource * * @param server */ export const registerEmbeddedResourcePrompt = (server) => { // Prompt arguments const promptArgsSchema = z.object({ resourceType: resourceTypeCompleter, resourceId: resourceIdForPromptCompleter, }); // Register the prompt server.registerPrompt("resource-prompt", { title: "Resource Prompt", icons: PROMPT_ICONS, description: "A prompt that includes an embedded resource reference", argsSchema: promptArgsSchema, }, (args) => { // Validate resource type argument const resourceType = args.resourceType; if (!RESOURCE_TYPES.includes(resourceType)) { throw new Error(`Invalid resourceType: ${args?.resourceType}. Must be ${RESOURCE_TYPE_TEXT} or ${RESOURCE_TYPE_BLOB}.`); } // Validate resourceId argument const resourceId = Number(args?.resourceId); if (!Number.isFinite(resourceId) || !Number.isInteger(resourceId) || resourceId < 1) { throw new Error(`Invalid resourceId: ${args?.resourceId}. Must be a finite positive integer.`); } // Get resource based on the resource type const uri = resourceType === RESOURCE_TYPE_TEXT ? textResourceUri(resourceId) : blobResourceUri(resourceId); const resource = resourceType === RESOURCE_TYPE_TEXT ? textResource(uri, resourceId) : blobResource(uri, resourceId); return { messages: [ { role: "user", content: { type: "text", text: `This prompt includes the ${resourceType} resource with id: ${resourceId}. Please analyze the following resource:`, }, }, { role: "user", content: { type: "resource", resource: resource, }, }, ], }; }); };