Skip to main content
Glama

@jpisnice/shadcn-ui-mcp-server

by Jpisnice
SSE_IMPLEMENTATION.md6.29 kB
# SSE (Server-Sent Events) Implementation Guide ## Overview This document describes the SSE extension added to the shadcn-ui-mcp-server, enabling multi-client real-time connections through HTTP/SSE transport alongside the existing stdio transport. ## Architecture ### Key Components 1. **SSETransportManager** (`src/server/sse.ts`) - Manages Express.js server for HTTP endpoints - Handles SSE connections and session management - Provides health check and monitoring endpoints - Implements CORS and security measures 2. **TransportManager** (`src/server/transport.ts`) - Orchestrates dual transport support (stdio + SSE) - Handles transport mode selection and initialization - Manages graceful shutdown of all transports 3. **Updated CLI Arguments** (`src/cli/args.ts`) - Added support for `--mode`, `--port`, `--host`, `--cors` options - Environment variable support for configuration ## Transport Modes ### 1. stdio (Default) ```bash node build/index.js --mode stdio # or node build/index.js # default mode ``` ### 2. sse (Server-Sent Events) ```bash node build/index.js --mode sse --port 7423 --host 0.0.0.0 ``` ### 3. dual (Both stdio and SSE) ```bash node build/index.js --mode dual --port 7423 ``` ## Docker Compose Deployment ### Quick Start ```bash # Build and start the container docker-compose up --build -d # Check health curl http://localhost:7423/health # Test SSE connection curl -N -H "Accept: text/event-stream" http://localhost:7423/sse ``` ### Environment Variables - `MCP_TRANSPORT_MODE`: Transport mode (stdio|sse|dual) - `MCP_PORT`: Port for SSE server (default: 7423) - SHADCN on phone keypad (7-4-2-3) - `MCP_HOST`: Host binding (default: 0.0.0.0) - `MCP_CORS_ORIGINS`: CORS origins (comma-separated) - `GITHUB_PERSONAL_ACCESS_TOKEN`: GitHub API token ## API Endpoints ### Health Check ```http GET /health ``` Response: ```json { "status": "healthy", "timestamp": "2025-09-22T13:10:00.000Z", "activeConnections": 2, "serverInfo": { "name": "shadcn-ui-mcp-server", "version": "1.0.3" } } ``` ### SSE Connection ```http GET /sse Accept: text/event-stream ``` Response: ``` event: endpoint data: /message?sessionId=uuid-here ``` ### Connection Status ```http GET /connections ``` Response: ```json { "total": 2, "connections": ["session-id-1", "session-id-2"] } ``` ### MCP Message Handling ```http POST /message Content-Type: application/json X-MCP-Session-ID: session-id { "jsonrpc": "2.0", "method": "tools/list", "params": {}, "id": 1 } ``` ## Security Features 1. **CORS Configuration**: Configurable origins via `--cors` or `MCP_CORS_ORIGINS` 2. **DNS Rebinding Protection**: Optional protection against DNS rebinding attacks 3. **Session Management**: UUID-based session tracking 4. **Request Validation**: Input validation and sanitization 5. **Non-root Container**: Docker container runs as non-root user ## File Structure ``` src/ ├── server/ │ ├── sse.ts # SSE transport manager │ ├── transport.ts # Multi-transport orchestration │ ├── index.ts # Updated main server entry │ └── createServer.ts # Server factory ├── cli/ │ └── args.ts # Enhanced CLI argument parsing Dockerfile # Production container docker-compose.yml # Orchestration configuration nginx.conf # Optional reverse proxy ``` ## Testing ### Manual Testing ```bash # Start server in SSE mode node build/index.js --mode sse --port 3001 # Test multiple connections curl -N -H "Accept: text/event-stream" http://localhost:3001/sse & curl -N -H "Accept: text/event-stream" http://localhost:3001/sse & # Check connection count curl http://localhost:3001/connections ``` ### Docker Testing ```bash # Start with Docker Compose docker-compose up -d # Test health curl http://localhost:3001/health # Test SSE curl -N -H "Accept: text/event-stream" http://localhost:3001/sse # View logs docker logs shadcn-mcp-server ``` ## Production Deployment ### With Nginx Proxy ```bash # Start with nginx proxy docker-compose --profile production up -d ``` ### Health Checks - Container health check: `/health` endpoint every 30s - Kubernetes readiness: `GET /health` returns 200 - Load balancer: Use `/health` for backend checks ## Migration from stdio The implementation maintains full backwards compatibility: 1. **Default Behavior**: stdio mode remains the default 2. **Existing Scripts**: No changes needed for existing stdio usage 3. **Environment Detection**: Dual mode automatically detects stdio availability ## Configuration Examples ### Development ```bash export MCP_TRANSPORT_MODE=sse export MCP_PORT=3001 export MCP_CORS_ORIGINS="http://localhost:3000,http://localhost:8080" node build/index.js ``` ### Production ```yaml # docker-compose.override.yml services: shadcn-mcp-server: environment: - MCP_TRANSPORT_MODE=sse - MCP_CORS_ORIGINS=https://myapp.com - GITHUB_PERSONAL_ACCESS_TOKEN=${GITHUB_TOKEN} deploy: replicas: 3 ``` ## Troubleshooting ### Common Issues 1. **Port conflicts**: Use `--port` or `MCP_PORT` to change port 2. **CORS errors**: Configure `--cors` or `MCP_CORS_ORIGINS` 3. **Connection drops**: Check container resources and health checks 4. **Build failures**: Ensure dev dependencies are available during build ### Logs ```bash # Docker logs docker logs shadcn-mcp-server -f # Local server node build/index.js --mode sse 2>&1 | grep -E "(ERROR|WARN|INFO)" ``` ## Performance ### Benchmarks - **Memory**: ~50MB base + ~1MB per active connection - **CPU**: Minimal overhead, scales with request volume - **Connections**: Tested with 100+ concurrent SSE connections - **Latency**: <10ms local, <50ms over network ### Scaling - Horizontal: Multiple container instances behind load balancer - Vertical: Container resource limits in docker-compose.yml - Session Affinity: Required for SSE connections (sticky sessions) ## Future Enhancements 1. **Authentication**: JWT/Bearer token support 2. **Rate Limiting**: Per-client request throttling 3. **Metrics**: Prometheus/OpenTelemetry integration 4. **Clustering**: Redis-based session management 5. **WebSocket**: Alternative to SSE for bidirectional communication

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/Jpisnice/shadcn-ui-mcp-server'

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