UNPKG

purchase-mcp-server

Version:
91 lines (90 loc) 3.91 kB
#!/usr/bin/env node import dotenv from 'dotenv'; // Load environment variables from .env file dotenv.config(); import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { toolDefinitions } from "./tools/schemas.js"; import * as toolHandlers from "./tools/handlers.js"; import * as resourceHandlers from "./resources/handlers.js"; import { resourceDefinitions } from "./resources/resources.js"; import fs from 'fs'; // Register tools export function registerTools(server) { Object.values(toolDefinitions).forEach((tool) => { const handler = toolHandlers[tool.name]; if (!handler) { throw new Error(`Handler not found for tool: ${tool.name}`); } server.tool(tool.name, tool.description, tool.schema, handler); }); } // Register resources export function registerResources(server) { Object.values(resourceDefinitions).forEach((resource) => { const handler = resourceHandlers[resource.method]; if (!handler) { throw new Error(`Handler not found for resource: ${resource.method}`); } console.error(`Registering resource: ${resource.name} at ${resource.uri}`); // Convert URI format from <param> to {param} for ResourceTemplate const templateUri = resource.uri.replace(/<([^>]+)>/g, '{$1}'); const template = new ResourceTemplate(templateUri, { list: undefined, // Not listing all resources }); try { server.resource(resource.name, template, { description: resource.description, mimeType: resource.mimeType, }, async (uri, variables) => { console.error(`Resource read requested: ${uri.toString()}`); console.error(`Variables:`, JSON.stringify(variables)); // Extract the identifier from the variables object // For "user://details/{user_id}", variables will contain { user_id: "..." } // For "vessel://managers/{imo}", variables will contain { imo: "..." } const userId = variables.user_id; const imo = variables.imo; const identifier = (Array.isArray(userId) ? userId[0] : userId) || (Array.isArray(imo) ? imo[0] : imo) || ''; console.error(`Calling handler with identifier: ${identifier}`); const result = await handler(identifier); return { contents: [ { uri: uri.toString(), mimeType: resource.mimeType, text: JSON.stringify(result, null, 2), }, ], }; }); console.error(`✓ Successfully registered resource: ${resource.name}`); } catch (error) { console.error(`✗ Failed to register resource: ${resource.name}`, error); throw error; } }); } // Create server instance const packageJson = fs.readFileSync('package.json', 'utf8'); const packageJsonObject = JSON.parse(packageJson); const server = new McpServer({ name: packageJsonObject.name, version: packageJsonObject.version, }); // Register tools and resources console.error("Registering tools..."); registerTools(server); console.error("Registering resources..."); registerResources(server); console.error(`Registered ${Object.keys(resourceDefinitions).length} resources`); async function main() { const transport = new StdioServerTransport(); await server.connect(transport); console.error(`${packageJsonObject.name} MCP Server running on stdio`); } main().catch((error) => { console.error("Fatal error in main():", error); process.exit(1); });