# YuliiaKovalova/dotnet-template-mcp [Health: Active]

**Category:** 💻 Developer Tools  
**Repository:** https://github.com/YuliiaKovalova/dotnet-template-mcp  
**GitHub Stars:** 8  
**Views:** 1  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/yuliiakovalova-dotnet-template-mcp

## Description
⃣ 🏠 🍎 🪟 🐧 - .NET Template Engine MCP server for AI-driven project scaffolding. Search, inspect, preview, and create dotnet new projects via natural language with parameter validation, smart defaults, NuGet auto-resolve, and interactive elicitation.

## Tools
Capabilities this server exposes over MCP:

- **template_search** — Search locally **and** on NuGet.org — one call, ranked results
- **template_list** — List what's installed, filter by language/type/classification
- **template_inspect** — Parameters, constraints, post-actions — all in one shot
- **template_instantiate** — Create a project. Not installed? Auto-resolves from NuGet. Elicits missing params interactively
- **template_dry_run** — Preview files without touching disk
- **template_install** — Install a package (idempotent — skips if already there)
- **template_uninstall** — Remove a template package
- **templates_installed** — Inventory of everything installed
- **template_from_intent** — *"web API with auth"* → webapi + `auth=Individual` — no LLM needed
- **template_create_from_existing** — Analyze a .csproj → generate a reusable template matching repo conventions
- **template_compose** — Execute a sequence of templates (project + items) in one workflow
- **template_suggest_parameters** — Suggest parameter values with rationale based on cross-parameter relationships
- **template_validate** — Validate a local template directory for authoring issues before publishing
- **template_compare** — Compare 2+ templates side by side — parameters, features, frameworks
- **solution_analyze** — Analyze a solution/workspace — project structure, frameworks, CPM status
- **packages_upgrade** — Scan a project/solution/folder for outdated NuGet versions and report or apply upgrades (CPM-aware)

## Claude Desktop Quick Installation
Remote MCP endpoint (confidence: high). Install path detected from listing signals. Add as a URL/SSE server in your client:

```json
"mcpServers": {
  "dotnet-template-mcp": {
    "url": "https://fronteir.ai/mcp/yuliiakovalova-dotnet-template-mcp"
  }
}
```

## Documentation & README

# DotnetTemplateMCP

<!-- mcp-name: io.github.YuliiaKovalova/dotnet-template-mcp -->

An MCP server that lets AI agents work with `dotnet new` templates — search, inspect, preview, and create projects through natural conversation instead of memorizing CLI flags.

<a href="https://glama.ai/mcp/servers/@YuliiaKovalova/dotnet-template-mcp">
  <img width="380" height="200" src="https://glama.ai/mcp/servers/@YuliiaKovalova/dotnet-template-mcp/badge" alt="DotnetTemplateMCP MCP server" />
</a>

Instead of this:
```bash
dotnet new list --language C#
dotnet new webapi --help
dotnet new webapi --auth Individual --use-controllers --name MyApi --output ./MyApi
```

Your AI agent just says: *"I need a web API with authentication and controllers"* — and the MCP server figures out the rest.

## Template Validation for Authors

Building a custom `dotnet new` template? `template_validate` catches mistakes **before** you publish — no more guessing if your `template.json` is correct:

```
Agent calls: template_validate("./my-template")

← Returns:
{
  "valid": false,
  "summary": "2 error(s), 1 warning(s), 3 suggestion(s)",
  "errors": [
    "Missing required field 'shortName'.",
    "Parameter 'Framework': default value 'net7.0' is not in the choices list."
  ],
  "warnings": [
    "Missing 'sourceName'. Without it, the generated project name won't be customizable via --name."
  ],
  "suggestions": [
    "Consider adding a 'description' field to help users understand what this template creates.",
    "Consider adding 'language' tag (e.g., 'C#') for better discoverability.",
    "Consider adding 'type' tag (e.g., 'project', 'item') for filtering."
  ]
}
```

**What it catches:** missing required fields, invalid identity format, short name conflicts with CLI commands, parameter issues (missing defaults, empty choices, prefix collisions, type mismatches), broken computed symbols, constraint misconfiguration, and missing tags.

**How this relates to the official tooling.** Microsoft ships template authoring validation already, and you should know about it:

| Official tool | What it gives you |
|---|---|
| [`Microsoft.TemplateEngine.Authoring.CLI`](https://www.nuget.org/packages/Microsoft.TemplateEngine.Authoring.CLI) | `dotnet template-authoring validate` — the reference validator |
| [`Microsoft.TemplateEngine.Authoring.Tasks`](https://www.nuget.org/packages/Microsoft.TemplateEngine.Authoring.Tasks) | Validation at build time, as an MSBuild task |
| [`Microsoft.TemplateEngine.Authoring.TemplateVerifier`](https://www.nuget.org/packages/Microsoft.TemplateEngine.Authoring.TemplateVerifier) | Snapshot testing of template output |

What `template_validate` adds is **not** the validation itself — it is the delivery: a single structured JSON payload, split into `errors`/`warnings`/`suggestions` with fix-oriented messages, returned in-band to an agent that is already editing the template. No install step, no output parsing, no second tool in the loop. If you are a human authoring templates in CI, prefer the official tools above; they are the reference implementation and cover cases this does not.

## Tools

| Tool | What it does |
|------|-------------|
| `template_search` | Search locally **and** on NuGet.org — one call, ranked results |
| `template_list` | List what's installed, filter by language/type/classification |
| `template_inspect` | Parameters, constraints, post-actions — all in one shot |
| `template_instantiate` | Create a project. Not installed? Auto-resolves from NuGet. Elicits missing params interactively |
| `template_dry_run` | Preview files without touching disk |
| `template_install` | Install a package (idempotent — skips if already there) |
| `template_uninstall` | Remove a template package |
| `templates_installed` | Inventory of everything installed |
| `template_from_intent` | *"web API with auth"* → webapi + `auth=Individual` — no LLM needed |
| `template_create_from_existing` | Analyze a .csproj → generate a reusable template matching repo conventions |
| `template_compose` | Execute a sequence of templates (project + items) in one workflow |
| `template_suggest_parameters` | Suggest parameter values with rationale based on cross-parameter relationships |
| `template_validate` | Validate a local template directory for authoring issues before publishing |
| `template_compare` | Compare 2+ templates side by side — parameters, features, frameworks |
| `solution_analyze` | Analyze a solution/workspace — project structure, frameworks, CPM status |
| `packages_upgrade` | Scan a project/solution/folder for outdated NuGet versions and report or apply upgrades (CPM-aware) |

📖 [Full tool reference →](https://github.com/YuliiaKovalova/dotnet-template-mcp/blob/HEAD/docs/tool-reference.md)

## Hosted deployment

A hosted deployment is available on [Fronteir AI](https://fronteir.ai/mcp/yuliiakovalova-dotnet-template-mcp).

## Quick Start

### Global tool (.NET 8+)

```bash
dotnet tool install --global DotnetTemplateMCP --version 2.0.0
```

### Zero-install with `dnx` (.NET 10+)

```bash
dnx -y DotnetTemplateMCP --version 2.0.0
```

### VS Code / GitHub Copilot

Add to `mcp.json`:

```json
{
  "servers": {
    "dotnet-templates": {
      "type": "stdio",
      "command": "dnx",
      "args": ["-y", "DotnetTemplateMCP", "--version", "2.0.0"]
    }
  }
}
```

📖 [Claude Desktop, Cursor, and more →](https://github.com/YuliiaKovalova/dotnet-template-mcp/blob/HEAD/docs/configuration.md)

## Transport Modes

### Stdio (default)

Standard I/O transport for local CLI and tool usage:

```bash
template-engine-mcp                     # stdio is the default
template-engine-mcp --transport stdio   # explicit
```

### HTTP (remote / team-shared)

Streamable HTTP transport for remote or CI/CD deployment.

**Authentication is mandatory.** Every tool in this server writes files and installs NuGet packages, so an open endpoint is a remote code execution surface. The server refuses to start the HTTP transport unless you either set a token or explicitly opt in to anonymous access:

```bash
# Recommended
MCP_TEMPLATE_HTTP_TOKEN=<shared-secret> template-engine-mcp --transport http

# Only for a trusted, isolated network
MCP_TEMPLATE_HTTP_ALLOW_ANONYMOUS=true template-engine-mcp --transport http
```

Clients authenticate with `Authorization: Bearer <shared-secret>`. Requests to `/mcp` are rate limited per client (default 120/minute, `MCP_TEMPLATE_HTTP_RATE_LIMIT=0` disables). `/health` stays anonymous for probes.

> **Not multi-tenant.** `TemplateEngineService` is a process-wide singleton with `virtualizeSettings: false`, so the installed-template set is shared by every caller, and the workspace root is process-wide. Run one instance per trusted team or per tenant — do not expose a single instance to mutually untrusting users.

```bash
template-engine-mcp --transport http
# or via environment variable:
MCP_TEMPLATE_TRANSPORT=http template-engine-mcp
```

The HTTP server exposes:
- **`/mcp`** — MCP streamable HTTP endpoint (bearer token required)
- **`/health`** — Health check endpoint (anonymous)

Configure the listen URL:
```bash
MCP_TEMPLATE_HTTP_URL=http://0.0.0.0:8080 template-engine-mcp --transport http
```

Connect your MCP client:
```json
{
  "servers": {
    "dotnet-templates": {
      "type": "http",
      "url": "http://localhost:5005/mcp"
    }
  }
}
```

### Interactive Elicitation

When a template has required parameters that weren't provided, the server **asks the user interactively** via MCP elicitation — instead of failing. Template parameter types are mapped to form fields:

| Template Parameter | Elicitation Field |
|---|---|
| `string` | Text input |
| `bool` / `boolean` | Checkbox |
| `int` / `number` | Number input |
| Choice parameter | Single-select dropdown |

Disable with `MCP_TEMPLATE_ELICITATION=false`.

## How it works

```
You: "I need a web API with authentication, controllers, and Docker support"

→ template_from_intent extracts keywords: web api, authentication, controllers, docker
→ Matches: webapi (confidence: 0.85)
→ Resolves: auth=Individual, UseControllers=true, EnableDocker=true
→ template_instantiate creates the project
```

The server also does **smart defaults** (AOT → latest framework, auth → HTTPS stays on), **parameter validation** before writing files, **constraint checking** (OS, SDK, workload), **interactive elicitation** of missing required parameters, and **auto-resolves** templates from NuGet if they're not installed.

### CPM & Latest Package Versions

When creating a project inside a solution that uses [Central Package Management](https://learn.microsoft.com/nuget/consume-packages/central-package-management), the server automatically:

1. **Detects** `Directory.Packages.props` by walking up the directory tree
2. **Strips** `Version` attributes from generated `.csproj` PackageReferences
3. **Adds** missing `<PackageVersion>` entries to `Directory.Packages.props`
4. **Resolves** latest stable NuGet versions — no more stale hardcoded versions from templates

```
Before (what dotnet new generates):
  <PackageReference Include="Serilog" Version="3.1.0" />    ← stale, breaks CPM

After (what template_instantiate produces):
  .csproj:                    <PackageReference Include="Serilog" />
  Directory.Packages.props:   <PackageVersion Include="Serilog" Version="4.2.0" />
```

Works for standalone projects too — versions are updated directly in the `.csproj`.

### Multi-Template Composition

Chain multiple templates in one call with `template_compose`:

```json
[
  {"templateName": "webapi", "name": "MyApi", "parametersJson": "{\"auth\": \"Individual\"}"},
  {"templateName": "gitignore", "target": "."}
]
```

📖 [Architecture & smart behaviors →](https://github.com/YuliiaKovalova/dotnet-template-mcp/blob/HEAD/docs/architecture.md)

### Tool Profiles (Lite vs Full)

By default, all 15 tools are available. If your agent works better with fewer tools, set the `MCP_TEMPLATE_TOOL_PROFILE` environment variable:

| Profile | Tools | When to use |
|---------|-------|-------------|
| `full` (default) | All 15 tools | Full control — advanced workflows, composition, custom templates |
| `lite` | 5 core tools | Simpler agents that just need to find and create projects |

**Lite profile tools:** `template_from_intent`, `template_instantiate`, `template_inspect`, `template_search`, `template_dry_run`

```json
{
  "servers": {
    "dotnet-template-mcp": {
      "command": "dotnet-template-mcp",
      "env": {
        "MCP_TEMPLATE_TOOL_PROFILE": "lite"
      }
    }
  }
}
```

Non-lite tools will return a helpful message explaining they're disabled and how to enable them.

## Documentation

| Doc | What's in it |
|-----|-------------|
| [Configuration](https://github.com/YuliiaKovalova/dotnet-template-mcp/blob/HEAD/docs/configuration.md) | VS Code, Claude Desktop, Cursor setup + troubleshooting |
| [Tool Reference](https://github.com/YuliiaKovalova/dotnet-template-mcp/blob/HEAD/docs/tool-reference.md) | Every tool's parameters, types, and examples |
| [Architecture](https://github.com/YuliiaKovalova/dotnet-template-mcp/blob/HEAD/docs/architecture.md) | Template cache, smart behaviors, telemetry, project structure |
| [MCP vs Skills](https://github.com/YuliiaKovalova/dotnet-template-mcp/blob/HEAD/docs/mcp-vs-skills.md) | Why MCP over Copilot Skills — benefits and downsides |
| [Plain LLM vs MCP](https://github.com/YuliiaKovalova/dotnet-template-mcp/blob/HEAD/docs/plain-llm-vs-mcp.md) | Side-by-side: what a plain LLM does vs. the MCP tool (4 scenarios) |
| [Skills Equivalent](https://github.com/YuliiaKovalova/dotnet-template-mcp/blob/HEAD/docs/skills-equivalent.md) | What it'd take to cover this with Skills instead |

## Building & Testing

```bash
dotnet build
dotnet test    # 185+ tests — unit, integration, and E2E
```

CI runs on push/PR via [GitHub Actions](https://github.com/YuliiaKovalova/dotnet-template-mcp/blob/HEAD/.github/workflows/ci.yml) (Ubuntu + Windows).

## Contributing

Contributions are welcome! Please open an issue to discuss proposed changes before submitting a PR.

```bash
# Setup
dotnet restore
dotnet build

# Run tests
dotnet test

# Pack locally
dotnet pack src/DotnetTemplateMcp -o nupkg/
```

## Changelog

See [CHANGELOG.md](https://github.com/YuliiaKovalova/dotnet-template-mcp/blob/HEAD/CHANGELOG.md) for release history.

## License

[MIT](https://github.com/YuliiaKovalova/dotnet-template-mcp/blob/HEAD/LICENSE)
