The distinction that decides your bill is `query-table` against `scan-table`: a query is bounded by `keyConditionExpression` and can be pointed at a secondary index through `indexName`, while a scan reads the table and applies `filterExpression` afterwards. `count-items` answers a how-many question without moving the items across the wire. `paginate-query-table` takes a narrower argument list than `query-table` — no `indexName`, no `limit`, no `filterExpression` — so a paged read gives up the index target and the filter that the single-shot query accepts.
A read-only DynamoDB client exposing `list-tables`, `describe-table`, `get-item`, `query-table`, `paginate-query-table`, `scan-table` and `count-items`.
- Discovery before access: `list-tables` returns the table names in the account, and `describe-table` returns the detail of a single table by `tableName`.
- Key-addressed reads through `get-item`, which takes the `key` and the `tableName` and returns that item.
- Condition-bounded reads through `query-table`, which takes a `keyConditionExpression` with `expressionAttributeValues`, can be aimed at a secondary index via `indexName`, and narrows the result with `filterExpression`, `projectionExpression` and `limit`.
- Whole-table reads through `scan-table`, under the same `filterExpression`, `projectionExpression` and `limit` controls.
- `paginate-query-table` for a query whose result set runs past a single response.
- `count-items`, which returns how many items match a `filterExpression` without returning the items themselves.
AWS credentials for the account holding the tables — AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY — plus the region those tables live in as AWS_REGION.
One command plus a key — npx -y @smithery/cli install @jjikky/dynamo-readonly-mcp --client claude, then supply credentials
