Skip to main content
Glama

MCP Template

npm version License: CC BY-NC-SA 4.0

Build Status

CI Build Tests

Related MCP server: MCP Server Starter

Release Status

Release Template Sync

A TypeScript template for building MCP (Model Context Protocol) servers with automated template synchronization to downstream repositories.

Features

  • πŸš€ TypeScript with ES Modules - Modern JavaScript with full type safety

  • πŸ§ͺ Comprehensive Testing - Vitest with coverage reporting

  • πŸ”§ Code Quality - Biome for linting and formatting

  • πŸ“¦ Automated Publishing - Semantic versioning and NPM publishing

  • πŸ”„ Template Synchronization - Automatic updates to derived repositories

  • πŸ› οΈ Development Tools - Hot reload, watch mode, and CLI support

  • πŸ“‹ Git Hooks - Automated linting and commit message validation

Quick Start

Using as Template

  1. Use this template on GitHub to create your new MCP server repository

  2. Clone your new repository:

    git clone https://github.com/yourusername/your-mcp-server.git
    cd your-mcp-server
  3. Install dependencies:

    yarn install
  4. Update configuration:

    • Edit package.json with your server name and details

    • Update src/index.ts server name and version

    • Replace example tools in src/tools/ with your implementations

Development

# Start development server with hot reload
yarn dev

# Run tests
yarn test

# Run tests in watch mode
yarn test:watch

# Build the project
yarn build

# Run linting
yarn lint

# Auto-fix linting issues
yarn lint:fix

Template Structure

mcp-template/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ index.ts              # MCP server entry point
β”‚   β”œβ”€β”€ cli.ts                # CLI entry point (optional)
β”‚   β”œβ”€β”€ tools/
β”‚   β”‚   β”œβ”€β”€ example.ts        # Example tool implementation
β”‚   β”‚   β”œβ”€β”€ example.test.ts   # Example tool tests
β”‚   β”‚   └── fetch-example.ts  # HTTP fetch example tool
β”‚   └── utils/
β”‚       β”œβ”€β”€ validation.ts     # Common validation schemas
β”‚       └── fetch.ts          # HTTP utilities with caching
β”œβ”€β”€ .github/
β”‚   └── workflows/
β”‚       β”œβ”€β”€ ci.yml            # Continuous Integration
β”‚       β”œβ”€β”€ semantic-release.yml  # Automated versioning
β”‚       └── template-sync-*.yml   # Template synchronization
β”œβ”€β”€ .template-marker          # Template tracking file
β”œβ”€β”€ .template-version         # Template version tracking
└── shared/                   # Shared utilities for template sync

Writing MCP Tools

Basic Tool Example

import { z } from 'zod';
import { zodToJsonSchema } from 'zod-to-json-schema';

// Define input schema
export const MyToolSchema = z.object({
  input: z.string().describe('Input parameter'),
  count: z.number().optional().default(1).describe('Number of iterations'),
});

export type MyToolInput = z.infer<typeof MyToolSchema>;

// Export tool schema for MCP registration
export const myToolSchema = {
  name: 'my_tool',
  description: 'Description of what this tool does',
  inputSchema: zodToJsonSchema(MyToolSchema),
};

// Tool implementation
export async function myTool(input: unknown) {
  const validated = MyToolSchema.parse(input);
  
  // Your tool logic here
  const result = `Processed: ${validated.input}`;
  
  return {
    content: [
      {
        type: 'text',
        text: result,
      },
    ],
  };
}

Register Tools in MCP Server

// In src/index.ts
import { myToolSchema, myTool } from './tools/my-tool.js';

// Register in ListToolsRequestSchema handler
server.setRequestHandler(ListToolsRequestSchema, async () => ({
  tools: [
    myToolSchema,
    // ... other tools
  ],
}));

// Register in CallToolRequestSchema handler
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  const { name, arguments: args } = request.params;
  
  switch (name) {
    case 'my_tool':
      return await myTool(args);
    // ... other tools
    default:
      throw new Error(`Unknown tool: ${name}`);
  }
});

Template Synchronization

This template includes an automated synchronization system that keeps derived repositories up to date:

How It Works

  1. Template Changes: When you update the template repository

  2. Automatic Discovery: GitHub Actions discovers all repositories created from this template

  3. Sync Dispatch: Template changes are automatically synchronized to derived repos

  4. Pull Request Creation: Changes are proposed via pull requests for review

Template Marker

The .template-marker file identifies repositories created from this template:

template_repository: mcp-template
template_version: 1.0.0
created_from_template: true
sync_enabled: true

Customizing Sync Behavior

Edit .github/template-sync-config.yml to control what gets synchronized:

sync_patterns:
  - "tsconfig.json"
  - "biome.json" 
  - "vitest.config.ts"
  - ".github/workflows/**"
  - "src/utils/validation*"
  # Add patterns for files to sync

ignore_patterns:
  - "src/tools/**"  # Don't sync tool implementations
  - "README.md"     # Keep custom README
  # Add patterns for files to ignore

CI/CD Pipeline

Continuous Integration

  • Code Quality: Linting, formatting, and type checking

  • Testing: Unit tests with coverage reporting

  • Build Verification: Ensures TypeScript compiles successfully

  • Multi-Node Testing: Tests on Node.js 18, 20, and 22

Automated Release

  • Semantic Versioning: Automatic version bumping based on commit messages

  • Changelog Generation: Automatically generated from commit history

  • NPM Publishing: Automatic package publishing on release

  • GitHub Releases: Automatic GitHub release creation

Commit Message Format

Follow Conventional Commits:

feat: add new tool for data processing
fix: resolve validation error in example tool
docs: update README with usage examples
chore: update dependencies

Contributing

  1. Fork the repository

  2. Create a feature branch: git checkout -b feature/amazing-feature

  3. Commit changes: git commit -m 'feat: add amazing feature'

  4. Push to branch: git push origin feature/amazing-feature

  5. Open a Pull Request

License

This project is licensed under the CC BY-NC-SA 4.0 license.

-
security - not tested
F
license - not found
-
quality - not tested

Latest Blog Posts

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/Mearman/mcp-ai'

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