Skip to main content
Glama

Vibe-Coder MCP Server

mcp-sdk-improvements.md6.22 kB
# MCP SDK Implementation Improvements ## Overview This document outlines the improvements made to the Vibe-Coder MCP server implementation to better align with the MCP TypeScript SDK best practices and improve overall code quality, maintainability, and type safety. ## Key Improvements ### 1. Tool Handler Registry We replaced the large switch statement in the main file with a tool handler registry that maps tool names to their handler functions: ```typescript // Before (in index.ts) server.setRequestHandler(CallToolRequestSchema, async (request) => { try { switch (request.params.name) { case "start_feature_clarification": { // Implementation... } case "provide_clarification": { // Implementation... } // Many more cases... } } catch (error) { // Error handling... } }); // After // In registry.ts export class ToolRegistry { private handlers: Map<string, ToolHandler> = new Map(); register<T>(name: string, handler: ToolHandler<T>): void { this.handlers.set(name, handler); } async execute(name: string, params: any): Promise<any> { const handler = this.getHandler(name); if (!handler) { return createToolErrorResponse(`Unknown tool "${name}"`); } return await handler(params); } } // In index-updated.ts server.setRequestHandler(CallToolRequestSchema, async (request) => { try { const toolName = request.params.name; const toolArguments = request.params.arguments || {}; return await toolRegistry.execute(toolName, toolArguments); } catch (error) { // Improved error handling... } }); ``` ### 2. Robust Resource URI Handling We implemented a robust resource URI handling mechanism using a `ResourceRegistry` class: ```typescript // In registry.ts export class ResourceRegistry { private resources: ResourceRegistryEntry[] = []; register(template: ResourceTemplate, handler: ResourceHandler): void { this.resources.push({ template, handler }); } findMatch(uri: string): { handler: ResourceHandler; params: Record<string, string> } | undefined { const url = new URL(uri); for (const { template, handler } of this.resources) { const match = this.matchTemplate(url, template); if (match) { return { handler, params: match }; } } return undefined; } } // In index-updated.ts server.setRequestHandler(ReadResourceRequestSchema, async (request) => { try { const uri = request.params.uri; const match = resourceRegistry.findMatch(uri); if (match) { return await match.handler(new URL(uri), match.params); } return createErrorResponse(ErrorCode.RESOURCE_NOT_FOUND, `Resource not found: ${uri}`); } catch (error) { // Improved error handling... } }); ``` ### 3. Improved Error Handling We standardized error handling across the codebase with consistent JSON-RPC 2.0 error responses: ```typescript // In errors.ts export enum ErrorCode { // JSON-RPC 2.0 Standard Error Codes PARSE_ERROR = -32700, INVALID_REQUEST = -32600, METHOD_NOT_FOUND = -32601, INVALID_PARAMS = -32602, INTERNAL_ERROR = -32603, // Custom Error Codes VALIDATION_ERROR = -32000, RESOURCE_NOT_FOUND = -32001, // More custom error codes... } export const createErrorResponse = ( code: ErrorCode, message: string, data?: any ): ErrorResponse => { return { error: { code, message, data } }; }; export const createToolErrorResponse = ( message: string, details?: any ): ToolErrorResponse => { return { content: [{ type: "text", text: `Error: ${message}` }], isError: true }; }; ``` ### 4. Stronger Type Safety We improved type safety throughout the codebase with Zod schemas and branded types: ```typescript // In schemas.ts // Branded types for IDs export type FeatureId = string & { readonly _brand: unique symbol }; export type PhaseId = string & { readonly _brand: unique symbol }; export type TaskId = string & { readonly _brand: unique symbol }; // Zod schemas for validation export const FeatureSchema = z.object({ id: z.string().refine(isFeatureId, "Invalid feature ID format"), name: z.string().min(2).max(100), // More fields... }); // Type guards export const isFeatureId = (id: string): id is FeatureId => id.startsWith('feature-'); // ID creators export const createFeatureId = (id: string): FeatureId => { if (!isFeatureId(id)) throw new Error(`Invalid feature ID format: ${id}`); return id as FeatureId; }; // In utils.ts export function generateFeatureId(): FeatureId { const randomPart = Math.random().toString(36).substring(2, 10); return createFeatureId(`feature-${randomPart}`); } ``` ### 5. Modular Code Structure We reorganized the codebase into more modular components with clear separation of concerns: - `registry.ts` - Tool and resource registries - `tool-handlers.ts` - Tool handler implementations - `resource-handlers.ts` - Resource handler implementations - `errors.ts` - Error handling utilities - `schemas.ts` - Type definitions and validation schemas ## Benefits 1. **Improved Maintainability**: The modular code structure makes it easier to understand, maintain, and extend the codebase. 2. **Better Type Safety**: Branded types and Zod schemas provide stronger type checking and runtime validation. 3. **Consistent Error Handling**: Standardized error responses across the codebase with proper JSON-RPC 2.0 error codes. 4. **More Robust URI Handling**: Proper URI template matching for resources following MCP best practices. 5. **Cleaner Code**: Separation of concerns between different components and elimination of large switch statements. ## Testing The improvements have been tested with a comprehensive test script (`test-mcp-improved.js`) that verifies the functionality of: - Tool registration and execution - Resource URI matching and handling - Error reporting - End-to-end workflows (feature clarification, PRD generation, etc.) ## Conclusion These improvements bring the Vibe-Coder MCP server implementation more in line with MCP TypeScript SDK best practices while also improving overall code quality, maintainability, and type safety.

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/crazyrabbitLTC/mcp-vibecoder'

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