Skip to main content
Glama
MCP_SERVER_CODE_REVIEW.mdโ€ข24.7 kB
# Comprehensive MCP Server Code Review **Tailwind-Svelte-Assistant MCP Server** ## Executive Summary This comprehensive code review analyzes the Tailwind-Svelte-Assistant MCP server across architecture, security, performance, and best practices. The server provides SvelteKit and Tailwind CSS documentation through the Model Context Protocol. **Overall Assessment: โš ๏ธ NEEDS IMPROVEMENT** - **Security Risk Level**: Medium-High (Path traversal vulnerabilities) - **Code Quality**: Below Standard (Mixed TypeScript implementation) - **Performance**: Suboptimal (No caching, synchronous operations) - **Maintainability**: Poor (Monolithic structure) --- ## 1. ๐Ÿ—๏ธ Architecture and Design Patterns ### Current Architecture - **Pattern**: Monolithic single-file architecture - **Transport**: StdioServerTransport for CLI communication - **Content Strategy**: Direct file system access - **API Design**: 7 tool-based endpoints ### Strengths โœ… - Clean MCP protocol compliance via `@modelcontextprotocol/sdk` - Logical separation between content types (docs, snippets) - Consistent tool naming conventions - Proper TypeScript compilation setup ### Critical Issues โŒ - **Single Point of Failure**: Entire server logic in [`src/index.ts:1-226`](src/index.ts:1) - **No Modularity**: Request handlers, utilities, and server initialization mixed - **Tight Coupling**: File structure directly maps to API endpoints - **No Abstraction Layer**: Direct file system calls throughout ### Recommendations ๐Ÿ”ง 1. **Modularize Architecture**: Split into separate modules (handlers, services, utils) 2. **Implement Service Layer**: Abstract file operations behind service interfaces 3. **Add Configuration Management**: Externalize paths and settings 4. **Create Plugin System**: Allow dynamic tool registration --- ## 2. ๐Ÿ’ป Code Quality and TypeScript Implementation ### Current State Analysis **Critical TypeScript Issues:** ```typescript // โŒ Mixed CommonJS/ES6 patterns (Lines 4-12) const { Server } = require("@modelcontextprotocol/sdk/server/index.js"); // โŒ Extensive 'any' usage compromises type safety async function listDirectoryContents(dirPath: string, fileExtension?: string): Promise<any> server.setRequestHandler(CallToolRequestSchema, async (request: any) => { ``` **Code Quality Issues:** - **Type Safety**: 15+ instances of `any` type usage - **Import Inconsistency**: `require()` mixed with TypeScript imports - **Missing Interfaces**: No type definitions for request/response objects - **No Type Guards**: Runtime type checking absent ### Severity Assessment - **HIGH**: Type safety compromised by extensive `any` usage - **MEDIUM**: Import inconsistencies affect build reliability - **MEDIUM**: Missing interfaces reduce IDE support and maintainability ### Recommendations ๐Ÿ”ง ```typescript // โœ… Proper TypeScript implementation interface ToolRequest { params: { name: string; arguments: Record<string, unknown>; }; } interface ContentResponse { content: Array<{ type: "text"; text: string }>; } // โœ… Use proper imports import { Server } from "@modelcontextprotocol/sdk/server/index.js"; ``` --- ## 3. ๐Ÿ›ก๏ธ Security Considerations and Input Validation ### Critical Security Vulnerabilities **Path Traversal Vulnerability (HIGH RISK):** ```typescript // โŒ Lines 155, 165, 175 - No path sanitization filePath = path.join(SVELTEKIT_DOCS_PATH, `${args.topic}.md`); filePath = path.join(TAILWIND_DOCS_PATH, `${args.query}.md`); filePath = path.join(SNIPPETS_PATH, args.component_category, `${args.snippet_name}.svelte`); ``` **Attack Vectors:** - `../../../etc/passwd` in topic parameter - Directory traversal via `component_category` - Arbitrary file access through malicious inputs **Input Validation Gaps:** ```typescript // โŒ Minimal validation (Lines 152-154) if (!args || typeof args.topic !== 'string') { throw new McpError(ErrorCode.InvalidParams, "Missing or invalid 'topic' argument."); } // Missing: path sanitization, length limits, character validation ``` ### Current Security Measures โœ… - Basic type checking for required parameters - MCP error handling for invalid requests - Docker containerization limits system access ### Recommendations ๐Ÿ”ง ```typescript // โœ… Implement proper path sanitization function sanitizePath(input: string): string { return path.normalize(input).replace(/^(\.\.[\/\\])+/, ''); } // โœ… Add comprehensive validation function validateToolInput(toolName: string, args: any): void { const validators = { get_sveltekit_doc: (args: any) => { if (!args?.topic || typeof args.topic !== 'string') { throw new McpError(ErrorCode.InvalidParams, "Invalid topic"); } if (args.topic.length > 100 || !/^[a-zA-Z0-9\-_]+$/.test(args.topic)) { throw new McpError(ErrorCode.InvalidParams, "Invalid topic format"); } } }; } ``` --- ## 4. ๐Ÿš€ Performance and Scalability ### Performance Issues **File System Operations:** - **No Caching**: Every request reads from disk (Lines 157, 167, 177) - **Synchronous Operations**: Blocking file reads affect throughput - **No Connection Pooling**: Each request creates new file handles - **Memory Usage**: Full file content loaded for each request **Scalability Concerns:** - **Single Thread**: No async optimization for concurrent requests - **Resource Limits**: No rate limiting or request queuing - **Memory Growth**: No garbage collection optimization ### Performance Metrics (Estimated) - **Cold Start**: ~50-100ms per file read - **Memory per Request**: 10KB-1MB depending on content size - **Concurrent Request Limit**: ~10-20 before performance degradation ### Recommendations ๐Ÿ”ง ```typescript // โœ… Implement content caching class ContentCache { private cache = new Map<string, { content: string; lastModified: number }>(); async getContent(filePath: string): Promise<string> { const stats = await fs.stat(filePath); const cached = this.cache.get(filePath); if (cached && cached.lastModified >= stats.mtime.getTime()) { return cached.content; } const content = await fs.readFile(filePath, 'utf-8'); this.cache.set(filePath, { content, lastModified: stats.mtime.getTime() }); return content; } } ``` --- ## 5. ๐Ÿ” Error Handling and Robustness ### Current Error Handling Analysis **Positive Aspects:** ```typescript // โœ… Proper MCP error usage (Lines 203-204) if (error.code === 'ENOENT') { throw new McpError(ErrorCode.InvalidRequest, `Content not found...`); } ``` **Critical Issues:** ```typescript // โŒ Generic error handling loses important context (Lines 140-141) console.error(`Error listing directory ${dirPath}:`, error); return { type: "text", text: "" }; // Silent failure ``` **Error Handling Gaps:** - **Silent Failures**: `listDirectoryContents` returns empty string on errors - **Information Leakage**: File paths exposed in error messages (Line 204) - **No Error Classification**: All file system errors treated identically - **Missing Logging**: No structured error logging for debugging ### Error Categories 1. **File System Errors**: ENOENT, EACCES, EMFILE 2. **Validation Errors**: Invalid parameters, malformed input 3. **Protocol Errors**: MCP communication failures 4. **System Errors**: Memory, disk space, permissions ### Recommendations ๐Ÿ”ง ```typescript // โœ… Structured error handling class ErrorHandler { static handleFileSystemError(error: any, operation: string, path?: string): never { switch (error.code) { case 'ENOENT': throw new McpError(ErrorCode.InvalidRequest, `Resource not found`); case 'EACCES': throw new McpError(ErrorCode.InternalError, `Access denied`); case 'EMFILE': throw new McpError(ErrorCode.InternalError, `Too many open files`); default: console.error(`FileSystem error in ${operation}:`, error); throw new McpError(ErrorCode.InternalError, `Operation failed`); } } } ``` --- ## 6. ๐Ÿ“ File System Operations and Path Handling ### Current Implementation Issues **Path Construction Vulnerabilities:** ```typescript // โŒ Unsafe path joining (Lines 155, 165, 175) filePath = path.join(SVELTEKIT_DOCS_PATH, `${args.topic}.md`); // Vulnerable to: "../../../sensitive-file.md" ``` **Directory Traversal Risks:** - No bounds checking for content directories - No validation of resolved paths - Missing path normalization **File Access Patterns:** - Direct file system access without abstraction - No file handle management - Missing file existence checks before operations ### Security Best Practices Violations - **Principle of Least Privilege**: Server has broad file system access - **Input Sanitization**: User input directly used in path construction - **Defense in Depth**: Single validation layer ### Recommendations ๐Ÿ”ง ```typescript // โœ… Secure path handling class SecureFileHandler { private readonly allowedPaths: Set<string>; constructor(basePaths: string[]) { this.allowedPaths = new Set(basePaths.map(p => path.resolve(p))); } async readSecure(basePath: string, userPath: string): Promise<string> { // Sanitize and normalize const sanitized = userPath.replace(/[^a-zA-Z0-9\-_.]/g, ''); const fullPath = path.resolve(path.join(basePath, sanitized)); // Verify path is within allowed directory if (!this.isAllowedPath(fullPath, basePath)) { throw new McpError(ErrorCode.InvalidParams, "Invalid file path"); } return fs.readFile(fullPath, 'utf-8'); } private isAllowedPath(requestedPath: string, basePath: string): boolean { return requestedPath.startsWith(path.resolve(basePath)); } } ``` --- ## 7. ๐Ÿ“Š Logging and Debugging ### Current Logging Analysis **Debug Logging Issues:** ```typescript // โŒ Debug logs to stderr in production (Lines 156, 166, 176) console.error(`[tailwind-svelte-assistant] Attempting to read SvelteKit doc from: ${filePath}`); ``` **Logging Problems:** - **Inconsistent Levels**: Mix of debug and error logging - **No Structure**: Plain text logs without context - **Information Exposure**: File paths logged in production - **No Log Rotation**: Unlimited log accumulation - **Missing Correlation IDs**: No request tracing **Positive Aspects:** - Server startup/shutdown logging (Lines 215, 220) - Error context preservation in some cases ### Logging Requirements 1. **Structured Logging**: JSON format with metadata 2. **Log Levels**: DEBUG, INFO, WARN, ERROR with filtering 3. **Request Correlation**: Track requests through system 4. **Security Logging**: Access attempts and failures 5. **Performance Metrics**: Response times and resource usage ### Recommendations ๐Ÿ”ง ```typescript // โœ… Structured logging implementation import winston from 'winston'; const logger = winston.createLogger({ level: process.env.LOG_LEVEL || 'info', format: winston.format.combine( winston.format.timestamp(), winston.format.errors({ stack: true }), winston.format.json() ), transports: [ new winston.transports.Console({ format: winston.format.simple() }) ] }); // Usage logger.info('Tool request received', { tool: request.params.name, correlationId: generateId(), timestamp: new Date().toISOString() }); ``` --- ## 8. ๐Ÿณ Docker Configuration and Deployment ### Docker Analysis **Current Dockerfile Strengths:** - **Multi-stage build** reduces image size (Lines 2, 21) - **Alpine Linux** for security and size optimization - **Production dependencies only** in final image (Line 29) - **Proper layer caching** with package.json copying (Lines 7, 26) **Security Considerations:** ```dockerfile # โœ… Good: Non-root user implied by node:18-alpine # โœ… Good: Minimal attack surface with Alpine # โœ… Good: Production dependencies only ``` **Build Process Issues:** ```dockerfile # โŒ Line 17: Comment mentions 'build' but creates 'dist' # Build the application (runs tsc and creates the 'build' directory) RUN npm run build ``` **Missing Security Hardening:** - No explicit non-root user creation - No file permission restrictions - Missing health check endpoint - No resource limits specified ### Deployment Concerns - **Container Orchestration**: No Kubernetes/Docker Compose configs - **Monitoring**: No health check or metrics endpoints - **Scaling**: No horizontal scaling considerations - **Configuration**: Hardcoded paths in container ### Recommendations ๐Ÿ”ง ```dockerfile # โœ… Enhanced Dockerfile FROM node:18-alpine AS builder WORKDIR /usr/src/app # Create non-root user RUN addgroup -g 1001 -S nodejs && \ adduser -S nodejs -u 1001 # ... build steps ... FROM node:18-alpine AS release WORKDIR /usr/src/app # Copy user from builder stage COPY --from=builder /etc/passwd /etc/passwd COPY --from=builder /etc/group /etc/group # Set proper ownership RUN chown -R nodejs:nodejs /usr/src/app USER nodejs # Add health check HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD node -e "console.log('Health check passed')" || exit 1 CMD ["node", "dist/index.js"] ``` --- ## 9. ๐Ÿ“‹ Project Structure and Organization ### Current Structure Assessment ``` ๐Ÿ“ Project Root โ”œโ”€โ”€ ๐Ÿ“„ src/index.ts (226 lines - MONOLITHIC) โ”œโ”€โ”€ ๐Ÿ“„ package.json โ”œโ”€โ”€ ๐Ÿ“„ tsconfig.json โ”œโ”€โ”€ ๐Ÿ“„ Dockerfile โ”œโ”€โ”€ ๐Ÿ“ content/ (Documentation & Snippets) โ”œโ”€โ”€ ๐Ÿ“ scripts/ (Scraping utilities) โ””โ”€โ”€ ๐Ÿ“ catalyst-ui-kit/ (UI components - UNUSED?) ``` **Structural Issues:** - **Monolithic Main File**: All logic in single 226-line file - **Mixed Concerns**: Server, handlers, utilities combined - **No Service Layer**: Direct file system access throughout - **Unused Dependencies**: Several packages not referenced in main code - **No Test Structure**: Missing test directories and files **Positive Aspects:** - Logical content organization (`docs/`, `snippets/`) - Clear TypeScript configuration - Proper Docker containerization setup ### Recommended Structure ``` ๐Ÿ“ src/ โ”œโ”€โ”€ ๐Ÿ“„ index.ts (Server initialization only) โ”œโ”€โ”€ ๐Ÿ“ handlers/ โ”‚ โ”œโ”€โ”€ ๐Ÿ“„ sveltekit.handler.ts โ”‚ โ”œโ”€โ”€ ๐Ÿ“„ tailwind.handler.ts โ”‚ โ””โ”€โ”€ ๐Ÿ“„ snippets.handler.ts โ”œโ”€โ”€ ๐Ÿ“ services/ โ”‚ โ”œโ”€โ”€ ๐Ÿ“„ content.service.ts โ”‚ โ”œโ”€โ”€ ๐Ÿ“„ file.service.ts โ”‚ โ””โ”€โ”€ ๐Ÿ“„ cache.service.ts โ”œโ”€โ”€ ๐Ÿ“ utils/ โ”‚ โ”œโ”€โ”€ ๐Ÿ“„ path.validator.ts โ”‚ โ”œโ”€โ”€ ๐Ÿ“„ error.handler.ts โ”‚ โ””โ”€โ”€ ๐Ÿ“„ logger.ts โ”œโ”€โ”€ ๐Ÿ“ types/ โ”‚ โ””โ”€โ”€ ๐Ÿ“„ index.ts โ””โ”€โ”€ ๐Ÿ“ __tests__/ โ”œโ”€โ”€ ๐Ÿ“„ handlers.test.ts โ””โ”€โ”€ ๐Ÿ“„ services.test.ts ``` --- ## 10. ๐Ÿ“ฆ Dependency Management and Versions ### Current Dependencies Analysis **Production Dependencies:** ```json { "@modelcontextprotocol/sdk": "0.6.0", // โœ… Latest MCP SDK "axios": "^1.6.0", // โ“ Used only in scripts "cheerio": "^1.0.0-rc.12", // โ“ Used only in scripts "clsx": "^2.1.1", // โŒ Not used in main server "turndown": "^7.1.0" // โ“ Used only in scripts } ``` **Development Dependencies:** ```json { "@types/cheerio": "^0.22.35", // โœ… Matches cheerio version "@types/node": "^20.11.24", // โœ… Current LTS types "@types/turndown": "^5.0.4", // โœ… Matches turndown version "typescript": "^5.3.3" // โœ… Modern TypeScript version } ``` **Issues Identified:** 1. **Unused Dependencies**: `clsx` not referenced in server code 2. **Script Dependencies**: `axios`, `cheerio`, `turndown` used only in scripts 3. **Version Mismatches**: Node.js 18 in Docker but @types/node 20 4. **Missing Dependencies**: No logging, validation, or caching libraries **Security Analysis:** - โœ… Recent versions of most packages - โ“ No security audit apparent - โ“ No dependency vulnerability scanning ### Recommendations ๐Ÿ”ง ```json { "dependencies": { "@modelcontextprotocol/sdk": "0.6.0", "winston": "^3.10.0", "joi": "^17.9.0", "lru-cache": "^10.0.0" }, "devDependencies": { "@types/node": "^18.17.0", "typescript": "^5.3.3", "jest": "^29.6.0", "@types/jest": "^29.5.0", "eslint": "^8.45.0", "@typescript-eslint/eslint-plugin": "^6.0.0" }, "scripts": { "security-audit": "npm audit --audit-level=moderate", "outdated-check": "npm outdated" } } ``` --- ## 11. ๐Ÿ› ๏ธ Tool Definitions and API Design ### Current Tool Implementation **Available Tools:** 1. `get_sveltekit_doc` - Retrieve SvelteKit documentation 2. `get_tailwind_info` - Get Tailwind CSS information 3. `get_component_snippet` - Fetch Svelte component code 4. `list_sveltekit_topics` - List available SvelteKit docs 5. `list_tailwind_info_topics` - List Tailwind documentation 6. `list_snippet_categories` - List component categories 7. `list_snippets_in_category` - List snippets in category **API Design Strengths:** - **Consistent Naming**: Clear, descriptive tool names - **Logical Grouping**: Separate tools for docs vs. snippets - **Proper Schemas**: JSON Schema validation for inputs - **Standard Responses**: Consistent response format **API Design Issues:** - **No Versioning**: No API version management - **Limited Metadata**: No content metadata (size, modified date) - **No Pagination**: Large directories could cause issues - **Missing Search**: No full-text search capability - **No Filtering**: No ability to filter results ### Schema Analysis ```typescript // โœ… Good: Clear parameter definition inputSchema: { type: "object", properties: { topic: { type: "string", description: "The documentation topic (e.g., 'routing', 'hooks')" } }, required: ["topic"] } ``` **Missing Schema Features:** - Pattern validation (regex) - Length constraints - Enum values for known topics - Response schema definitions ### Recommendations ๐Ÿ”ง ```typescript // โœ… Enhanced tool schema { name: "get_sveltekit_doc", description: "Get SvelteKit documentation for a specific topic.", inputSchema: { type: "object", properties: { topic: { type: "string", description: "The documentation topic", pattern: "^[a-zA-Z0-9\\-_]+$", minLength: 1, maxLength: 50, examples: ["routing", "hooks", "load", "form-actions"] }, format: { type: "string", enum: ["markdown", "text", "json"], default: "markdown", description: "Response format" } }, required: ["topic"] } } ``` --- ## 12. ๐Ÿ“š Documentation and Maintainability ### Current Documentation State **Existing Documentation:** - โœ… Basic package.json description - โœ… Inline code comments (minimal) - โœ… Tool descriptions in schema - โŒ No README.md file - โŒ No API documentation - โŒ No deployment guide - โŒ No contribution guidelines **Code Documentation Issues:** ```typescript // โŒ Minimal function documentation async function listDirectoryContents(dirPath: string, fileExtension?: string): Promise<any> { // No JSDoc comments explaining parameters, return values, or errors } ``` **Maintainability Concerns:** 1. **Knowledge Silos**: Single file contains all logic 2. **No Type Documentation**: Missing interface documentation 3. **No Error Catalog**: Undocumented error conditions 4. **No Performance Metrics**: No benchmarking or profiling 5. **No Change Log**: No version history tracking ### Missing Documentation - **README.md**: Project overview, setup, usage - **API.md**: Detailed tool documentation - **DEPLOYMENT.md**: Docker and production setup - **CONTRIBUTING.md**: Development guidelines - **CHANGELOG.md**: Version history - **SECURITY.md**: Security policies and reporting ### Recommendations ๐Ÿ”ง ```typescript /** * Retrieves and serves content from the file system with proper error handling * and security validation. * * @param dirPath - Base directory path to search in * @param fileExtension - Optional file extension filter (e.g., '.md') * @returns Promise resolving to formatted content list * @throws {McpError} When directory access fails or path is invalid * * @example * ```typescript * const topics = await listDirectoryContents('/docs/sveltekit', '.md'); * console.log(topics); // { type: "text", text: "routing\nhooks\nload" } * ``` */ async function listDirectoryContents( dirPath: string, fileExtension?: string ): Promise<ContentResponse> { // Implementation with proper error handling } ``` --- ## 13. ๐ŸŽฏ Critical Issues Summary ### High Priority (Fix Immediately) 1. **๐Ÿšจ Path Traversal Vulnerability** - **Risk**: Remote file access, data breach - **Location**: Lines 155, 165, 175 in [`src/index.ts`](src/index.ts:155) - **Fix**: Implement path sanitization and validation 2. **๐Ÿšจ Type Safety Compromised** - **Risk**: Runtime errors, maintenance issues - **Location**: Throughout [`src/index.ts`](src/index.ts:1) - **Fix**: Replace `any` types with proper interfaces 3. **๐Ÿšจ Production Debug Logging** - **Risk**: Information disclosure, performance impact - **Location**: Lines 156, 166, 176 - **Fix**: Implement proper logging framework ### Medium Priority (Plan for Next Release) 4. **โš ๏ธ No Caching Mechanism** - **Impact**: Poor performance, high I/O - **Fix**: Implement content caching layer 5. **โš ๏ธ Monolithic Architecture** - **Impact**: Poor maintainability, testing difficulty - **Fix**: Modularize into separate services 6. **โš ๏ธ Missing Error Handling** - **Impact**: Poor user experience, debugging difficulty - **Fix**: Implement comprehensive error handling ### Low Priority (Future Improvements) 7. **๐Ÿ“‹ Missing Tests** - **Impact**: Quality assurance, regression prevention - **Fix**: Add unit and integration tests 8. **๐Ÿ“‹ No Documentation** - **Impact**: Onboarding difficulty, maintenance overhead - **Fix**: Create comprehensive documentation --- ## 14. ๐ŸŽฏ Recommended Action Plan ### Phase 1: Critical Security Fixes (Week 1) ```typescript // 1. Implement path sanitization function sanitizeAndValidatePath(userInput: string): string { const sanitized = path.normalize(userInput).replace(/^(\.\.[\/\\])+/, ''); if (sanitized.includes('..') || sanitized.includes('/') || sanitized.includes('\\')) { throw new McpError(ErrorCode.InvalidParams, "Invalid path format"); } return sanitized; } // 2. Add input validation function validateToolParameters(toolName: string, args: any): void { // Comprehensive validation logic } // 3. Fix TypeScript types interface ToolRequest { params: { name: string; arguments: Record<string, unknown>; }; } ``` ### Phase 2: Architecture Refactoring (Week 2-3) 1. **Split monolithic file** into modules 2. **Implement service layer** for file operations 3. **Add proper error handling** throughout 4. **Implement structured logging** ### Phase 3: Performance and Features (Week 4) 1. **Add content caching** with LRU cache 2. **Implement request validation** middleware 3. **Add health check** endpoints 4. **Create comprehensive tests** ### Phase 4: Documentation and DevOps (Week 5) 1. **Write comprehensive documentation** 2. **Add CI/CD pipeline** with security scanning 3. **Implement monitoring** and metrics 4. **Create deployment guides** --- ## ๐Ÿ“Š Risk Assessment Matrix | Risk Category | Current Level | Post-Fix Level | Priority | |------|------|------|------| | **Path Traversal** | ๐Ÿ”ด Critical | ๐ŸŸข Low | P0 | | **Type Safety** | ๐ŸŸก Medium | ๐ŸŸข Low | P1 | | **Information Disclosure** | ๐ŸŸก Medium | ๐ŸŸข Low | P1 | | **Performance** | ๐ŸŸก Medium | ๐ŸŸข Low | P2 | | **Maintainability** | ๐ŸŸก Medium | ๐ŸŸข Low | P2 | | **Scalability** | ๐ŸŸก Medium | ๐ŸŸข Low | P3 | --- ## โœ… Conclusion The Tailwind-Svelte-Assistant MCP server provides valuable functionality but requires significant security and architectural improvements. The **path traversal vulnerability** poses the highest risk and should be addressed immediately. **Key Strengths:** - Solid MCP protocol implementation - Clean Docker containerization - Logical content organization - Functional tool-based API **Critical Improvements Needed:** - Security hardening (input validation, path sanitization) - Architecture modularization - Performance optimization (caching, async operations) - Comprehensive error handling and logging **Estimated Effort:** 3-4 weeks for complete remediation **ROI:** High - Transforms from prototype to production-ready service The server has good foundational architecture but needs systematic hardening across security, performance, and maintainability dimensions to be production-ready.

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/CaullenOmdahl/Tailwind-Svelte-Assistant'

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