# TRUEREF-0012 — MCP Server (HTTP Transport) **Priority:** P1 **Status:** Pending **Depends On:** TRUEREF-0011 **Blocks:** — --- ## Overview Extend the MCP server to support an HTTP/SSE transport in addition to the stdio transport from TRUEREF-0011. This allows TrueRef to be used as a remote MCP server (similar to `mcp.context7.com`) without requiring local installation of the MCP binary on the client machine. --- ## Acceptance Criteria - [ ] HTTP transport alongside existing stdio transport (flag-based selection) - [ ] `--transport http` and `--port ` CLI flags - [ ] Streamable HTTP transport via `@modelcontextprotocol/sdk` `StreamableHTTPServerTransport` - [ ] `/mcp` endpoint handles MCP protocol over HTTP - [ ] `/ping` health check endpoint returns `{ "ok": true }` - [ ] Default port 3001 (to avoid conflict with SvelteKit dev server on 5173) - [ ] CORS headers on `/mcp` for browser-based clients - [ ] `npm run mcp:http` script for convenience - [ ] Docker-friendly: reads `PORT` env var --- ## CLI Interface ``` node dist/mcp/index.js [--transport stdio|http] [--port 3001] Options: --transport Transport mode: 'stdio' (default) or 'http' --port Port for HTTP transport (default: 3001, env: PORT) ``` --- ## Implementation ```typescript // src/mcp/index.ts (extended) import { parseArgs } from 'node:util'; import { createServer } from 'node:http'; import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; const { values: args } = parseArgs({ options: { transport: { type: 'string', default: 'stdio' }, port: { type: 'string', default: process.env.PORT ?? '3001' }, }, }); async function startHttp(server: Server, port: number): Promise { const httpServer = createServer(async (req, res) => { const url = new URL(req.url!, `http://localhost:${port}`); // Health check if (url.pathname === '/ping') { res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ ok: true })); return; } // MCP endpoint if (url.pathname === '/mcp') { // CORS preflight res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Accept'); if (req.method === 'OPTIONS') { res.writeHead(204); res.end(); return; } const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: () => crypto.randomUUID(), }); await server.connect(transport); await transport.handleRequest(req, res); return; } res.writeHead(404); res.end('Not Found'); }); httpServer.listen(port, () => { process.stderr.write(`TrueRef MCP server listening on http://localhost:${port}/mcp\n`); }); } async function main() { const mcpServer = createMcpServer(); // shared server creation if (args.transport === 'http') { const port = parseInt(args.port!, 10); await startHttp(mcpServer, port); } else { const transport = new StdioServerTransport(); await mcpServer.connect(transport); } } ``` --- ## Package.json Scripts ```json { "scripts": { "mcp:start": "tsx src/mcp/index.ts", "mcp:http": "tsx src/mcp/index.ts --transport http --port 3001" } } ``` --- ## Remote Integration (Claude Code) For HTTP transport, users configure Claude Code with the remote URL: ```json { "mcpServers": { "trueref": { "type": "http", "url": "http://localhost:3001/mcp" } } } ``` --- ## Files to Modify - `src/mcp/index.ts` — add HTTP transport branch and CLI arg parsing