MCP Server
Dynoxide includes a built-in MCP (Model Context Protocol) server with 34 tools. Your coding agent can create tables, query data, manage snapshots, and more - all without leaving the conversation.
Setup for Claude Code
Add this to your MCP configuration:
{
"mcpServers": {
"dynoxide": {
"command": "dynoxide",
"args": ["mcp", "--db-path", "dev.db"]
}
}
}
The agent now has full DynamoDB access through Dynoxide.
Setup for Cursor
Same config format. Add it to your Cursor MCP settings with the dynoxide mcp command.
Streamable HTTP transport
If you prefer HTTP over stdio:
dynoxide mcp --http --port 19280
As of v0.10.0 the HTTP transport requires a bearer token on every request - the stdio setup above is unaffected. On a loopback bind, Dynoxide generates a token the first time you run it, saves it to a per-user config file (~/.config/dynoxide/mcp-token on Linux, ~/Library/Application Support/dynoxide/mcp-token on macOS), and prints a ready-to-paste client snippet. Later runs reuse it silently.
Point your agent at the /mcp endpoint and send the token in an Authorization header:
{
"mcpServers": {
"dynoxide": {
"type": "http",
"url": "http://127.0.0.1:19280/mcp",
"headers": { "Authorization": "Bearer <token>" }
}
}
}
Upgrading from before v0.10.0? Existing HTTP clients break until you add that Authorization header. The stdio transport needs no changes.
Binding beyond loopback
The server binds to 127.0.0.1 by default. To reach it from elsewhere - another container, say - bind a wider host and set a token explicitly. A non-loopback bind won't start without one:
dynoxide mcp --http --host 0.0.0.0 --token "$DYNOXIDE_MCP_AUTH_TOKEN"
| Flag | What it does |
|---|---|
--token / DYNOXIDE_MCP_AUTH_TOKEN |
Use a fixed token instead of the persisted one. Required for any non-loopback bind. |
--host |
Bind beyond 127.0.0.1. |
--allowed-host |
Accept an extra Host header by name (repeatable) - needed to reach it by hostname. |
--no-auth |
Disable auth. Loopback binds only. |
Prefer the environment variable or the persisted file over --token - flag values leak into shell history and ps. On the serve subcommand these flags are prefixed (--mcp-host, --mcp-token, and so on) because serve already owns --host/--port for the DynamoDB server.
The transport also checks the Host and Origin headers against an allowlist, closing the DNS-rebinding and cross-origin gaps a loopback server can otherwise expose. The full threat model is in SECURITY.md.
Available tools
The 34 tools are grouped by category:
| Category | Tools | What they do |
|---|---|---|
| Tables | 5 | Create, describe, list, update, delete tables |
| Items | 4 | Get, put, update, delete individual items |
| Batch | 3 | Batch get, batch write, bulk put (up to 10K items) |
| Query & Scan | 2 | Query with key conditions and filters, full table scans |
| Transactions | 2 | Atomic multi-item reads and writes |
| PartiQL | 3 | SQL-like queries via ExecuteStatement |
| TTL | 3 | Manage time-to-live settings and sweep expired items |
| Streams | 4 | List, describe, and read DynamoDB Streams |
| Snapshots | 4 | Point-in-time backups and rollback |
| Tags | 3 | Tag and untag resources |
| Info | 1 | Database size, table count, storage mode |
Safety controls
For read-only access (good for pointing at production snapshots):
dynoxide mcp --read-only --db-path prod-snapshot.db
To cap response sizes:
dynoxide mcp --max-items 100 --max-size-bytes 65536
Data model context
If you're using a single-table design with OneTable, you can pass the schema so the agent understands your entity model:
dynoxide mcp --data-model schema.json
The agent will see entity names, key templates, and GSI mappings in its instructions. This is context only - Dynoxide doesn't validate writes against the schema.