[WIP] Refactor everything server to be more modular and use recommended APIs.

Adding the get-resource-reference and get-resource-reference tools

* Updated architecture.md

* Added get-resource-links.ts
  - Registers the 'get-resource-reference' tool with the provided McpServer instance.
  - The registered tool retrieves a specified number of resource links and their metadata.

* In get-resource-reference.ts
  - fixed tool description

* In tools/index.ts
  - import registerGetResourceLinksTool
  - in registerTool
    - call registerGetResourceLinksTool
This commit is contained in:
cliffhall
2025-12-09 19:17:00 -05:00
parent 320e3d8b25
commit 8530747606
3 changed files with 83 additions and 1 deletions

View File

@@ -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<CallToolResult> => {
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 };
});
};

View File

@@ -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,
};

View File

@@ -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);