UNPKG

mcp-ts-template

Version:

A production-grade TypeScript template for building robust Model Context Protocol (MCP) servers, featuring built-in observability with OpenTelemetry, advanced error handling, comprehensive utilities, and a modular architecture.

81 lines 3.5 kB
/** * @fileoverview Handles the registration of the `echo` resource with an MCP server instance. * @module src/mcp-server/resources/echoResource/registration.ts * @see {@link src/mcp-server/resources/echoResource/logic.ts} for the core business logic and schemas. */ 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 "./logic.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. */ 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, callContext) => { const sessionId = typeof callContext?.sessionId === "string" ? callContext.sessionId : undefined; const handlerContext = requestContextService.createRequestContext({ parentContext: callContext, operation: "HandleResourceRead", resourceUri: uri.href, sessionId, 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, }); }; //# sourceMappingURL=registration.js.map