Demo Setup Guide

Get the SuiteCentral 2.0 demo running in under 5 minutes

Back to Demo Guide

Prerequisites

1

Install Dependencies

npm install
2

Build the Project

npm run build
3

Start in Demo Mode

npm run dev:demo

Uses demo-safe defaults (including local embeddings) and starts on port 3000 by default with automatic fallback to 3001/3002 if occupied.

4

Verify

5

Tier 1 + Tier 2 + MCP Tier 3 API Smoke Tests

Run these commands in a second terminal while the app is running.

Create a dev JWT for compliance endpoints:

TOKEN=$(node -e "const jwt=require('jsonwebtoken');console.log(jwt.sign({sub:'demo-user',username:'demo',roles:['admin'],permissions:['*']},process.env.JWT_SECRET||'test-jwt-secret-for-development-only',{expiresIn:'1h'}));")

Tier 1 checks:

curl -H "Authorization: Bearer $TOKEN" http://localhost:3000/api/compliance/summary
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"format":"json"}' http://localhost:3000/api/compliance/export

Tier 2 checks:

curl http://localhost:3000/api/context/netsuite/vendor/V-001
curl http://localhost:3000/api/ai/proxy/mcp/tools
curl -X POST -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \
  http://localhost:3000/api/ai/proxy/mcp

MCP Tier 3 checks:

# Gateway discovery (when MCP_GATEWAY_ENABLED=true)
curl -X POST -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"suitecentral.mcp_discover","arguments":{}}}' \
  http://localhost:3000/api/ai/proxy/mcp

# Tenant MCP policy snapshot (auth required)
curl -H "Authorization: Bearer $TOKEN" \
  http://localhost:3000/api/mcp/policies

Scripted contract/smoke verification:

npm run mcp:contract
npm run mcp:smoke
6

NL Action Gate: Parse → Propose → Approve → Execute

This verifies the Tier 2 live action flow (not stubbed behavior).

1) Parse intent:

curl -s -X POST -H "Content-Type: application/json" \
  -d '{"input":"cancel subscription SUB-001"}' \
  http://localhost:3000/api/nl-action-gate/parse

2) Propose action:

curl -s -X POST -H "Content-Type: application/json" \
  -d '{"input":"cancel subscription SUB-001"}' \
  http://localhost:3000/api/nl-action-gate/propose

3) Approve and execute (replace ACTION_ID):

curl -s -X POST -H "Content-Type: application/json" \
  -d '{"userId":"demo-user"}' \
  http://localhost:3000/api/nl-action-gate/actions/ACTION_ID/approve

curl -s -X POST \
  http://localhost:3000/api/nl-action-gate/actions/ACTION_ID/execute

If no active/pending subscription exists for the demo ID, the request still proves service dispatch through structured error codes.

Troubleshooting

"Cannot GET" errors

HTML files must be registered in src/middleware/setup/RouteSetup.ts. Add the filename to the htmlFiles array and rebuild.

Port conflicts

Kill zombie processes:

# Windows
taskkill /F /IM node.exe

# Unix / WSL
pkill -f "node.*index"

AI features without API keys

Demo mode provides deterministic fallback data for all AI-powered features. No API keys are required to explore the demo.

Optional: Docker

docker-compose up --build
# Access at http://localhost:3003

Docker always uses port 3003 to avoid WSL2 port conflicts.