BB

brewup/brewuperp

Analytics & monitoring

이 페이지는 AI로 자동 번역되었습니다. 기술적인 세부 사항은 원문을 확인하세요. 원문 보기

10 stars 5 forks 품질 75 트렌드 32MIT

Experiments with DDD, CQRS+ES, MCP and Agents

개요

BrewUpErp is an end‑to‑end sample ERP for a brewery, built to demonstrate: - Domain‑Driven Design (DDD) and a modular / bounded‑context architecture - CQRS and event sourcing with Muflone - Functional‑style domain modelling and clean, testable application layers - : one MCP server per module, an A2A agent, and a coordinator that orchestrates them - for local orchestration and observability of every service The solution is intentionally realistic but still small enough to study. It consists of: - – backend HTTP API, domain, MCP servers and the Knowledge agent (ASP.NET Core, .NET 10) - – Blazor web front‑end - – .NET MAUI mobile application Note: this repository is a work in progress. Expect breaking changes and incomplete features, especially in less‑used flows. The backend is a (BrewUp.Rest) surrounded by — one per module — plus a for the Knowledge module.

README

원문 README의 일부입니다. 원문 보기.

BrewUpErp

BrewUpErp is an end‑to‑end sample ERP for a brewery, built to demonstrate:

  • Domain‑Driven Design (DDD) and a modular / bounded‑context architecture
  • CQRS and event sourcing with Muflone
  • Functional‑style domain modelling and clean, testable application layers
  • An agentic AI layer: one MCP server per module, an A2A agent, and a coordinator that orchestrates them
  • .NET Aspire for local orchestration and observability of every service

The solution is intentionally realistic but still small enough to study. It consists of:

  • BrewApi – backend HTTP API, domain, MCP servers and the Knowledge agent (ASP.NET Core, .NET 10)
  • BrewSpa – Blazor web front‑end
  • BrewApp – .NET MAUI mobile application

Note: this repository is a work in progress. Expect breaking changes and incomplete features, especially in less‑used flows.


Architecture at a glance

The backend is a modular monolith (BrewUp.Rest) surrounded by independently deployable MCP servers — one per module — plus a standalone A2A agent for the Knowledge module. The MCP servers never talk to the monolith: each one reads its own module’s read model directly, so the AI surface of a module ships and scales on its own.

Two consumers use that surface:

  • the Mother coordinator inside BrewUp.Rest, which drives Azure OpenAI function calling over the pooled tool catalog of all four MCP servers, and delegates knowledge questions to the Knowledge agent over A2A;
  • any external MCP client (VS Code, Claude Code, …), since every server speaks plain MCP over HTTP at /mcp.

The whole set is started by the Aspire AppHost, which injects configuration and points every service at the Aspire dashboard over OTLP.


Solution Structure

src/
├── BrewApi/          # Backend API, domain, MCP servers, Knowledge agent, Aspire AppHost
├── BrewSpa/          # Blazor web front-end
└── BrewApp/          # .NET MAUI mobile app
BrewDocs/             # Bruno API contracts & example payloads
docker/               # Backing services (KurrentDB, MongoDB, RabbitMQ)
infra/
├── Bicep/            # Azure Container Apps deployment
└── Docker/           # MCP + agent compose files, .env template
docs/images/          # Architecture diagrams

BrewApi

The backend solution is src/BrewApi/BrewUp.slnx.

Orchestration & cross‑cutting projects

Project Purpose
BrewOrchestrator.Host .NET Aspire AppHost — starts the MCP containers, the Knowledge agent and the REST API
BrewOrchestrator.ServiceDefaults Aspire service defaults: OpenTelemetry, health checks, service discovery, HTTP resilience
BrewUp.Rest ASP.NET Core Web API host — composition root with explicit module registration
GitHub에서 전체 README 보기

설치

This server does not publish a one-line install command.

Open the repository installation guide MCP 초보자라면? mcpskill.org 가이드부터 시작하세요 →

설정

"BrewUp": { "MongoDbSettings": { "ConnectionString": "...", "DatabaseName": "BrewUp" }, "EventStore": { "ConnectionString": "esdb://localhost:4113?tls=false" }, "RabbitMQ": { "Host": "localhost", "Username": "guest", "Password": "guest", "UseRMQ": true }, "AzureServiceBus": { "ConnectionString": "...", "TopicName": "brewup", "UseAzureServiceBus": false }, "SqlServer": { "ConnectionString": "...", "Dimensions": 1536 }, "McpServers": { "MasterDataUrl": "http://localhost:8082/mcp", "WarehouseUrl": "http://localhost:8083/mcp", "SalesUrl": "http://localhost:8084/mcp", "KnowledgeUrl": "http://localhost:8081/mcp" }, "AzureOpenAI": { "Endpoint": "...", "DeploymentName": "...", "ApiKey": "...", "UseManagedIdentity": false }, "Embeddings": { "Endpoint": "...", "DeploymentName": "text-embedding-3-small", "Dimensions": 1536 }, "FoundryLimits": { "MaxConcurrentRequests": 1, "RequestsPerMinute": 6, "MaxOutputTokens": 600 }, "Mother": { "A2A": { "Enabled": true, "KnowledgeAgentUrl": "http://localhost:8080" } } }, "Knowledge": { "VectorStore": "SqlServer" }