Skip to main content
Glama
tim-akkio

MCP Server Framework

by tim-akkio
README.md
# MCP Server Framework

A general-purpose Model Context Protocol (MCP) server that provides tools for Claude Code and Claude Desktop.

## Quick Start

```bash
# Install dependencies
cd mcp-server
pip install -r requirements.txt

# Test the server runs (Ctrl+C to stop)
PYTHONPATH=src python -m mcp_server.server
```

## Project Structure

```
mcp-server/
├── src/mcp_server/
│   ├── server.py          # Main FastMCP server
│   ├── config.py          # Environment-based configuration
│   └── tools/
│       ├── __init__.py    # Tool registry
│       ├── echo_tool.py   # Example: basic echo tools
│       ├── datetime_tool.py  # Example: date/time utilities
│       └── file_tool.py   # Example: file operations
├── configs/               # Client configuration templates
└── requirements.txt
```

## Configuration

The server is configured via environment variables:

| Variable | Description | Default |
|----------|-------------|---------|
| `MCP_SERVER_NAME` | Display name for the server | `mcp-server` |
| `MCP_LOG_LEVEL` | Logging level (DEBUG, INFO, WARNING, ERROR) | `INFO` |
| `MCP_ALLOWED_PATHS` | Comma-separated paths for file tools | (none) |
| `MCP_CUSTOM_VAR_*` | Custom variables accessible via config | (none) |

## Included Tools

### Echo Tools
- `echo` - Echo back a message
- `echo_uppercase` - Echo in uppercase
- `echo_reverse` - Echo reversed

### DateTime Tools
- `get_current_time` - Get current UTC time
- `get_timestamp` - Get current Unix timestamp
- `parse_timestamp` - Convert timestamp to readable format
- `time_difference` - Calculate time between two timestamps

### File Tools (requires `MCP_ALLOWED_PATHS`)
- `list_directory` - List directory contents
- `read_file` - Read file contents
- `get_file_info` - Get file/directory metadata
- `get_allowed_paths` - Show configured allowed paths

## Setting Up Clients

### Claude Desktop

1. Open `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
2. Add your server configuration:

```json
{
  "mcpServers": {
    "my-mcp-server": {
      "command": "python",
      "args": ["-m", "mcp_server.server"],
      "cwd": "/full/path/to/mcp-server",
      "env": {
        "PYTHONPATH": "/full/path/to/mcp-server/src",
        "MCP_ALLOWED_PATHS": "/Users/you/Documents"
      }
    }
  }
}
```

3. Restart Claude Desktop completely (Cmd+Q, then relaunch)

### Claude Code

Create `.mcp.json` in your project root:

```json
{
  "mcpServers": {
    "my-mcp-server": {
      "command": "python",
      "args": ["-m", "mcp_server.server"],
      "cwd": "${workspaceFolder}/mcp-server",
      "env": {
        "PYTHONPATH": "${workspaceFolder}/mcp-server/src",
        "MCP_ALLOWED_PATHS": "${workspaceFolder}"
      }
    }
  }
}
```

## Adding New Tools

1. Create a new file in `src/mcp_server/tools/`:

```python
# src/mcp_server/tools/my_tool.py
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from mcp.server.fastmcp import FastMCP
    from ..config import ServerConfig


def register(mcp: "FastMCP", config: "ServerConfig") -> None:
    """Register my tools with the server."""

    @mcp.tool()
    def my_function(param: str, count: int = 1) -> str:
        """
        Description shown to Claude.

        Args:
            param: What this parameter does
            count: Optional count with default

        Returns:
            What the tool returns
        """
        return f"Result: {param} x {count}"
```

2. Register it in `src/mcp_server/tools/__init__.py`:

```python
def register_all_tools(mcp: "FastMCP", config: "ServerConfig") -> None:
    from . import echo_tool, datetime_tool, file_tool, my_tool  # Add import

    echo_tool.register(mcp, config)
    datetime_tool.register(mcp, config)
    file_tool.register(mcp, config)
    my_tool.register(mcp, config)  # Add registration
```

3. Restart Claude Desktop/Code to pick up the new tool.

## Tool Design Guidelines

1. **Clear docstrings**: The description and parameter docs are sent to Claude
2. **Type hints**: All parameters and returns need type hints (defines the JSON schema)
3. **Return strings**: Tools should return string results for best compatibility
4. **Error handling**: Return user-friendly error messages rather than raising exceptions
5. **Use config**: Access `config` for environment-specific settings (like allowed paths)

## Troubleshooting

**Server won't start:**
- Ensure `PYTHONPATH` includes the `src` directory
- Check that `mcp` package is installed: `pip install mcp[cli]`

**Tools not appearing in Claude:**
- Verify the config JSON is valid
- Check the `cwd` path is correct
- Restart Claude Desktop completely (Cmd+Q on Mac)

**File tools return "not in allowed directories":**
- Set `MCP_ALLOWED_PATHS` to comma-separated directory paths
- Paths must be absolute

## Dependencies

- Python 3.10+
- `mcp[cli]>=1.0.0`

TDQS

A3.7/5.0

Scored across 11 tools

Disambiguation4/5

Most tools have distinct purposes, but there is some overlap between time-related tools. get_current_time, get_timestamp, and parse_timestamp all handle time data, which could cause confusion about which to use for specific scenarios. However, their descriptions clarify their differences: get_current_time returns formatted UTC, get_timestamp returns Unix seconds, and parse_timestamp converts Unix to formatted. The echo variants are clearly distinct in their transformations.

Naming Consistency5/5

All tool names follow a consistent snake_case pattern with clear verb_noun structures. Examples include echo_reverse, get_allowed_paths, list_directory, and parse_timestamp. There are no deviations in naming conventions, making the set predictable and easy to understand at a glance.

Tool Count4/5

With 11 tools, the count is reasonable for a framework server, but it feels slightly over-scoped due to redundancy. The three echo tools and multiple time tools could potentially be consolidated without losing functionality. However, the number is within the typical 3-15 range and covers basic utility operations adequately.

Completeness3/5

The server covers basic utility functions like echoing, time handling, and file operations, but there are notable gaps. For file operations, it provides get_file_info, list_directory, and read_file, but lacks write, delete, or update capabilities, which are common in file management. The time tools are comprehensive, but the overall domain of 'framework' is vague, making it hard to assess full coverage beyond these utilities.

Maintenance

ActivityInactive
ResponsivenessNo issues