
brewup/brewuperp
Analytics & monitoring이 페이지는 AI로 자동 번역되었습니다. 기술적인 세부 사항은 원문을 확인하세요. 원문 보기
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 |
설치
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" }