SpotAgentIQ

Reference

Every config field, command and endpoint.

Config file

spotagentiq.json. Values in token, slack_webhook and upstream env support ${ENV_VAR} expansion.

FieldDefaultMeaning
agentagentName shown in logs, the inbox and Slack.
principalThe person the agent acts for, e.g. ops@acme.com. Recorded on every entry.
listenInbox address, e.g. :8484. Required if any rule (or the default) needs approval.
public_urlfrom listenHow people reach the inbox. Used in Slack links.
token$SPOTAGENTIQ_TOKENInbox password.
log_pathspotagentiq.audit.jsonlAudit log file.
approval_timeout10mHow long a held call waits. Go duration: 90s, 10m, 1h.
default_actionallowallow, require_approval or deny when no rule matches.
slack_webhookIncoming-webhook URL for held-call alerts.
upstreams[]MCP servers to launch: name, command, args, env, cwd. At least one; names must be unique.
rules[]See Policies.
redact[]Argument keys masked in logs, inbox and Slack. Case-insensitive, any depth.

Command line

CommandWhat it does
spotagentiq serve --config FILERun as an MCP server over stdio. This is what your MCP client launches. Logs go to stderr; stdout is the protocol.
spotagentiq initPrint a starter config.
spotagentiq verify --log FILE [--json]Check the hash chain. Exit 0 if intact, 3 if not.
spotagentiq export --log FILEWrite the log as CSV to stdout.
spotagentiq demo [--listen :8484]Guided demo with a fake tool server and scripted agent.
spotagentiq versionPrint the version.

HTTP API

Served on listen. Every endpoint except /healthz needs Authorization: Bearer <token> (or ?token=).

EndpointReturns
GET /api/statePending calls, recent decisions, the last 100 log entries and chain status.
POST /api/decideBody {"id","decision":"approve"|"reject","approver","note"}.
GET /api/log?limit=NRaw log entries.
GET /api/verifyChain check result.
GET /api/policyThe compiled rules.
GET /export.csv?since=&until=CSV export. Bounds are RFC 3339 timestamps.
GET /healthzLiveness.

Approving from your own tooling, such as a chat bot or an on-call pager, is a POST /api/decide away.

curl -X POST -H "Authorization: Bearer $SPOTAGENTIQ_TOKEN" \
  -d '{"id":"c_7f3a","decision":"approve","approver":"priya"}' \
  http://localhost:8484/api/decide

Docker

docker build -t spotagentiq .
docker run -p 8484:8484 -e SPOTAGENTIQ_TOKEN=... \
  -v $PWD/spotagentiq.json:/etc/spotagentiq.json \
  -v spotagentiq-audit:/var/lib/spotagentiq spotagentiq

SpotAgentIQ launches upstreams as child processes, so the image needs whatever they need. The default image includes Node and Python, which covers npx and uvx servers. Put the inbox behind your VPN or a TLS reverse proxy.