Skip to main content
Glama
README.md
# project-scaffold

An MCP server that scaffolds full-stack projects with consistent structure, Docker setup, CI/CD pipelines, and database configuration. Built with [FastMCP](https://github.com/jlowin/fastmcp).

> **Alpha** — This project is under active development. APIs and generated output may change between versions. Contributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md).

## What it generates

Every scaffolded project comes with:

- **FastAPI** backend with async SQLAlchemy and Pydantic v2
- **PostgreSQL** database with Docker Compose (includes pgAdmin)
- **Frontend** — React (Vite + TypeScript) or HTMX (Tailwind CSS)
- **Alembic** database migrations (optional)
- **JWT authentication** boilerplate (optional)
- **CI/CD** — GitHub Actions for Azure, or Render.com blueprint
- **Makefile** with common dev commands

## Template combinations

| Project type | Frontend | Deploy target | Repo structure |
|---|---|---|---|
| `work` | `react` | Azure (App Service + Static Web Apps) | Multi-repo (API + frontend) |
| `work` | `htmx` | Azure (App Service) | Single repo |
| `personal` | `react` | Render.com | Multi-repo (API + frontend) |
| `personal` | `htmx` | Render.com | Single repo |

## Requirements

- Python 3.12+
- [uv](https://docs.astral.sh/uv/) (recommended) or pip

## Installation

### From GitHub (pip)

```bash
pip install git+https://github.com/dawiegriesel/mcp-dev.git
```

### From GitHub (uv)

```bash
uv pip install git+https://github.com/dawiegriesel/mcp-dev.git
```

### Local development

```bash
git clone https://github.com/dawiegriesel/mcp-dev.git
cd mcp-dev
uv sync
```

For development dependencies (pytest, ruff):

```bash
uv sync --extra dev
```

## Installing the MCP server

### Claude Code

```bash
claude mcp add project-scaffold -- uvx --from "git+https://github.com/dawiegriesel/mcp-dev.git" project-scaffold
```

Or if installed locally:

```bash
claude mcp add project-scaffold -- uv run --directory /path/to/mcp-dev project-scaffold
```

#### Project-scoped config (local development)

For local development, create a `.mcp.json` in the repo root to register the server automatically when you open the repo in Claude Code — no manual `claude mcp add` needed:

```json
{
  "mcpServers": {
    "project-scaffold": {
      "command": "uv",
      "args": ["run", "--directory", "/your/local/path/mcp-dev", "project-scaffold"]
    }
  }
}
```

Replace the `--directory` value with your actual clone path. This file is gitignored to avoid committing local paths.

### Claude Desktop

Add this to your Claude Desktop config file (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS, `%APPDATA%\Claude\claude_desktop_config.json` on Windows):

```json
{
  "mcpServers": {
    "project-scaffold": {
      "command": "uvx",
      "args": [
        "--from", "git+https://github.com/dawiegriesel/mcp-dev.git",
        "project-scaffold"
      ]
    }
  }
}
```

### Other MCP clients

Run the server with stdio transport (the default):

```bash
project-scaffold
```

Or without installing:

```bash
uvx --from "git+https://github.com/dawiegriesel/mcp-dev.git" project-scaffold
```

## MCP tools

The server exposes five tools via MCP:

### `list_templates`

Returns all available project template combinations and their default stack.

### `create_project`

Scaffolds a complete project. Configuration options:

| Parameter | Required | Default | Description |
|---|---|---|---|
| `name` | yes | — | Project name (lowercase, hyphens allowed) |
| `project_type` | yes | — | `"work"` (Azure) or `"personal"` (Render.com) |
| `frontend_type` | yes | — | `"react"` (SPA) or `"htmx"` (server-rendered) |
| `output_dir` | yes | — | Parent directory for the project folder |
| `description` | no | `""` | Short project description |
| `db_name` | no | derived from name | Database name |
| `include_auth` | no | `true` | Include JWT auth boilerplate |
| `include_alembic` | no | `true` | Include Alembic migrations |
| `api_port` | no | `8000` | Local dev API port |
| `frontend_port` | no | `3000` | Local dev frontend port (React only) |

### `add_component`

Adds a component to an existing scaffolded project. Supported components:

- **`api_router`** — FastAPI router with full CRUD endpoints, plus auto-generated model and schema if fields are provided
- **`db_model`** — SQLAlchemy model with matching Pydantic schemas

Components not yet implemented: `frontend_page`, `github_action`, `docker_service`.

### `validate_project`

Checks that a scaffolded project has all expected files. Reports any missing files.

### `get_project_info`

Reads the `.scaffold.json` metadata from an existing project and returns its configuration.

## Example prompts

Once the MCP server is installed, you can use natural language to scaffold and extend projects. Here are some example prompts to get started:

### Scaffold a new project

> Create a new personal project called "recipe-box" with an HTMX frontend. Put it in ~/projects. Include auth and migrations.

> Scaffold a work project named "inventory-tracker" with a React frontend in ~/work. No auth needed but include Alembic.

> I want to start a new side project called "budget-app". It should be a simple server-rendered app I can deploy to Render. Create it in ~/dev.

> What project templates are available?

### Add components to an existing project

> Add a "products" API router to my project at ~/projects/recipe-box with fields: title (str), prep_time (int), servings (int), instructions (text).

> Add a database model called "category" with fields name (str) and description (text) to ~/projects/recipe-box.

> I need a new "orders" endpoint in my inventory-tracker project. It should have fields for customer_name (str), total (float), and fulfilled (bool).

### Inspect and validate projects

> Check if my project at ~/projects/recipe-box has all the expected files.

> What's the configuration for the project in ~/work/inventory-tracker?

> Validate the project structure at ~/dev/budget-app and tell me if anything is missing.

## Project structure

### React projects (multi-repo)

```
my-app/
├── Makefile
├── README.md
├── .env.example
├── docker-compose.yml
├── docker-compose.override.yml
├── .scaffold.json
├── my-app-api/
│   ├── pyproject.toml
│   ├── Dockerfile
│   ├── app/
│   │   ├── main.py
│   │   ├── config.py
│   │   ├── database.py
│   │   ├── models/
│   │   ├── schemas/
│   │   ├── routers/
│   │   └── auth/          (optional)
│   ├── alembic/            (optional)
│   ├── tests/
│   └── .github/workflows/
└── my-app-frontend/
    ├── package.json
    ├── vite.config.ts
    ├── Dockerfile
    ├── nginx.conf
    ├── src/
    │   ├── App.tsx
    │   ├── api/
    │   ├── pages/
    │   ├── components/
    │   └── styles/
    └── .github/workflows/
```

### HTMX projects (single repo)

```
my-app/
├── Makefile
├── README.md
├── .env.example
├── docker-compose.yml
├── pyproject.toml
├── Dockerfile
├── .scaffold.json
├── app/
│   ├── main.py
│   ├── config.py
│   ├── database.py
│   ├── models/
│   ├── schemas/
│   ├── routers/
│   ├── templates/
│   │   ├── base.html
│   │   ├── index.html
│   │   └── partials/
│   ├── static/css/
│   └── auth/              (optional)
├── alembic/                (optional)
└── tests/
```

## Development

```bash
# Lint
uv run ruff check src/

# Format
uv run ruff format src/

# Test
uv run pytest
```

### Automated documentation updates

This repo includes a `docs-pre-commit` Claude agent (`.claude/agents/docs-pre-commit.md`). When working in Claude Code, it triggers automatically before commits to update CHANGELOG.md, README.md, and CLAUDE.md to reflect the changes being committed.

To trigger it manually, tell Claude: "Update the documentation before I commit."

## Architecture

```
src/project_scaffold/
├── __main__.py          # Entry point — runs mcp.run()
├── server.py            # FastMCP server with 5 tool definitions + main()
├── models.py            # Pydantic models (ProjectConfig, ComponentConfig)
├── config.py            # Constants, type maps, template paths
├── generator.py         # Core engine — renders Jinja2 templates to disk
├── renderers/
│   └── api.py           # Component generators (add_router, add_model)
└── templates/           # Jinja2 templates (included in package)
    ├── api/             # FastAPI backend
    ├── frontend/react/  # React + Vite + TypeScript
    ├── frontend/htmx/   # HTMX + Tailwind
    ├── docker/          # Docker Compose
    ├── cicd/azure/      # GitHub Actions for Azure
    ├── cicd/render/     # Render.com blueprint
    ├── alembic/         # Database migrations
    └── common/          # README, Makefile, .env, .gitignore
```

TDQS

A4.2/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct phase or aspect of project scaffolding: configure_project gathers requirements, list_templates shows options, create_project generates the project, add_component extends it, validate_project checks structure, and get_project_info inspects configuration. There is no overlap or ambiguity between them.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern: configure_project, list_templates, create_project, add_component, validate_project, get_project_info. This makes the tool set predictable and easy to navigate.

Tool Count5/5

With 6 tools, the server is well-scoped for its purpose. Each tool covers a necessary step in the scaffolding workflow without redundancy or bloat.

Completeness5/5

The tool set covers the full scaffold lifecycle: template discovery, project configuration, creation, component addition, validation, and inspection. While update/delete operations are missing, they are not expected for a scaffold generator, making the surface complete for its domain.

Maintenance

ActivityInactive
ResponsivenessNo issues