Onboarding

Lab up in
four commands.

Generate secrets, start Compose, open the UI, then hit REST and MCP with the same bearer. Canonical write-up: docs/QUICKSTART.md.

Clone and generate

git clone https://github.com/hilather/go-lab-tacacs-mcp.git
cd go-lab-tacacs-mcp
go run ./tools/labgen deployments/compose

Writes config/taclab.yaml, lab PKI, and secrets/api_admin_token. Nothing secret is committed. Force regenerate with -force.

Start the appliance

docker compose -f deployments/compose/compose.yaml up -d --build
curl -sf http://127.0.0.1:8080/health/ready && echo ready

Need TLS-only TACACS? Add -f deployments/compose/compose.tls-only.yaml. No privileged ports? Use compose.smoke.yaml.

Open the UI

Browse to http://127.0.0.1:8080 and paste the contents of deployments/compose/secrets/api_admin_token. The SPA exchanges it for an HttpOnly cookie. It never parks the raw token in localStorage.

REST and MCP

TOKEN=$(tr -d '\n' < deployments/compose/secrets/api_admin_token)

curl -sS http://127.0.0.1:8080/api/v1/status \
  -H "Authorization: Bearer ${TOKEN}"

curl -sS http://127.0.0.1:8080/mcp \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "MCP-Protocol-Version: 2026-07-28" \
  -H "Mcp-Method: tools/list" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientCapabilities":{}}}}'

Wire Claude, Cursor, or VS Code: MCP local & remote. There is no OAuth discovery document.

Reset

Runtime overlay is memory-only. POST /api/v1/runtime/reset or a container recreate restores the YAML baseline. make lab-test is the acceptance suite.

Configure users and groups

Durable AAA is files: config/taclab.yaml plus secrets/. User id is the TACACS login. Stock personas after labgen: lab-admin (priv-lvl 15) and lab-readonly (priv-lvl 1). Full recipe: Users & groups · docs/BASELINE.md.