Skip to main content
Glama

TypeScript MCP Server Template

by dhinojosac
README.md22.7 kB
# TypeScript MCP Server Template A comprehensive **TypeScript MCP Server Template** following the [official MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk) best practices, built with **Fastify** and providing tools, resources, and prompts. **[📖 README en Español](README_ES.md)** - Para usuarios que prefieren documentación en español ## 📌 How to Use or Contribute This repository is available as both a **collaborative project** and a **template**: - **Use as a template** → Create your own MCP server project instantly by clicking [Use this template](../../generate). - **Contribute improvements** → Fork this repo, make your changes, and send a Pull Request so we can review and integrate them. We welcome: - New MCP tools, resources, and prompts - Performance optimizations - Documentation improvements - Bug fixes and code quality enhancements If you create something based on this template, please mention this repository in your README. ## 🛠️ Tech Stack & Tools Explained ### Core Technologies - **TypeScript** - Type-safe development with compile-time error checking - **Fastify** - Fast and efficient web framework for building APIs - **@modelcontextprotocol/sdk** - Official MCP Server SDK for AI model integration ### Development Tools - **Zod** - Runtime type validation and schema definition for API inputs - **@fastify/cors** - CORS support for web clients to access the API - **tsx** - Modern TypeScript execution without compilation step - **pino-pretty** - Beautiful development logging with structured output ### Code Quality Tools - **ESLint** - Static code analysis to catch errors and enforce coding standards - **Prettier** - Automatic code formatting for consistent style - **Husky** - Git hooks to run quality checks before commits - **lint-staged** - Run linters only on staged files for faster feedback ### Deployment Tools - **Docker** - Containerization for consistent deployment across environments - **Docker Compose** - Multi-container orchestration for development and production ## 📦 Project Structure ``` ts-template-mcp-server/ ├── src/ │ ├── server.ts # Main MCP server with HTTP/STDIO transport │ ├── config/ │ │ └── constants.ts # Centralized configuration constants │ ├── utils/ │ │ ├── errorHandler.ts # Centralized error handling utilities │ │ └── logger.ts # Structured logging with Pino │ ├── schemas/ │ │ ├── toolSchemas.ts # Zod schemas for MCP tool validation │ │ └── commonSchemas.ts # Reusable validation schemas │ └── plugins/ │ ├── helloPlugin.ts # Fastify plugin with REST endpoint │ └── weatherPlugin.ts # Weather tools with Zod validation ├── .github/workflows/ │ └── ci.yml # GitHub Actions CI/CD pipeline ├── client-example.js # Example client for testing MCP features ├── Dockerfile # Multi-stage Docker build configuration ├── docker-compose.yml # Docker Compose for local development ├── .dockerignore # Docker build context exclusions ├── DOCKER_TROUBLESHOOTING.md # Docker issues and solutions documentation ├── DOCKER_BEST_PRACTICES.md # Docker best practices guide ├── CHANGELOG.md # Version history and release notes ├── AI_GUIDELINES.md # AI development guidelines and conventions ├── AI_PROMPT_EXAMPLES.md # Specific prompt examples for AI assistance ├── AI_QUICK_START.md # Quick start guide for AI assistants ├── README_ES.md # Spanish documentation for non-English speakers ├── .eslintrc.json # ESLint configuration with TypeScript rules ├── .prettierrc # Prettier formatting rules ├── .husky/pre-commit # Git hook to run lint-staged ├── env.example # Environment variables template ├── tsconfig.json # TypeScript compiler configuration ├── package.json # Dependencies and npm scripts └── README.md # This comprehensive documentation ``` ## 🚀 Getting Started ### 1. Install Dependencies ```bash npm install ``` **What this does:** Installs all required dependencies including TypeScript, Fastify, MCP SDK, and development tools. ### 2. Environment Setup Copy the environment example file and configure your variables: ```bash cp env.example .env ``` **What this does:** Creates a local environment file with configuration for: - Server settings (port, host) - MCP configuration (STDIO mode, session timeout) - Logging levels and formatting - CORS settings - External API keys (weather service) ### 3. Start Development Server **HTTP Mode (for web clients):** ```bash npm run dev ``` **STDIO Mode (for CLI clients like Claude Desktop):** ```bash npm run dev:stdio ``` **Debug Mode (with detailed logging):** ```bash npm run dev:debug ``` **What each mode does:** - **HTTP Mode**: Starts server on port 3000 for web-based MCP clients - **STDIO Mode**: Runs as CLI process for desktop AI applications - **Debug Mode**: Enables verbose logging for troubleshooting ### 4. Build for Production ```bash # Clean previous build (optional) npm run clean # Compile TypeScript to JavaScript npm run build # Run the compiled server npm start ``` **What this does:** - `clean`: Removes old build artifacts - `build`: Compiles TypeScript to optimized JavaScript - `start`: Runs the production server **Production STDIO Mode:** ```bash npm run start:stdio ``` ## 🌐 Available Endpoints **HTTP Mode**: The server starts on `http://localhost:3000` with these endpoints: ### MCP Protocol Endpoints - **`POST /mcp`** - Model Context Protocol interface (handles all MCP operations) - **Purpose**: Main interface for AI models to interact with tools and resources - **Usage**: Send JSON-RPC 2.0 requests with MCP methods ### REST API Endpoints - **`GET /hello/:name`** - Traditional REST API endpoint - **Purpose**: Example of hybrid REST + MCP server - **Usage**: `curl http://localhost:3000/hello/YourName` ### Weather Plugin Endpoints - **`GET /weather/forecast?lat=40.7128&lng=-74.0060`** - Weather forecast - **Purpose**: Get weather data for specific coordinates - **Usage**: `curl "http://localhost:3000/weather/forecast?lat=40.7128&lng=-74.0060"` - **`GET /weather/alerts/:state`** - Weather alerts for US state - **Purpose**: Get weather alerts for specific US states - **Usage**: `curl http://localhost:3000/weather/alerts/CA` ### Monitoring Endpoints - **`GET /health`** - Enhanced server status with session info - **Purpose**: Health check with detailed metrics - **Usage**: `curl http://localhost:3000/health` - **`GET /info`** - Server capabilities and endpoints - **Purpose**: Discover available features - **Usage**: `curl http://localhost:3000/info` **STDIO Mode**: The server runs as a CLI process for direct integration with MCP clients like Claude Desktop. ## 🧪 Testing the Server ### Quick Health Check ```bash curl http://localhost:3000/health ``` **Expected response:** ```json { "status": "ok", "timestamp": "2025-07-25T12:00:00.000Z", "server": "ts-template-mcp-server", "version": "1.0.0", "uptime": 123.456, "sessions": 0, "capabilities": ["tools", "resources"] } ``` **What this tells you:** - Server is running and healthy - Current timestamp and uptime - Number of active MCP sessions - Available MCP capabilities ### Using the Client Example The included client example demonstrates all MCP features: ```bash node client-example.js ``` **This demonstrates:** - ✅ **Connection**: Establishing connection to MCP server - 🔧 **Tools**: Listing and calling MCP tools - 📚 **Resources**: Listing and reading MCP resources - 💭 **Prompts**: Listing and getting MCP prompts - 🚨 **Error Handling**: Proper error handling examples ## 🔧 MCP Features Explained ### 🛠️ Tools - What They Are and How to Use **Tools** are functions that AI models can call to perform actions. Each tool: - Has a name, description, and input schema - Validates inputs using Zod schemas - Returns structured results **Available Tools:** #### 1. `sayHello` Tool **Purpose**: Simple greeting tool for testing MCP communication **Input**: Person's name **Usage Example:** ```bash curl -X POST http://localhost:3000/mcp \ -H "Content-Type: application/json" \ -H "Mcp-Session-Id: test-session" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "sayHello", "arguments": { "name": "Developer" } } }' ``` #### 2. `calculate` Tool **Purpose**: Perform arithmetic operations **Input**: Operation type and two numbers **Usage Example:** ```bash curl -X POST http://localhost:3000/mcp \ -H "Content-Type: application/json" \ -H "Mcp-Session-Id: test-session" \ -d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": { "name": "calculate", "arguments": { "operation": "multiply", "a": 15, "b": 7 } } }' ``` #### 3. `getWeatherForecast` Tool **Purpose**: Get weather forecast for specific coordinates **Input**: Latitude and longitude **Usage**: Called by AI models to get weather data #### 4. `getWeatherAlerts` Tool **Purpose**: Get weather alerts for US states **Input**: US state name **Usage**: Called by AI models to get weather alerts ### 📋 Zod Validation - Why It's Important **Zod** provides runtime type validation that matches TypeScript types: ```typescript // Example: Weather forecast tool validation const WeatherForecastSchema = z.object({ latitude: z.number().min(-90).max(90), longitude: z.number().min(-180).max(180) }); // Usage in tool const { latitude, longitude } = validateToolArgs(WeatherForecastSchema, args); ``` **Benefits:** - ✅ **Type Safety**: Runtime validation matches TypeScript types - ✅ **Better Errors**: Descriptive validation error messages - ✅ **Reusability**: Common schemas can be shared across tools - ✅ **Maintainability**: Centralized validation logic ### 📚 Resources - What They Are and How to Use **Resources** are data sources that AI models can read. Each resource: - Has a URI scheme (`mcp://`, `file://`, etc.) - Contains structured data - Can be read multiple times **Available Resources:** #### 1. Server Information (`mcp://server-info`) **Purpose**: Provides server metadata and capabilities **Usage:** ```bash curl -X POST http://localhost:3000/mcp \ -H "Content-Type: application/json" \ -H "Mcp-Session-Id: test-session" \ -d '{ "jsonrpc": "2.0", "id": 3, "method": "resources/read", "params": { "uri": "mcp://server-info" } }' ``` #### 2. Hello Message (`mcp://hello-message`) **Purpose**: Example resource with greeting content **Usage:** ```bash curl -X POST http://localhost:3000/mcp \ -H "Content-Type: application/json" \ -H "Mcp-Session-Id: test-session" \ -d '{ "jsonrpc": "2.0", "id": 4, "method": "resources/read", "params": { "uri": "mcp://hello-message" } }' ``` ### 💭 Prompts - What They Are and How to Use **Prompts** are template messages that AI models can use. Each prompt: - Has a name and description - Accepts arguments for customization - Returns formatted messages **Available Prompts:** #### Greeting Prompt (`greeting-prompt`) **Purpose**: Generate personalized greetings **Usage:** ```bash curl -X POST http://localhost:3000/mcp \ -H "Content-Type: application/json" \ -H "Mcp-Session-Id: test-session" \ -d '{ "jsonrpc": "2.0", "id": 5, "method": "prompts/get", "params": { "name": "greeting-prompt", "arguments": { "name": "Alice", "style": "enthusiastic" } } }' ``` ## 🏗️ Architecture & Best Practices ### Official SDK Patterns Used This template follows the [official MCP TypeScript SDK documentation](https://github.com/modelcontextprotocol/typescript-sdk): - ✅ **Proper Request Handlers**: Using `setRequestHandler()` for all MCP operations - ✅ **Session Management**: Map-based session storage for transport instances - ✅ **Streamable HTTP Transport**: Latest transport method (not deprecated SSE) - ✅ **Standard JSON Schema**: Proper tool input schemas without Zod dependency - ✅ **Error Handling**: Comprehensive error handling with proper MCP error responses - ✅ **Resource URI Schemes**: Using `mcp://` scheme following best practices ### Key Improvements Over Basic Implementation 1. **Session Management**: Proper session tracking with cleanup 2. **Enhanced Error Handling**: Detailed error responses and logging 3. **Multiple Capabilities**: Tools, resources, AND prompts (many examples only show one) 4. **Production Ready**: Graceful shutdown, health checks, proper logging 5. **Type Safety**: Full TypeScript support without runtime schema validation overhead 6. **Code Quality**: ESLint, Prettier, and Husky for consistent code 7. **Containerization**: Docker support for easy deployment 8. **CI/CD**: GitHub Actions pipeline for automated testing ### Integration Features - **CORS**: Enhanced CORS configuration for web clients - **Logging**: Structured logging with pino-pretty for development - **Health Monitoring**: Detailed health endpoint with session metrics - **REST + MCP**: Hybrid server supporting both traditional REST and MCP protocols - **Error Handling**: Centralized error handling with custom error types - **Configuration**: Centralized configuration management ## 🔄 Git Flow Workflow This project follows **Git Flow** methodology for organized development: ### Branch Structure - **`main`** - Production-ready code - **`develop`** - Integration branch for features - **`feature/*`** - New features and improvements - **`release/*`** - Release preparation - **`hotfix/*`** - Critical production fixes ### Development Workflow ```bash # Start a new feature git flow feature start feature-name # Work on your feature... git add . git commit -m "feat: add new feature" # Finish the feature (merges to develop) git flow feature finish feature-name # Create a release git flow release start v1.1.0 # Finish release (merges to main and develop) git flow release finish v1.1.0 # Create hotfix for critical issues git flow hotfix start critical-fix git flow hotfix finish critical-fix ``` ### Commit Message Convention We follow [Conventional Commits](https://www.conventionalcommits.org/): - `feat:` - New features - `fix:` - Bug fixes - `docs:` - Documentation changes - `style:` - Code style changes (formatting, etc.) - `refactor:` - Code refactoring - `test:` - Adding or updating tests - `chore:` - Maintenance tasks ## 🔧 Development Tools Explained ### Available Scripts #### Development Scripts - `npm run dev` - Start development server with hot reload and pretty logging - **Purpose**: Main development command with live reload - **Use when**: Developing new features - `npm run dev:debug` - Start with debug logging enabled - **Purpose**: Detailed logging for troubleshooting - **Use when**: Debugging issues or understanding server behavior - `npm run dev:stdio` - Start in STDIO mode for CLI clients - **Purpose**: Run server for desktop AI applications - **Use when**: Testing with Claude Desktop or similar #### Build Scripts - `npm run build` - Compile TypeScript to JavaScript in `dist/` folder - **Purpose**: Create production-ready JavaScript files - **Use when**: Deploying to production - `npm run build:watch` - Build with watch mode - **Purpose**: Auto-rebuild when files change - **Use when**: Developing with build step - `npm start` - Run compiled server (production mode) - **Purpose**: Start production server - **Use when**: Running in production environment #### Code Quality Scripts - `npm run clean` - Remove compiled files - **Purpose**: Clean build artifacts - **Use when**: Troubleshooting build issues - `npm run lint` - Run ESLint - **Purpose**: Check code quality and style - **Use when**: Before committing code - `npm run lint:fix` - Run ESLint with auto-fix - **Purpose**: Automatically fix linting issues - **Use when**: ESLint reports fixable errors - `npm run format` - Format code with Prettier - **Purpose**: Ensure consistent code formatting - **Use when**: Code formatting is inconsistent - `npm run type-check` - Run TypeScript type checking - **Purpose**: Verify TypeScript types without building - **Use when**: Checking for type errors - `npm run validate` - Run type check and linting - **Purpose**: Comprehensive code quality check - **Use when**: Before pushing code or creating PRs #### Testing Scripts - `npm test` - Run tests (placeholder) - **Purpose**: Execute test suite - **Use when**: Verifying functionality ### Environment Requirements - **Node.js**: >=18.0.0 (for modern JavaScript features) - **TypeScript**: ^5.7.2 (for type safety) - **MCP SDK**: ^1.0.4 (for MCP protocol support) ### Adding New MCP Tools Following official SDK patterns: 1. **Add tool definition** to `tools/list` handler: ```typescript { name: "myTool", description: "My custom tool", inputSchema: { type: "object", properties: { param: { type: "string", description: "Parameter description" } }, required: ["param"] } } ``` 2. **Handle tool execution** in `tools/call` handler: ```typescript case "myTool": const { param } = args as { param: string }; return { content: [{ type: "text", text: `Result: ${param}` }] }; ``` ### Adding New Resources 1. **Add to `resources/list` handler** - Define available resources 2. **Handle reading in `resources/read` handler** - Implement resource reading logic 3. **Use proper URI schemes** (`mcp://`, `file://`, etc.) - Follow MCP conventions ### Adding Prompts 1. **Add to `prompts/list` handler** - Define available prompts 2. **Handle generation in `prompts/get` handler** - Implement prompt generation logic 3. **Return proper message format** with roles - Follow MCP prompt format ## 🐳 Docker Support ### Building the Image ```bash docker build -t ts-template-mcp-server . ``` **What this does:** - Creates a multi-stage Docker image - Optimizes for production with minimal size - Includes all necessary dependencies ### Running with Docker ```bash # Production mode docker run -p 3000:3000 ts-template-mcp-server # Development mode docker-compose up mcp-server-dev ``` **What each does:** - **Production mode**: Runs optimized container for production - **Development mode**: Runs with volume mounts for live development ### Docker Compose ```bash # Start all services docker-compose up # Start only production server docker-compose up mcp-server # Start development server docker-compose --profile dev up mcp-server-dev ``` **What this provides:** - **Multi-service orchestration**: Easy management of multiple containers - **Development profiles**: Separate configurations for dev/prod - **Volume mounts**: Live code reloading in development ### Docker Documentation For detailed information about Docker setup, troubleshooting, and best practices: - **[Docker Troubleshooting Guide](DOCKER_TROUBLESHOOTING.md)** - Common issues and solutions - **[Docker Best Practices](DOCKER_BEST_PRACTICES.md)** - Best practices for Node.js containerization **Key improvements made:** - ✅ Multi-stage builds for optimized production images - ✅ Non-root user execution for security - ✅ Proper healthcheck configuration with curl - ✅ Separate npm scripts to avoid prestart hook issues - ✅ Comprehensive .dockerignore for faster builds ## 🌐 CORS & Security Enhanced CORS configuration for MCP compatibility: - **Origin**: Flexible origin handling (`true` instead of `*`) - **Headers**: All required MCP headers plus standard web headers - **Methods**: All HTTP methods for maximum compatibility - **Session Security**: Session-based transport isolation ## 🚨 Troubleshooting ### Common Issues #### 1. Port Already in Use ```bash # Check what's using port 3000 netstat -ano | findstr :3000 # Kill the process or change port in server.ts ``` **What this fixes:** Resolves port conflicts when starting the server #### 2. TypeScript Compilation Errors ```bash # Clean and rebuild npm run clean npm run build ``` **What this fixes:** Resolves build issues caused by stale files #### 3. MCP Connection Issues - Ensure proper `Mcp-Session-Id` header - Check CORS configuration for web clients - Verify JSON-RPC 2.0 format in requests **What this fixes:** Resolves MCP protocol communication issues #### 4. STDIO Mode Not Working ```bash # Ensure proper environment variable export MCP_STDIO=true npm run dev:stdio ``` **What this fixes:** Ensures server runs in correct mode for CLI clients #### 5. Linting Errors ```bash # Auto-fix linting issues npm run lint:fix # Format code npm run format ``` **What this fixes:** Resolves code style and quality issues ### Debug Mode Enable debug logging by setting environment variable: ```bash DEBUG=mcp:* npm run dev ``` **What this provides:** Detailed logging for troubleshooting MCP issues ### Performance Monitoring The health endpoint provides real-time metrics: ```bash curl http://localhost:3000/health | jq ``` **What this shows:** Server status, uptime, active sessions, and capabilities ## 📚 Learn More - [Model Context Protocol Specification](https://modelcontextprotocol.io/) - [Official TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk) - [MCP Server Examples](https://github.com/modelcontextprotocol) - [Fastify Documentation](https://fastify.dev/) - [Git Flow Documentation](https://nvie.com/posts/a-successful-git-branching-model/) ## 📝 License MIT License - see LICENSE file for details ## 🤝 Contributing We encourage both **direct contributions** and **independent projects** based on this template. 1. **To collaborate**: - Fork the repository. - Create a feature branch using Git Flow: `git flow feature start feature-name`. - Follow the patterns from the official MCP SDK documentation. - Add tests if applicable. - Submit a Pull Request. 2. **To create your own project without linking back**: - Click [Use this template](../../generate) and start building. --- **Built following [Official MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk) best practices**

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/dhinojosac/calendar-mcp'

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