goose.maniak.ai · customer-clean demo runbook

See it happen. One story at a time.

Each demo is built so a customer can follow live output without reading the code: why it matterswhat to watchwhat proves it. Terminal harnesses print the same card. Clone the repo, stay on the worker LAN, run from scripts/ or ./scripts/lab-menu.sh.

worker 172.16.10.155 UI :30854 · Entra proxy :30160 · MCP :31606 menu lab-menu.sh

#Watch the story (customer cards)

Pick a card. Run the one-liner. Keep eyes on the status line the harness highlights — green pass, red block. No slide deck required.

Presenter tip

Full-screen terminal · run ./scripts/lab-menu.sh · open a number for the story card · press r to run live. Web diagrams: diagrams.html · Mermaid: docs/flows.md.

Safety · Phase A

Guardrails

Apps should not re-implement injection, PII, and secret filters.

WatchStep 1 green 200 · steps 2–5 red 403/422
ProveSame URL — clean prompt reaches the model; attacks never do
Client → /guard-demo → promptGuard → OpenAI
Routing · Phase B

Body-based model routing

One app URL; many models and providers behind it.

WatchSame path · change model string · every step stays 200
Provemock · nano · mini · grok · gemini · missing→fallback
Client → /route-by-model → body.model → providers
Fair use · Phase B

Token rate limit

One chatty client can burn the team budget.

WatchBurst calls · then HTTP 429 appears
ProveAt least one 429 before the provider bill runs away
Client → /token-rl → token RL → model (if under limit)
MCP platform · Phase C

OpenAPI → MCP

Turn any OpenAPI surface into agent tools in minutes.

Watchtools/list shows weather · tools/call returns forecast JSON
ProveLive Open-Meteo through MCP — no custom server code
MCP client → /openapi-mcp → OpenAPI→MCP → REST
MCP platform · Phase C

Composable MCP

Agents should not stitch multi-API workflows themselves.

WatchOne tools/call · merged account + orders brief
Proveaccount-brief fans out at the gateway
Client → account-brief → accounts + orders → merge
Federation

Virtual MCP

Agents should not dual-connect every MCP server.

WatchPrefixed tools from both backends in one list
Proveecho call returns your message · 1 session · 2 backends
Client → /mcp :31606 → everything + website-fetcher
Federation · RBAC

Virtual MCP — group RBAC

Same endpoint, different tools by Azure group — no per-user wiring.

Watchplatform sees all tools · sales sees only weather + echo
Proveflip group → tools/list changes; getWeatherForecast works for both
Client → Entra JWT → /mcp-rbac :31606 → everything + weather (CEL on jwt.groups)
Identity · Phase E

Entra JWT on LLM

Models need the same enterprise identity as tools.

WatchNo token → 401 · with az token → 200
ProveHTTP status flips with Authorization only
Client → Bearer Entra → /secure-openai → OpenAI
Edge · Phase E

WAF first-pass

Classic injection still hits AI endpoints.

WatchClean → green 200 · injection/DAN → red 403
ProveStatus alone — easy for the room to follow
Client → /waf-demo → WAF → model path
Cost · IDE

Who spent what

Finance needs spend by app, not only by user.

WatchGreen OK per virtual key · then Cost UI
Provealice → Client: Claude Code vs OpenCode vs lab
IDE / script → VK → /vk-openai → Cost hierarchy
customer path · full workshop in one go
./scripts/lab-menu.sh                 # story cards + run live
./scripts/test-workshop-phases.sh all # A safety → B routing → C MCP → E identity
./scripts/test-virtual-mcp.sh         # federation showpiece
./scripts/test-cost-vk.sh clients     # then open UI Cost Management

#Quick start (presenter)

clone + top demos
git clone https://github.com/sebbycorp/k8s-goose.git && cd k8s-goose

# Feature menu — customer story cards + live run (recommended)
./scripts/lab-menu.sh              # open number · r = run · s = story only
./scripts/lab-menu.sh diagrams     # problem→solution in terminal
./scripts/lab-menu.sh pitch        # 15‑min guided path
./scripts/lab-menu.sh prereqs      # az / kubectl / LAN

# 1) Multi-hop identity (passthrough → STS impersonation → Entra OBO)
./scripts/test-identity-hops.sh

# 2) Entra OBO deep dive (Graph /me)
./scripts/test-entra-obo.sh

# 3) Virtual MCP federation (open /mcp — multi-backend tools)
./scripts/test-virtual-mcp.sh

# 4) MCP security (JWT + tool RBAC + rate limit)
./scripts/entra-mcp-groups.sh set platform
./scripts/test-mcp-security.sh all

# 5) LLM P2C load balance + failover
./scripts/test-llm-lb-failover.sh all

# 6) LLM smoke (all providers)
./scripts/test-llm-gateways.sh all

# 7) Budgets / virtual keys
./scripts/test-budget-teams.sh status
./scripts/test-cost-vk.sh all
Prereqs

On-LAN to 172.16.10.155 · az login (Entra demos) · kubectl context maniak-goose for cluster ops · Graph consent once for OBO: ./scripts/configure-entra-obo.sh

Feature menu (aligned with docs.solo.io/agentgateway): ./scripts/lab-menu.sh — pillars, explanations, and live runs. Guided: pitch · diagrams (problem→solution) · groups · prereqs · help. Web visuals: diagrams.html.

#Identity & credentials

How identity survives multi-hop agent calls without collapsing into one token.

DemoScript / pageEndpointProves
Identity hops ./scripts/test-identity-hops.sh
identity.html
:30160/identity/passthrough
:30160/identity/impersonate
Passthrough Entra JWT vs STS impersonation (same sub, no act) + optional Graph OBO
Entra OBO ./scripts/test-entra-obo.sh
mcp-gateway#entra-obo
:30160/graph-me Middle-tier JWT → Entra jwt-bearer OBO → Graph /me
Elicitations ./scripts/test-elicitation.sh
elicitations.html
agentgateway-elicit NodePort /github-elicit
UI /age/elicitations/
Runtime OAuth handshake; dedicated STS path (not OBO)

#MCP gateway security

DemoScript / pageEndpointProves
Virtual MCP ./scripts/test-virtual-mcp.sh
mcp-gateway.html
:31606/mcp Federation: mcp-server-everything-3001_* + mcp-website-fetcher_* tools in one session (namespaced by target)
Virtual MCP — group RBAC ./scripts/test-virtual-mcp-rbac.sh
mcp-gateway.html
:31606/mcp-rbac CEL on jwt.groups filters tools/list: platform → everything + weather; sales → weather + echo only
MCP secure ./scripts/test-mcp-security.sh
mcp-gateway.html
:31606/mcp-secure Entra JWT · tool RBAC (platform/sales) · rate limit
Persona flip ./scripts/entra-mcp-groups.sh set platform|sales Entra groups + Mcp.Admin / Mcp.User
Claude Code ./scripts/claude-code-mcp-secure.sh same /mcp-secure Register goose-mcp-entra (project: k8s-goose)
Open MCP :31606/mcp Federated demo servers (no client auth)

#LLM gateway

DemoScript / pageEndpointProves
Provider smokes ./scripts/test-llm-gateways.sh all
llm-gateway.html
/openai · /grok · /spark · /anthropic · /gemini · /gpt56 Each provider path returns chat completion
P2C load balance ./scripts/test-llm-lb-failover.sh lb
#lb-failover
:30160/llm-lb OpenAI gpt-5.5 + xAI grok in one priority group
Model failover ./scripts/test-llm-lb-failover.sh failover
… failover-force
:30160/llm-failover Priority: gpt-5.5 → grok → claude + health eviction
AWS Bedrock smoke ./scripts/test-bedrock.sh /bedrock Claude Sonnet 4.5 via Bedrock (us-east-2) · long-term API key (bearer), not SigV4
Bedrock P2C load balance ./scripts/test-bedrock-lb.sh :30160/bedrock-lb Nova Pro + Nova Lite + Llama 3.3 70B in one group · single bearer key
Bedrock failover ./scripts/test-bedrock-failover.sh
… failover-force
:30160/bedrock-failover Priority: Sonnet 4.5 → Nova Pro → Llama 3.3 70B + health eviction (5xx/429, 15s)
Budgets / VK ./scripts/test-budget-teams.sh
./scripts/test-cost-vk.sh
docs/budgets.md
/budget-demo · /vk-openai Token/USD limits · virtual keys · UI Within/Exceeding

#Workshop-gap suite (Mermaid)

FE enterprise workshop demos on goose — Entra only, no Figma/Auth0/Okta/Keycloak. Diagrams: docs/flows.md · LLM flows · MCP flows.

suite map · test-workshop-phases.sh
flowchart TB
  S[test-workshop-phases.sh] --> A[Phase A safety + APIs]
  S --> B[Phase B routing + token RL]
  S --> C[Phase C OpenAPI + composable]
  S --> E[Phase E Entra JWT + WAF]
  A --> A1[/guard-demo]
  A --> A2[/enrich-demo]
  A --> A3[stream + embeddings]
  B --> B1[/route-by-model]
  B --> B2[/token-rl]
  C --> C1[/openapi-mcp]
  C --> C2[/composable]
  E --> E1[/secure-openai]
  E --> E2[/waf-demo]
PhaseScriptEndpointProves
A ./scripts/test-workshop-phases.sh a /guard-demo · /enrich-demo · stream · /embeddings promptGuard · enrichment · SSE · embeddings
B ./scripts/test-workshop-phases.sh b /route-by-model · /token-rl body.model routing · token 429
C ./scripts/test-workshop-phases.sh c :31606/openapi-mcp · /composable OpenAPI→MCP · multi-backend tool
E ./scripts/test-workshop-phases.sh e /secure-openai · /waf-demo Entra on LLM · WAF first-pass
full suite
./scripts/test-workshop-phases.sh all
./scripts/lab-menu.sh   # workshop items under LLM / MCP

#Deep-dive pages

Platform map

Architecture, sync waves, CRDs, budget story, full endpoint table.

Identity hops

Impersonation vs delegation vs Entra OBO; whoami claims proof.

LLM gateway

Providers, budgets, virtual keys, LB/failover, config browser.

MCP gateway

JWT · tool RBAC · rate limit · Entra OBO Graph demo.

Elicitations

STS URL-mode OAuth, Solo UI /age/elicitations, github-elicit.

Flight · NetOps · Dispatch

kagent agents: drone tool modes, Forti/F5, Telegram + scheduler.

GitHub

Manifests and scripts live in sebbycorp/k8s-goose. Site is GitHub Pages from main (CNAME → goose.maniak.ai). After push, allow a minute for Pages to refresh.