{"version":3,"sources":["/home/runner/work/canvas-lms-mcp/canvas-lms-mcp/dist/http.cjs","../src/http.ts"],"names":[],"mappings":"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","file":"/home/runner/work/canvas-lms-mcp/canvas-lms-mcp/dist/http.cjs","sourcesContent":[null,"import { createServer } from 'node:http'\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'\nimport { createCanvasMCPServer } from './server'\nimport { parseArgs } from './cli'\n\nexport function createHttpHandler(defaultConfig: {\n  token?: string\n  baseUrl?: string\n  allowedOrigin?: string\n}) {\n  return async (\n    req: import('node:http').IncomingMessage,\n    res: import('node:http').ServerResponse,\n  ) => {\n    // CORS headers on all responses\n    res.setHeader(\n      'Access-Control-Allow-Origin',\n      defaultConfig.allowedOrigin ?? 'http://localhost:3000',\n    )\n    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS')\n    res.setHeader(\n      'Access-Control-Allow-Headers',\n      'Content-Type, X-Canvas-Token, Mcp-Session-Id, Mcp-Protocol-Version',\n    )\n    res.setHeader('Access-Control-Expose-Headers', 'Mcp-Session-Id, Mcp-Protocol-Version')\n\n    if (req.method === 'OPTIONS') {\n      res.writeHead(204)\n      res.end()\n      return\n    }\n\n    // Health check endpoint\n    if (req.url === '/health') {\n      res.writeHead(200, { 'Content-Type': 'application/json' })\n      res.end(JSON.stringify({ status: 'ok' }))\n      return\n    }\n\n    // Only handle /mcp path\n    if (req.url !== '/mcp') {\n      res.writeHead(404, { 'Content-Type': 'application/json' })\n      res.end(JSON.stringify({ error: 'Not found' }))\n      return\n    }\n\n    // Only POST is supported for stateless MCP\n    if (req.method !== 'POST') {\n      res.writeHead(405, { 'Content-Type': 'application/json' })\n      res.end(\n        JSON.stringify({\n          jsonrpc: '2.0',\n          error: { code: -32000, message: 'Method not allowed.' },\n          id: null,\n        }),\n      )\n      return\n    }\n\n    // Per-request token from header; base URL must come from server config (SSRF protection)\n    const token = (req.headers['x-canvas-token'] as string) ?? defaultConfig.token\n    const baseUrl = defaultConfig.baseUrl\n\n    if (!token || !baseUrl) {\n      res.writeHead(400, { 'Content-Type': 'application/json' })\n      res.end(\n        JSON.stringify({\n          error:\n            'Missing Canvas credentials. Provide X-Canvas-Token header and configure base URL via --base-url or CANVAS_BASE_URL.',\n        }),\n      )\n      return\n    }\n\n    // Fresh MCP server per request (per-request credentials)\n    const { server } = createCanvasMCPServer({ token, baseUrl })\n\n    try {\n      const transport = new StreamableHTTPServerTransport({\n        sessionIdGenerator: undefined,\n      })\n      await server.connect(transport)\n      await transport.handleRequest(req, res)\n      res.on('close', () => {\n        try {\n          transport.close()\n          server.close()\n        } catch (cleanupError) {\n          console.error('Error during MCP cleanup:', cleanupError)\n        }\n      })\n    } catch (error) {\n      console.error('Error handling MCP request:', error)\n      if (!res.headersSent) {\n        res.writeHead(500, { 'Content-Type': 'application/json' })\n        res.end(\n          JSON.stringify({\n            jsonrpc: '2.0',\n            error: { code: -32603, message: 'Internal server error' },\n            id: null,\n          }),\n        )\n      }\n    }\n  }\n}\n\nasync function main() {\n  const config = parseArgs(process.argv.slice(2))\n  const port = config.port\n\n  const httpServer = createServer(\n    createHttpHandler({\n      token: config.token,\n      baseUrl: config.baseUrl,\n      allowedOrigin: config.allowedOrigin,\n    }),\n  )\n\n  httpServer.listen(port, () => {\n    console.log(`Canvas LMS MCP server listening on http://localhost:${port}`)\n    console.log(`MCP endpoint: http://localhost:${port}/mcp`)\n    console.log(`Health check: http://localhost:${port}/health`)\n  })\n}\n\nmain().catch((error) => {\n  console.error('Fatal error:', error)\n  process.exit(1)\n})\n"]}