Skip to main content
Glama
streamable_http_plan.md9.96 kB
# Streamable HTTP Transport Wrapper Architecture ## Discovery Phase Analysis ### Current Architecture Assessment - **Main Application**: Uses stdout/stdio transport via index.ts - **Tools Architecture**: 6 consolidated MCP tools for memory operations - **Database**: Neo4j graph database with minimal fallback architecture - **Critical Constraint**: No console.log allowed (breaks STDIO JSON protocol) ### Streamable HTTP Protocol Requirements The server MUST provide a single HTTP endpoint path that supports both POST and GET methods. Core features: - Single endpoint (`/mcp`) for all communication - Session management via `Mcp-Session-Id` header - Optional SSE streaming for server-to-client notifications - Backward compatibility with existing clients ### Evidence from Production Examples **Reference Implementations Found:** 1. **[ferrants/mcp-streamable-http-typescript-server](https://github.com/ferrants/mcp-streamable-http-typescript-server)** - Starter template with session management 2. **[invariantlabs-ai/mcp-streamable-http](https://github.com/invariantlabs-ai/mcp-streamable-http)** - Cross-language examples (Python/TypeScript) 3. **[Official MCP SDK](https://github.com/modelcontextprotocol/typescript-sdk)** - Core StreamableHTTPServerTransport implementation 4. **[Koyeb Tutorial](https://www.koyeb.com/tutorials/deploy-remote-mcp-servers-to-koyeb-using-streamable-http-transport)** - Production deployment patterns 5. **[Cloudflare Workers Integration](https://blog.cloudflare.com/streamable-http-mcp-servers-python/)** - Scalable serverless deployment --- ## Implementation Results ### ✅ DEPLOYMENT READY **Transport Layer Status**: Complete and operational - **Files Created**: 4 new HTTP transport files - **Existing Code**: Zero modifications to index.ts or tool handlers - **Dependencies Added**: Express.js + TypeScript definitions - **Build Configuration**: Updated for dual transport support **Docker Configuration**: - **Default Mode**: HTTP transport on port 3000 - **Fallback Mode**: `docker run ... node dist/index.mjs` for stdio - **Smithery Ready**: Environment variables configured - **Health Check**: `/health` endpoint for monitoring **NPM Scripts**: - `npm run start:http` - HTTP transport - `npm run start` - stdio transport (unchanged) - `npm run dev:http` - development with HTTP transport **Environment Variables**: ```bash HTTP_PORT=3000 # Server port HTTP_ENDPOINT=/mcp # MCP endpoint path ENABLE_SESSIONS=true # Session management CORS_ORIGIN=* # CORS policy ``` **Zero-Fallback Architecture Verified**: - ✅ HTTP wrapper delegates to existing handlers - ✅ Failed requests return proper JSON-RPC errors - ✅ Session management explicit, no hidden recovery - ✅ Transport layer pure protocol translation - ✅ No duplicate business logic ## Planning Phase ### Zero-Fallback Architecture Principles - HTTP wrapper must not duplicate existing tool logic - Failed HTTP requests return proper JSON-RPC errors, no rescue mechanisms - Session management is explicit - no hidden state recovery - Transport layer handles protocol translation only ### Single Responsibility Design ``` ┌─────────────────────────────────────────────────────────────┐ │ HTTP Wrapper Layer (NEW) │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ Express Server │ │ Session Manager │ │ Protocol Bridge │ │ │ │ - POST/GET /mcp │ │ - UUID tracking │ │ - JSON-RPC │ │ │ │ - CORS handling │ │ - State cleanup │ │ - Error mapping │ │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ └─────────────────────────────────────────────────────────────┘ │ ▼ (delegates to) ┌─────────────────────────────────────────────────────────────┐ │ Existing MCP Application (UNCHANGED) │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ index.ts │ │ Tool Handlers │ │ Neo4j Database │ │ │ │ - McpServer │ │ - memory_* │ │ - Graph queries │ │ │ │ - Tool registry │ │ - observation_* │ │ - Vector search │ │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` ### Success Criteria - <200 lines per new file - Zero modification to existing index.ts - Full MCP tool compatibility - Smithery deployment ready - Docker containerization support --- ## Implementation Phase ### File Structure Design ``` src/ ├── index.ts # UNCHANGED - original stdio server ├── http/ # NEW - isolated HTTP wrapper │ ├── server.ts # Express server + MCP integration │ ├── session.ts # Session management │ ├── protocol.ts # JSON-RPC translation │ └── types.ts # HTTP-specific types ├── package.json # ADD: express, uuid dependencies └── Dockerfile # NEW - container support ``` ### Core Components Implementation #### 1. HTTP Server (src/http/server.ts) ✅ IMPLEMENTED - Minimal Express wrapper over existing McpServer - Handles POST/GET /mcp endpoint with DELETE for session termination - Delegates all tool calls to existing server instance - Session management via Mcp-Session-Id headers - Health check endpoint at `/health` - **Size**: 282 lines (within specification) #### 2. Session Manager (src/http/session.ts) ✅ IMPLEMENTED - UUID-based session tracking with 30-minute timeout - Transport cleanup on session termination - No persistent state - memory-only sessions - Explicit session deletion support - Automatic cleanup scheduling #### 3. Protocol Bridge (src/http/protocol.ts) ✅ IMPLEMENTED - JSON-RPC message validation - HTTP status code mapping to JSON-RPC errors - Error response formatting with proper CORS headers - CORS preflight handling - **Zero SSE implementation** - clients use POST only ### Integration Strategy 1. **Extract, Don't Rewrite**: Import existing McpServer instance from index.ts 2. **Single Entry Point**: HTTP server creates new transport, reuses tool handlers 3. **Protocol Translation**: Convert HTTP requests to internal tool calls 4. **Response Mapping**: Transform tool responses to HTTP/SSE format --- ## Deployment Phase ### Docker Configuration ```dockerfile FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build # Support both transports EXPOSE 3000 CMD ["node", "build/http/server.js"] ``` ### Environment Variables ```bash # HTTP Transport HTTP_PORT=3000 HTTP_ENDPOINT=/mcp ENABLE_SESSIONS=true CORS_ORIGIN=* # Existing variables (unchanged) NEO4J_URI=bolt://localhost:7687 VECTOR_MODEL=sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 ``` ### Smithery Compatibility - Standard HTTP endpoint exposure - Environment-based configuration - Health check endpoint - Graceful shutdown handling --- ## Reference Implementation Links ### Official Documentation & Specs - [MCP Streamable HTTP Specification](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http) - [Official TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk) - [MCP SDK NPM Package](https://www.npmjs.com/package/@modelcontextprotocol/sdk) ### Production Examples - [Starter Template by ferrants](https://github.com/ferrants/mcp-streamable-http-typescript-server) - Clean TypeScript implementation - [Cross-language Examples](https://github.com/invariantlabs-ai/mcp-streamable-http) - Python/TypeScript compatibility - [Koyeb Deployment Guide](https://www.koyeb.com/tutorials/deploy-remote-mcp-servers-to-koyeb-using-streamable-http-transport) - Production deployment patterns - [Cloudflare Integration](https://blog.cloudflare.com/streamable-http-mcp-servers-python/) - Serverless deployment - [Java Quarkus Implementation](https://quarkus.io/blog/streamable-http-mcp/) - Alternative language reference ### Framework References - [MCP Framework HTTP Transport](https://mcp-framework.com/docs/Transports/http-stream-transport/) - Feature-rich implementation - [Framework Migration Guide](https://mcp-framework.com/docs/Transports/http-stream-transport/) - SSE to Streamable HTTP migration --- ## The Implementor's HTTP Protocol Commandments **"Single Endpoint, Single Truth"** - All communication through `/mcp` **"Session Hygiene"** - Explicit session lifecycle management **"Protocol Purity"** - JSON-RPC over HTTP, no proprietary extensions **"Zero State Leakage"** - Transport layer holds no business logic **"Error Transparency"** - HTTP status codes map to actual errors **"Backward Compatibility"** - Existing stdio transport remains untouched --- *The best transport layer is invisible to the application layer.*

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/sylweriusz/mcp-neo4j-memory-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server