Source profileQuality 98/100

Postpartum-genushyacinthus29/dotnet-skills/skills/dotnet-minimal-apis/SKILL.md

dotnet-minimal-apis

Design and implement Minimal APIs in ASP.NET Core using handler-first endpoints, route groups, filters, and lightweight composition suited to modern .NET services.

Source repository stars
9
Declared platforms
0
Static risk flags
0
Last source update
2026-08-23
Source checked
2026-08-25

Decision brief

What it does: where it fits

Design and implement Minimal APIs in ASP. NET Core using handler-first endpoints, route groups, filters, and lightweight composition suited to modern .

Best for

    Not for

    • Tasks that require unconfirmed production actions or broad system permissions.
    • Environments where the pinned source and install steps cannot be inspected.

    Compatibility matrix

    Platform support, with evidence labels

    PlatformStatusEvidenceWhat to check
    CodexNot declaredNo explicit evidencePortability before use
    Claude CodeNot declaredNo explicit evidencePortability before use
    CursorNot declaredNo explicit evidencePortability before use
    Gemini CLINot declaredNo explicit evidencePortability before use
    Open the compatibility checker

    Installation

    Inspect first. Install second.

    The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

    Source-detected install commandSource
    npx skills add https://github.com/Postpartum-genushyacinthus29/dotnet-skills --skill "skills/dotnet-minimal-apis"
    Safe inspection promptEditorial

    Inspect the Agent Skill "dotnet-minimal-apis" from https://github.com/Postpartum-genushyacinthus29/dotnet-skills/blob/f9c1a213bc25d95641adc3a59f8048cb5656741c/skills/dotnet-minimal-apis/SKILL.md at commit f9c1a213bc25d95641adc3a59f8048cb5656741c. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

    Workflow

    What the source asks the agent to do

    1. 01

      Workflow

      1. Define endpoints directly in Program.cs (for small APIs) 2. Use route groups for related endpoints 3. Move handlers to separate classes as the API grows 4. Apply filters for cross-cutting concerns 5. Use TypedResults for type-safe responses 6. Generate OpenAPI docs with .With…

      Define endpoints directly in Program.cs (for small APIs)Use route groups for related endpointsMove handlers to separate classes as the API grows
    2. 02

      Trigger On

      building new HTTP APIs in ASP.NET Core

      building new HTTP APIs in ASP.NET Corecreating lightweight microserviceschoosing between Minimal APIs and controllers
    3. 03

      Documentation

      Minimal APIs Overview

      Minimal APIs OverviewMinimal API TutorialFilters in Minimal APIs
    4. 04

      When to Use Minimal APIs vs Controllers

      Review the “When to Use Minimal APIs vs Controllers” section in the pinned source before continuing.

      Review and apply the “When to Use Minimal APIs vs Controllers” source section.
    5. 05

      Basic Patterns

      Review the “Basic Patterns” section in the pinned source before continuing.

      Review and apply the “Basic Patterns” source section.

    Permission review

    Static risk signals and limitations

    No configured static risk pattern was detected

    This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.

    Evidence record

    Why each signal appears

    EvidenceSourceComputedTestedEditorial
    SignalValueEvidence typeMeaning
    Quality score98/100ComputedDocumentation, specificity, maintenance, and trust rules
    Repository stars9SourceRepository attention, not individual Skill quality
    Compatibility0 platformsSourceDeclared in the catalog source record
    Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

    Pinned source

    Provenance and original SKILL.md

    Repository
    Postpartum-genushyacinthus29/dotnet-skills
    Skill path
    skills/dotnet-minimal-apis/SKILL.md
    Commit
    f9c1a213bc25d95641adc3a59f8048cb5656741c
    License
    MIT
    Collected
    2026-08-25
    Default branch
    main
    View the original SKILL.md

    Minimal APIs

    Trigger On

    • building new HTTP APIs in ASP.NET Core
    • creating lightweight microservices
    • choosing between Minimal APIs and controllers
    • organizing endpoints with route groups
    • implementing validation and filters

    Documentation

    References

    • patterns.md - detailed route groups, filters, TypedResults patterns, parameter binding, error handling, and testing
    • anti-patterns.md - common Minimal API mistakes to avoid

    When to Use Minimal APIs vs Controllers

    Use Minimal APIsUse Controllers
    New projectsExisting MVC/API projects
    MicroservicesComplex model binding
    Simple CRUD APIsOData, JsonPatch
    Lightweight handlersHeavy use of attributes
    .NET 8+ projectsNeed [ApiController] features

    Workflow

    1. Define endpoints directly in Program.cs (for small APIs)
    2. Use route groups for related endpoints
    3. Move handlers to separate classes as the API grows
    4. Apply filters for cross-cutting concerns
    5. Use TypedResults for type-safe responses
    6. Generate OpenAPI docs with .WithOpenApi()

    Basic Patterns

    Simple Endpoints

    var app = builder.Build();
    
    app.MapGet("/", () => "Hello World");
    
    app.MapGet("/products/{id}", (int id) => Results.Ok(new { Id = id }));
    
    app.MapPost("/products", (Product product) => Results.Created($"/products/{product.Id}", product));
    

    TypedResults (Strongly-Typed)

    app.MapGet("/products/{id}", Results<Ok<Product>, NotFound> (int id, AppDb db) =>
    {
        var product = db.Products.Find(id);
        return product is not null
            ? TypedResults.Ok(product)
            : TypedResults.NotFound();
    });
    

    Dependency Injection

    app.MapGet("/products", async (IProductService service) =>
    {
        return await service.GetAllAsync();
    });
    
    // Or with [FromServices] for clarity
    app.MapGet("/products", async ([FromServices] IProductService service) =>
        await service.GetAllAsync());
    

    Route Groups

    Basic Grouping

    var products = app.MapGroup("/api/products");
    
    products.MapGet("/", GetAll);
    products.MapGet("/{id}", GetById);
    products.MapPost("/", Create);
    products.MapPut("/{id}", Update);
    products.MapDelete("/{id}", Delete);
    

    Groups with Shared Configuration

    var api = app.MapGroup("/api")
        .RequireAuthorization()
        .AddEndpointFilter<ValidationFilter>();
    
    var products = api.MapGroup("/products")
        .WithTags("Products");
    
    var orders = api.MapGroup("/orders")
        .WithTags("Orders")
        .RequireAuthorization("AdminOnly");
    

    Endpoint Filters

    Inline Filter

    app.MapGet("/products/{id}", (int id) => Results.Ok(id))
        .AddEndpointFilter(async (context, next) =>
        {
            var id = context.GetArgument<int>(0);
            if (id <= 0)
                return Results.BadRequest("Invalid ID");
    
            return await next(context);
        });
    

    Class-Based Filter

    public class ValidationFilter<T> : IEndpointFilter where T : class
    {
        public async ValueTask<object?> InvokeAsync(
            EndpointFilterInvocationContext context,
            EndpointFilterDelegate next)
        {
            var argument = context.Arguments
                .OfType<T>()
                .FirstOrDefault();
    
            if (argument is null)
                return Results.BadRequest("Invalid request body");
    
            var validator = context.HttpContext.RequestServices
                .GetService<IValidator<T>>();
    
            if (validator is not null)
            {
                var result = await validator.ValidateAsync(argument);
                if (!result.IsValid)
                    return Results.ValidationProblem(result.ToDictionary());
            }
    
            return await next(context);
        }
    }
    
    // Usage
    products.MapPost("/", Create)
        .AddEndpointFilter<ValidationFilter<CreateProductRequest>>();
    

    Global Filters via Root Group

    // All endpoints inherit filters from root group
    var root = app.MapGroup("")
        .AddEndpointFilter<LoggingFilter>()
        .AddEndpointFilter<ErrorHandlingFilter>();
    
    root.MapGet("/health", () => Results.Ok());
    root.MapGroup("/api/products").MapGet("/", GetProducts);
    

    Organizing Larger APIs

    Extension Method Pattern

    // ProductEndpoints.cs
    public static class ProductEndpoints
    {
        public static RouteGroupBuilder MapProductEndpoints(this IEndpointRouteBuilder app)
        {
            var group = app.MapGroup("/api/products")
                .WithTags("Products");
    
            group.MapGet("/", GetAll);
            group.MapGet("/{id}", GetById);
            group.MapPost("/", Create);
    
            return group;
        }
    
        private static async Task<Ok<List<Product>>> GetAll(IProductService service)
            => TypedResults.Ok(await service.GetAllAsync());
    
        private static async Task<Results<Ok<Product>, NotFound>> GetById(
            int id, IProductService service)
        {
            var product = await service.GetByIdAsync(id);
            return product is not null
                ? TypedResults.Ok(product)
                : TypedResults.NotFound();
        }
    
        private static async Task<Created<Product>> Create(
            CreateProductRequest request, IProductService service)
        {
            var product = await service.CreateAsync(request);
            return TypedResults.Created($"/api/products/{product.Id}", product);
        }
    }
    
    // Program.cs
    app.MapProductEndpoints();
    app.MapOrderEndpoints();
    

    Request/Response DTOs

    // Separate from domain models
    public record CreateProductRequest(string Name, decimal Price);
    public record UpdateProductRequest(string Name, decimal Price);
    public record ProductResponse(int Id, string Name, decimal Price);
    
    // Don't expose domain entities directly
    app.MapPost("/products", (CreateProductRequest request, IMapper mapper) =>
    {
        var product = mapper.Map<Product>(request);
        // ...
        return TypedResults.Created($"/products/{product.Id}",
            mapper.Map<ProductResponse>(product));
    });
    

    Anti-Patterns to Avoid

    Anti-PatternWhy It's BadBetter Approach
    Everything in Program.csUnmaintainableUse extension methods
    No route groupsRepetitive configGroup related endpoints
    Manual validationError-proneUse filters + FluentValidation
    Exposing entitiesTight couplingUse DTOs
    No TypedResultsNo compile-time checksUse TypedResults
    Ignoring OpenAPINo documentationAdd .WithOpenApi()

    OpenAPI Integration

    builder.Services.AddOpenApi();
    
    app.MapOpenApi();  // Serves OpenAPI spec
    
    app.MapGet("/products", GetProducts)
        .WithName("GetProducts")
        .WithSummary("Get all products")
        .WithDescription("Returns a list of all available products")
        .Produces<List<Product>>(StatusCodes.Status200OK)
        .ProducesProblem(StatusCodes.Status500InternalServerError);
    

    Deliver

    • clean, organized Minimal API endpoints
    • proper use of route groups and filters
    • type-safe responses with TypedResults
    • OpenAPI documentation
    • validation with endpoint filters

    Validate

    • endpoints return correct status codes
    • validation filters catch invalid input
    • OpenAPI spec is accurate
    • route groups share common configuration
    • handlers are testable (can mock dependencies)

    Frequently asked questions

    What to verify before installation and use

    What does the dotnet-minimal-apis source document cover?

    Design and implement Minimal APIs in ASP. NET Core using handler-first endpoints, route groups, filters, and lightweight composition suited to modern .

    How do I install dotnet-minimal-apis?

    The source record exposes this install command: npx skills add https://github.com/Postpartum-genushyacinthus29/dotnet-skills --skill "skills/dotnet-minimal-apis". Inspect the command and pinned source before running it.

    Alternatives

    Compare before choosing

    Computed 100147

    oaustegard/claude-skills

    featuring

    Generate hierarchical _FEATURES.md files that describe what a codebase DOES from a user/consumer perspective, anchored to source symbols via tree-sitting. Supports large complex codebases through feature-driven decomposition into sub-feature files. Uses a multi-pass synthesis: orientation → detail → overview rewrite. Use when someone says "what does this do", "document features", "feature inventory", "_FEATURES.md", or needs to understand a codebase's purpose before modifying it. Complements tre

    Computed 9916

    NintendaDev/unikit-ai

    unikit-docs

    Generate and maintain the project's TECHNICAL documentation from its codebase — scans the project structure, tech stack, and module boundaries, then writes a lean README landing page plus detailed topic pages (architecture, modules, setup, build, APIs), only the docs that are relevant. Use whenever the user wants to create, update, or validate documentation of the CODE or the project itself, e.g. "generate documentation", "create docs", "write the README", "update the project docs", "document th

    Computed 9824,921

    alirezarezvani/claude-skills

    quality-manager-qms-iso13485

    ISO 13485 Quality Management System implementation and maintenance for medical device organizations. Provides QMS design, documentation control, internal auditing, CAPA management, and certification support. Use when working with medical device quality systems, preparing for ISO 13485 audits, managing regulatory compliance documentation, setting up corrective actions, or building audit preparation programs. Useful for quality management, audit preparation, regulatory compliance, medical device d

    Computed 989

    Postpartum-genushyacinthus29/dotnet-skills

    dotnet-mvvm

    Implement the Model-View-ViewModel pattern in .NET applications with proper separation of concerns, data binding, commands, and testable ViewModels using MVVM Toolkit.