Skip to main content
Glama
nickweedon

Skeleton MCP Server

by nickweedon
README.md
# Skeleton MCP Server

A template project for building [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) servers. This skeleton provides a solid foundation with best practices, Docker support, and example implementations.

## Features

- FastMCP framework for easy MCP server development
- Docker and Docker Compose support for containerized deployment
- VS Code Dev Container configuration for consistent development environments
- Example CRUD API implementation to demonstrate patterns
- Test suite with pytest
- Claude Code integration with custom commands

## Quick Start

### Prerequisites

- Python 3.10 or higher
- [uv](https://github.com/astral-sh/uv) package manager (recommended)
- Docker (optional, for containerized deployment)

### Installation

1. Clone this repository and rename it for your project:

```bash
git clone <this-repo> my-mcp-server
cd my-mcp-server
```

2. Rename the package:
   - Rename `src/skeleton_mcp` to `src/your_project_name`
   - Update `pyproject.toml` with your project name and metadata
   - Update imports in all Python files

3. Install dependencies:

```bash
uv sync
```

4. Create your environment file:

```bash
cp .env.example .env
# Edit .env with your API credentials
```

5. Run the server:

```bash
uv run skeleton-mcp
```

## Project Structure

```
skeleton_mcp/
├── src/skeleton_mcp/
│   ├── __init__.py          # Package initialization
│   ├── server.py            # Main MCP server entry point
│   ├── client.py            # API client for backend communication
│   ├── types.py             # TypedDict definitions
│   ├── api/                  # API modules
│   │   ├── __init__.py
│   │   └── example.py       # Example CRUD operations
│   └── utils/               # Utility modules
│       └── __init__.py
├── tests/                   # Test suite
│   ├── conftest.py          # Pytest fixtures
│   ├── test_example_api.py  # API tests
│   └── test_server.py       # Server tests
├── docs/                    # Documentation
├── .claude/                 # Claude Code configuration
│   ├── commands/            # Custom slash commands
│   └── settings.local.json  # Permission settings
├── .devcontainer/           # VS Code dev container
├── Dockerfile               # Container image definition
├── docker-compose.yml       # Production compose file
├── docker-compose.devcontainer.yml  # Dev container compose
├── pyproject.toml           # Project configuration
├── CLAUDE.md               # Claude context documentation
└── README.md               # This file
```

## Development

### Running Tests

```bash
uv run pytest -v
```

### Linting

```bash
uv run ruff check src/ tests/
uv run ruff format src/ tests/
```

### Building

```bash
uv build
```

## Adding Your Own Tools

1. Create a new module in `src/skeleton_mcp/api/`:

```python
# src/skeleton_mcp/api/my_api.py

async def my_tool(param1: str, param2: int = 10) -> dict:
    """
    Description of what this tool does.

    Args:
        param1: Description of param1
        param2: Description of param2

    Returns:
        Description of return value
    """
    # Your implementation here
    return {"result": "success"}
```

2. Register the tool in `server.py`:

```python
from .api import my_api

mcp.tool()(my_api.my_tool)
```

3. Add types in `types.py` if needed:

```python
class MyDataType(TypedDict):
    field1: str
    field2: int
```

## Handling Large Files and Binary Data

For MCP servers that need to handle large file uploads, downloads, or binary blob storage, use the [mcp-mapped-resource-lib](https://github.com/nickweedon/mcp_mapped_resource_lib) library:

```bash
pip install mcp-mapped-resource-lib
```

This library provides:
- Blob management with unique identifiers
- Automatic TTL-based expiration and cleanup
- Content deduplication
- Security features (path traversal prevention, MIME validation)
- Docker volume integration for shared storage

See [CLAUDE.md](CLAUDE.md#handling-large-files-and-binary-data) for detailed usage examples.

## Docker Deployment

### Build and run with Docker Compose:

```bash
docker compose up --build
```

### For development with VS Code Dev Containers:

1. Open the project in VS Code
2. Install the "Dev Containers" extension
3. Click "Reopen in Container" when prompted

## Claude Desktop Integration

Add to your Claude Desktop configuration (`claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "skeleton-mcp": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "--env-file",
        "/path/to/your/.env",
        "skeleton-mcp:latest"
      ]
    }
  }
}
```

Or for local development:

```json
{
  "mcpServers": {
    "skeleton-mcp": {
      "command": "uv",
      "args": ["--directory", "/path/to/skeleton_mcp", "run", "skeleton-mcp"]
    }
  }
}
```

## Available Tools

| Tool | Description |
|------|-------------|
| `health_check` | Check server health and configuration status |
| `list_items` | List all items with filtering and pagination |
| `get_item` | Get a specific item by ID |
| `create_item` | Create a new item |
| `update_item` | Update an existing item |
| `delete_item` | Delete an item |

## Environment Variables

| Variable | Description | Default |
|----------|-------------|---------|
| `API_KEY` | Your API key for authentication | (required) |
| `API_BASE_URL` | Base URL for the backend API | `https://api.example.com/v1` |
| `API_TIMEOUT` | Request timeout in seconds | `30` |
| `DEBUG` | Enable debug logging | `false` |

## License

MIT License - See LICENSE file for details.

## Contributing

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Run tests and linting
5. Submit a pull request

TDQS

A3.7/5.0

Scored across 6 tools

Disambiguation5/5

Every tool has a clearly distinct purpose with no ambiguity. The five item-related tools (create_item, delete_item, get_item, list_items, update_item) form a complete CRUD set for a single resource type, while health_check serves a completely different operational purpose. The descriptions reinforce these distinct roles, making tool selection straightforward.

Naming Consistency5/5

All tools follow a consistent verb_noun naming pattern with snake_case throughout. The item-related tools use standard CRUD verbs (create, delete, get, list, update) followed by the resource name 'item', while health_check maintains the same pattern. There are no deviations in style or convention across the toolset.

Tool Count5/5

Six tools is perfectly appropriate for this server's purpose. The five item management tools provide complete CRUD operations with pagination and filtering, while health_check adds necessary operational functionality. This is a well-scoped set where each tool clearly earns its place without being overwhelming or insufficient.

Completeness5/5

The tool surface provides complete coverage for the item management domain with full CRUD operations (create, read, update, delete) plus listing with filtering and pagination. The health_check tool adds operational monitoring. There are no obvious gaps - agents can perform all expected lifecycle operations on items without dead ends or workarounds.

Maintenance

ActivityInactive
ResponsivenessNo issues