CLI Reference
Dynoxide has four subcommands: serve (the default), mcp, import, and healthcheck.
Running dynoxide with no subcommand is the same as dynoxide serve, and the bare form accepts --host, --port, --db-path, --encryption-key-file and --schema directly. Those top-level flags exist only for that form. Combining one with an explicit subcommand is a parse error rather than a silent no-op:
dynoxide --port 8000 # fine - bare form
dynoxide serve --port 8000 # fine - flag belongs to the subcommand
dynoxide --db-path data.db serve # error: the flag is ignored, so it's rejected
serve
Starts the DynamoDB-compatible HTTP server.
dynoxide --port 8000
dynoxide serve --db-path data.db --port 8000
| Flag | Default | Description |
|---|---|---|
--host |
127.0.0.1 |
Bind address |
--port |
8000 |
HTTP port |
--db-path |
(in-memory) | SQLite file for persistent storage |
--encryption-key-file |
none | File holding the encryption key (needs an encrypted build) |
--schema |
none | DescribeTable JSON; creates the tables on startup |
--mcp |
off | Also start the MCP server over Streamable HTTP |
--mcp-host |
127.0.0.1 |
Bind address for the MCP transport |
--mcp-port |
19280 |
Port for the MCP transport |
--mcp-token |
(persisted) | Bearer token for MCP. Also DYNOXIDE_MCP_AUTH_TOKEN |
--mcp-no-auth |
off | Disable MCP authentication. Loopback binds only |
--mcp-allowed-host |
none | Extra Host header to accept (repeatable) |
--mcp-read-only |
off | Restrict MCP to read-only operations |
--mcp-data-model |
none | OneTable schema file for MCP data model context |
Pre-creating tables with --schema
--schema takes the same DescribeTable JSON that import --schema does, and creates each table in it on startup, skipping any that already exist. It pre-populates an empty database with the right structure without running an import first:
aws dynamodb describe-table --table-name Users > schema.json
dynoxide --schema schema.json --db-path dev.db
mcp
Starts the MCP (Model Context Protocol) server for coding agents. See the MCP docs for the full setup guide, including the bearer-token requirement on the HTTP transport.
dynoxide mcp
dynoxide mcp --http --port 19280
Stdio transport is the default. Use --http for the Streamable HTTP transport.
| Flag | Default | Description |
|---|---|---|
--db-path |
(in-memory) | SQLite file for persistent storage |
--encryption-key-file |
none | File holding the encryption key (needs an encrypted build) |
--http |
off | Use Streamable HTTP instead of stdio |
--host |
127.0.0.1 |
Bind address (requires --http) |
--port |
19280 |
Port for the HTTP transport |
--token |
(persisted) | Bearer token. Also DYNOXIDE_MCP_AUTH_TOKEN |
--no-auth |
off | Disable authentication. Loopback binds only |
--allowed-host |
none | Extra Host header to accept (repeatable) |
--read-only |
off | Reject all write operations |
--max-items |
none | Cap the number of items query and scan return |
--max-size-bytes |
none | Cap the response size for query and scan |
--data-model |
none | OneTable schema file for data model context |
--data-model-summary-limit |
20 |
Entities shown in the instructions summary (0 suppresses) |
On serve these same flags carry an --mcp- prefix, because serve already owns --host and --port for the DynamoDB server.
import
Imports data from a DynamoDB Export (the S3 export format). Useful for creating local snapshots of production data. See the import guide for the anonymisation rules format and the export directory layout.
dynoxide import \
--source ./export-data/ \
--schema schema.json \
--output snapshot.db
--source points at the directory of exported JSON files, and --schema takes DescribeTable JSON.
| Flag | Default | Description |
|---|---|---|
--source |
(required) | Directory of DynamoDB Export files |
--schema |
(required) | DescribeTable JSON for the tables being imported |
--output |
none | SQLite file to write. Conflicts with --serve and --mcp |
--rules |
none | Anonymisation rules TOML file |
--tables |
(all) | Comma-separated list of tables to import |
--compress |
off | Compress the output with zstd (requires --output) |
--force |
off | Overwrite an existing output file |
--continue-on-error |
off | Carry on when a batch fails instead of aborting |
--serve |
off | Import to memory and start an HTTP server |
--mcp |
off | Import to memory and start an MCP server |
Anonymisation is built in - mask, hash, redact, or replace fields with fake data:
dynoxide import \
--source ./export/ \
--schema schema.json \
--rules rules.toml \
--output anonymised.db
The rules file is TOML. Available actions are fake, mask, hash, redact, and null. The import guide covers the format, the generator list, and how to keep a value consistent across tables.
healthcheck
Probes a running server for liveness. The Docker image uses it for its HEALTHCHECK directive, and it works as a Kubernetes readiness or liveness probe.
dynoxide healthcheck --port 8000
| Flag | Default | Description |
|---|---|---|
--host |
127.0.0.1 |
Host to probe. Wildcards (0.0.0.0, ::) are rewritten to loopback |
--port |
8000 |
Port to probe |
--timeout |
3 |
Total deadline in seconds for the whole probe |
--host and --port also read DYNOXIDE_HEALTHCHECK_HOST and DYNOXIDE_HEALTHCHECK_PORT, so a container that overrides CMD can point the probe somewhere else with -e DYNOXIDE_HEALTHCHECK_PORT=....