kylekanouse/Test-MCP---DEMO-MCP-Dev-1
If you are the rightful owner of Test-MCP---DEMO-MCP-Dev-1 and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.
A comprehensive boilerplate Model Context Protocol (MCP) server built with TypeScript using Domain-Driven Design patterns and dynamic component loading.
Demo MCP Server
A comprehensive boilerplate Model Context Protocol (MCP) server built with TypeScript using Domain-Driven Design patterns and dynamic component loading.
🚀 Features
- Domain-Driven Design: Clean architecture with separated concerns
- Dynamic Component Loading: File-based automatic loading of MCP components
- TypeScript: Full type safety and modern JavaScript features
- Dependency Injection: Modular and testable architecture
- Example Components: Ready-to-use tools, resources, and prompts
- Comprehensive Logging: Detailed startup and operation logging
- Graceful Shutdown: Proper cleanup and resource management
📁 Project Structure
src/
├── index.ts # Main entry point
├── types/ # Type definitions
│ └── index.ts # MCP interfaces and types
├── services/ # Business logic services
│ ├── index.ts # Services barrel export
│ └── module-loader-service.ts # Dynamic module loading
├── server/ # MCP server wrapper
│ ├── index.ts # Server barrel export
│ └── my-mcp-server.ts # Main server implementation
├── tools/ # MCP tools directory
│ ├── index.ts # Auto-loading tools
│ ├── calculator-tools.ts # Example arithmetic tools
│ └── text-processing-tools.ts # Example text tools
├── resources/ # MCP resources directory
│ ├── index.ts # Auto-loading resources
│ ├── system-info-resources.ts # System information
│ └── config-resources.ts # Configuration data
└── prompts/ # MCP prompts directory
├── index.ts # Auto-loading prompts
├── code-review-prompts.ts # Code analysis prompts
└── writing-assistance-prompts.ts # Writing help prompts
🛠️ Installation
-
Clone the repository:
git clone <repository-url> cd demo-mcp-dev-1 -
Install dependencies:
npm install -
Build the project:
npm run build
🎯 Usage
Development Mode
Run the server in development mode with hot reloading:
npm run dev
Production Mode
Build and run the server in production:
npm run build
npm start
Direct Execution
Run the compiled server directly:
node dist/index.js
🔧 Available Tools
Calculator Tools
add- Add two numberssubtract- Subtract two numbersmultiply- Multiply two numbersdivide- Divide two numbers (with zero-division protection)
Text Processing Tools
transform-text- Transform text (uppercase, lowercase, capitalize, reverse, word-count)analyze-text- Analyze text and provide detailed statistics
📚 Available Resources
System Information
system://info- System and environment informationenv://{varName}- Access environment variablesprocess://info- Node.js process information
Configuration
config://app- Application configurationsettings://{category}/{key}- Dynamic configuration settingshealth://status- Health and status information
📝 Available Prompts
Code Review Prompts
review-code- Comprehensive code review with focus areasrefactor-code- Code refactoring suggestionsdocument-code- Generate code documentation
Writing Assistance
write-email- Professional email generationwrite-technical-doc- Technical documentation creationsummarize-meeting- Meeting summary generation
🏗️ Architecture
Domain-Driven Design
The project follows DDD principles with clear separation of concerns:
- Types: Domain interfaces and contracts
- Services: Business logic and operations
- Server: Infrastructure and MCP integration
- Components: MCP-specific implementations (tools, resources, prompts)
Dynamic Component Loading
The ModuleLoaderService automatically discovers and loads MCP components:
- Scans component directories for TypeScript/JavaScript files
- Dynamically imports modules using file URLs
- Validates module contracts
- Registers components with the MCP server
Dependency Injection
The MyMCPServer class uses dependency injection patterns:
- Abstract base classes for extensibility
- Interface-based dependencies
- Configurable service injection
- Clean separation between SDK and business logic
🔌 Adding New Components
Adding a New Tool
- Create a new file in
src/tools/(e.g.,my-new-tool.ts) - Export an MCP module with the required structure:
import { z } from "zod";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import type { MCPModule } from "../types/index.js";
async function register(server: McpServer): Promise<void> {
server.registerTool(
"my-tool",
{
title: "My Tool",
description: "Description of what my tool does",
inputSchema: {
param1: z.string().describe("First parameter"),
param2: z.number().describe("Second parameter")
}
},
async ({ param1, param2 }) => ({
content: [
{
type: "text",
text: `Tool result: ${param1} - ${param2}`
}
]
})
);
}
export const myNewTool: MCPModule = {
register,
metadata: {
name: "my-new-tool",
description: "My new tool implementation",
version: "1.0.0",
author: "Your Name"
}
};
export default myNewTool;
- The tool will be automatically loaded on server startup!
Adding a New Resource
- Create a new file in
src/resources/(e.g.,my-resource.ts) - Export an MCP module following the same pattern as tools
- Use
server.registerResource()in the register function
Adding a New Prompt
- Create a new file in
src/prompts/(e.g.,my-prompt.ts) - Export an MCP module following the same pattern
- Use
server.registerPrompt()in the register function
🧪 Testing
Run the test suite:
npm test
Run linting:
npm run lint
Type checking:
npm run type-check
🔍 Debugging
The server provides comprehensive logging during startup and operation:
- Component discovery and loading
- Registration success/failure
- Server status and configuration
- Error details and stack traces
📊 Configuration
The server is configured in src/index.ts:
const serverConfig: MCPServerConfig = {
name: "demo-mcp-server",
version: "1.0.0",
capabilities: {
tools: true,
resources: true,
prompts: true,
logging: true
}
};
🤝 Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
🙏 Acknowledgments
- Built with the Model Context Protocol TypeScript SDK
- Inspired by Domain-Driven Design principles
- Thanks to the MCP community for excellent documentation and examples