UNPKG

pocketsmith-mcp

Version:

MCP server for managing budgets via PocketSmith API

79 lines (78 loc) 3.42 kB
/** * @fileoverview Handles the registration of the `echo` resource with an MCP server instance. * This module defines the resource's template, metadata, and the asynchronous handler * that processes `resources/read` requests. * @module src/mcp-server/resources/echoResource/registration */ import { ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js"; import { BaseErrorCode } from "../../../types-global/errors.js"; import { ErrorHandler, logger, requestContextService, } from "../../../utils/index.js"; import { echoResourceLogic } from "./echoResourceLogic.js"; /** * Registers the 'echo' resource and its handlers with the provided MCP server instance. * * @param server - The MCP server instance to register the resource with. * @returns A promise that resolves when the resource registration is complete. */ export const registerEchoResource = async (server) => { const resourceName = "echo-resource"; const registrationContext = requestContextService.createRequestContext({ operation: "RegisterResource", resourceName: resourceName, }); logger.info(`Registering resource: '${resourceName}'`, registrationContext); await ErrorHandler.tryCatch(async () => { const template = new ResourceTemplate("echo://{message}", { list: async () => { return { resources: [ { uri: "echo://hello", name: "Default Echo Message", description: "A simple echo resource example.", }, ], }; }, }); server.resource(resourceName, template, { name: "Echo Message Resource", description: "A simple echo resource that returns a message.", mimeType: "application/json", examples: [{ name: "Basic echo", uri: "echo://hello" }], }, async (uri, params) => { const handlerContext = requestContextService.createRequestContext({ parentRequestId: registrationContext.requestId, operation: "HandleResourceRead", resourceUri: uri.href, inputParams: params, }); try { const responseData = await echoResourceLogic(uri, params, handlerContext); return { contents: [ { uri: uri.href, blob: Buffer.from(JSON.stringify(responseData)).toString("base64"), mimeType: "application/json", }, ], }; } catch (error) { // Re-throw to be caught by the SDK's top-level error handler throw ErrorHandler.handleError(error, { operation: "echoResourceReadHandler", context: handlerContext, input: { uri: uri.href, params }, }); } }); logger.info(`Resource '${resourceName}' registered successfully.`, registrationContext); }, { operation: `RegisteringResource_${resourceName}`, context: registrationContext, errorCode: BaseErrorCode.INITIALIZATION_FAILED, critical: true, }); };