Skip to main content
Glama
kylekanouse

Demo MCP Server

by kylekanouse
README.md
# 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

1. **Clone the repository:**
   ```bash
   git clone <repository-url>
   cd demo-mcp-dev-1
   ```

2. **Install dependencies:**
   ```bash
   npm install
   ```

3. **Build the project:**
   ```bash
   npm run build
   ```

## ๐ŸŽฏ Usage

### Development Mode
Run the server in development mode with hot reloading:
```bash
npm run dev
```

### Production Mode
Build and run the server in production:
```bash
npm run build
npm start
```

### Direct Execution
Run the compiled server directly:
```bash
node dist/index.js
```

## ๐Ÿ”ง Available Tools

### Calculator Tools
- `add` - Add two numbers
- `subtract` - Subtract two numbers  
- `multiply` - Multiply two numbers
- `divide` - 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 information
- `env://{varName}` - Access environment variables
- `process://info` - Node.js process information

### Configuration
- `config://app` - Application configuration
- `settings://{category}/{key}` - Dynamic configuration settings
- `health://status` - Health and status information

## ๐Ÿ“ Available Prompts

### Code Review Prompts
- `review-code` - Comprehensive code review with focus areas
- `refactor-code` - Code refactoring suggestions
- `document-code` - Generate code documentation

### Writing Assistance
- `write-email` - Professional email generation
- `write-technical-doc` - Technical documentation creation
- `summarize-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:

1. Scans component directories for TypeScript/JavaScript files
2. Dynamically imports modules using file URLs
3. Validates module contracts
4. 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

1. Create a new file in `src/tools/` (e.g., `my-new-tool.ts`)
2. Export an MCP module with the required structure:

```typescript
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;
```

3. The tool will be automatically loaded on server startup!

### Adding a New Resource

1. Create a new file in `src/resources/` (e.g., `my-resource.ts`)
2. Export an MCP module following the same pattern as tools
3. Use `server.registerResource()` in the register function

### Adding a New Prompt

1. Create a new file in `src/prompts/` (e.g., `my-prompt.ts`)
2. Export an MCP module following the same pattern
3. Use `server.registerPrompt()` in the register function

## ๐Ÿงช Testing

Run the test suite:
```bash
npm test
```

Run linting:
```bash
npm run lint
```

Type checking:
```bash
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`:

```typescript
const serverConfig: MCPServerConfig = {
  name: "demo-mcp-server",
  version: "1.0.0",
  capabilities: {
    tools: true,
    resources: true,
    prompts: true,
    logging: true
  }
};
```

## ๐Ÿค Contributing

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests if applicable
5. 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](https://github.com/modelcontextprotocol/typescript-sdk)
- Inspired by Domain-Driven Design principles
- Thanks to the MCP community for excellent documentation and examples

TDQS

B3.2/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct purpose with no overlap: mathematical operations (add, subtract, multiply, divide) are separate from text operations (analyze-text, transform-text). The descriptions reinforce this separation, making tool selection unambiguous.

Naming Consistency4/5

The naming is mostly consistent with clear verb-based patterns: mathematical tools use simple verbs (add, subtract, multiply, divide), while text tools use hyphenated verb-noun forms (analyze-text, transform-text). The minor deviation is the mix of simple verbs and hyphenated forms, but all names are readable and follow logical conventions.

Tool Count5/5

With 6 tools, the count is well-scoped for a demo server covering basic mathematical and text operations. Each tool earns its place by addressing a core function without redundancy, making the set manageable and purposeful.

Completeness4/5

The tool set covers fundamental operations in two domains: mathematics (addition, subtraction, multiplication, division) and text (analysis, transformation). A minor gap is the lack of more advanced text or math functions, but for a demo server, the coverage is sufficient for basic workflows without dead ends.

Maintenance

ActivityInactive
ResponsivenessNo issues