diff --git a/src/everything/tools/get-resource-links.ts b/src/everything/tools/get-resource-links.ts new file mode 100644 index 00000000..ea4dd6fd --- /dev/null +++ b/src/everything/tools/get-resource-links.ts @@ -0,0 +1,80 @@ +import { z } from "zod"; +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; +import { + textResource, + textResourceUri, + blobResourceUri, + blobResource, +} from "../resources/templates.js"; + +// Tool input schema +const GetResourceLinksSchema = z.object({ + count: z + .number() + .min(1) + .max(10) + .default(3) + .describe("Number of resource links to return (1-10)"), +}); + +// Tool configuration +const name = "get-resource-links"; +const config = { + title: "Get Resource Links Tool", + description: + "Returns up to ten resource links that reference different types of resources", + inputSchema: GetResourceLinksSchema, +}; + +/** + * Registers the 'get-resource-reference' tool with the provided McpServer instance. + * + * The registered tool retrieves a specified number of resource links and their metadata. + * Resource links are dynamically generated as either text or binary blob resources, + * based on their ID being even or odd. + + * The response contains a "text" introductory block and multiple "resource_link" blocks. + * + * @param {McpServer} server - An instance of the McpServer on which the tool will be registered. + */ +export const registerGetResourceLinksTool = (server: McpServer) => { + server.registerTool(name, config, async (args): Promise => { + const { count } = GetResourceLinksSchema.parse(args); + + // Add intro text content block + const content: CallToolResult["content"] = []; + content.push({ + type: "text", + text: `Here are ${count} resource links to resources available in this server:`, + }); + + // Create resource link content blocks + for (let resourceId = 1; resourceId <= count; resourceId++) { + // Get resource uri for text or blob resource based on odd/even resourceId + const isOdd = resourceId % 2 === 0; + const uri = isOdd + ? textResourceUri(resourceId) + : blobResourceUri(resourceId); + + // Get resource based on the resource type + const resource = isOdd + ? textResource(uri, resourceId) + : blobResource(uri, resourceId); + + content.push({ + type: "resource_link", + uri: resource.uri, + name: `${isOdd ? "Text" : "Blob"} Resource ${resourceId}`, + description: `Resource ${resourceId}: ${ + resource.mimeType === "text/plain" + ? "plaintext resource" + : "binary blob resource" + }`, + mimeType: resource.mimeType, + }); + } + + return { content }; + }); +}; diff --git a/src/everything/tools/get-resource-reference.ts b/src/everything/tools/get-resource-reference.ts index 838d9a15..6fa7e2df 100644 --- a/src/everything/tools/get-resource-reference.ts +++ b/src/everything/tools/get-resource-reference.ts @@ -26,7 +26,7 @@ const GetResourceReferenceSchema = z.object({ const name = "get-resource-reference"; const config = { title: "Get Resource Reference Tool", - description: "Adds two numbers", + description: "Returns a resource reference that can be used by MCP clients", inputSchema: GetResourceReferenceSchema, }; diff --git a/src/everything/tools/index.ts b/src/everything/tools/index.ts index 41b2f720..e9c9b724 100644 --- a/src/everything/tools/index.ts +++ b/src/everything/tools/index.ts @@ -3,6 +3,7 @@ import { registerAddTool } from "./add.js"; import { registerAnnotatedMessageTool } from "./annotated-message.js"; import { registerEchoTool } from "./echo.js"; import { registerGetTinyImageTool } from "./get-tiny-image.js"; +import { registerGetResourceLinksTool } from "./get-resource-links.js"; import { registerGetResourceReferenceTool } from "./get-resource-reference.js"; import { registerLongRunningOperationTool } from "./long-running-operation.js"; import { registerPrintEnvTool } from "./print-env.js"; @@ -19,6 +20,7 @@ export const registerTools = (server: McpServer) => { registerAnnotatedMessageTool(server); registerEchoTool(server); registerGetTinyImageTool(server); + registerGetResourceLinksTool(server); registerGetResourceReferenceTool(server); registerLongRunningOperationTool(server); registerPrintEnvTool(server);