Inventory demo app that combines:
- React frontend
- ASP.NET Core backend
- SQLite persistence
- Model Context Protocol (MCP) tools
- LM Studio-compatible local LLM
- Browser-native speech-to-text and text-to-speech (Web Speech API)
- Frontend:
client(Vite + React) - Backend:
server(ASP.NET Core + Dapper + SQLite) - Database:
db/001_schema.sql,db/002_seed.sql - Prompts:
SYSTEM_PROMPT.mdSTARTUP_PROMPT.mdFEW_SHOT_PROMPTS.json
The backend serves both API endpoints and MCP tools at /mcp.
The chat layer proxies completions to an OpenAI-compatible endpoint (LM Studio by default).
- Docker Desktop (for containerized run)
- LM Studio local server running on
http://localhost:1234 - macOS, Windows, or Linux
Copy .env.example to .env (only if .env does not exist yet).
Default .env values:
LLM_BASE_URL=http://host.docker.internal:1234
LLM_MODEL=auto
LLM_COMPLETION_PATH=/v1/chat/completions
LLM_HEALTH_PATH=/v1/models
MCP_SERVER_URL=http://localhost:8080/mcpLLM_MODEL=auto means the backend picks the first model returned by GET /v1/models.
macOS:
chmod +x scripts/*.command
./scripts/start.commandWindows:
scripts\start.batLinux:
cp -n .env.example .env
mkdir -p docker/data/sqlite
docker compose up -d --buildApp URL: http://localhost:8080
Stop:
- macOS:
./scripts/stop.command - Windows:
scripts\stop.bat - Linux:
docker compose down
Linux note: if LM Studio is running on your host machine (not in Docker), set LLM_BASE_URL in .env to a host-reachable address like http://172.17.0.1:1234 instead of host.docker.internal.
- Stop app container:
docker compose stop app- Run backend:
cd server
dotnet run- Run frontend:
cd client
npm install
npm startDev URLs:
- Frontend:
http://localhost:5173 - Backend:
http://localhost:5184
- Inventory management (list/create/update/delete)
- Inventory transaction log
- Chat assistant with MCP tool calling
- Orders workflow:
- create multi-item orders
- append items to latest order across turns
- view orders page with expandable order lines
- Browser STT/TTS voice interaction (no Whisper/Piper containers)
GET /api/healthGET /api/configGET /api/itemsGET /api/items/{id}GET /api/items/validate-sku?sku=...POST /api/itemsPUT /api/items/{id}DELETE /api/items/{id}GET /api/transactionsGET /api/ordersGET /api/orders/latestGET /api/orders/{orderNumber}POST /api/ordersPOST /api/orders/latest/itemsPOST /api/chat/completeGET /api/chat/system-promptGET /api/chat/hello-promptGET /api/chat/few-shot-prompts
inventory_list_itemsinventory_search_statusinventory_add_transactionorders_get_latestorders_createorders_add_items_to_latest
The diagnostics page in the app can help troubleshoot issues with configuration and running services.
- Verify LM Studio is reachable:
http://localhost:1234/v1/models - If chat works but tool calling fails, verify backend MCP URL config:
MCP_SERVER_URL=http://localhost:8080/mcp
- If no seed data appears, check DB volume at
docker/data/sqlite
- Confirm tools are installed:
docker,docker compose,dotnet,node,npm. - Ensure
.envexists (cp -n .env.example .env). - For Linux + Docker + host LM Studio, verify
LLM_BASE_URLis reachable from containers. - Use diagnostics page at
http://localhost:8080/diagnosticsfor quick health checks.
SYSTEM_PROMPT.mdSTARTUP_PROMPT.mdFEW_SHOT_PROMPTS.jsondb/002_seed.sqlserver/appsettings.jsonclient/src/styles.css
mainis the English baseline (en-US).es-MXkeeps Spanish locale defaults and prompts.- To sync feature changes from
mainintoes-MXwhile preserving Spanish locale files:
git switch es-MX
./scripts/merge-main-into-es-mx.sh
git push