Documentation
CLI reference
Every command below comes straight from the titlebase command registry, the same one that feeds the MCP server and the app. Generated from tbase commands --json (commit 25618372).
Conventions
tbase <group> <verb> <file> [flags]
- The plant file comes first. It can be a
.titlebase file or a PropertySync .db export. --json prints one JSON document on stdout and nothing else. Without it you get readable text.- Progress and timing go to stderr.
- Errors exit with status 1. With
--json they print {"error":{"code":...,"message":...}}. - No command prompts. Every command is safe to script.
- List commands page by row id. Pass the previous result's
next_after_id as --after-id. Sorted results page with next_cursor and --cursor. - Write commands never touch the plant file. Each is one journaled run beside it, and reports its
run_id so it can be undone. --no-window is accepted everywhere, so a script never opens the app window.
tbase file info
Read onlyMCP tool file_info
Show a plant file's size, page size, row counts per table and any extra tables.
tbase file info [OPTIONS] <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
--exact | boolean | false | Count every row instead of using the highest id (slow on big plants). |
JSON output
| Field | Type | Description |
|---|
file | string | |
bytes | integer | |
page_size | integer | |
rows | object | |
rows_are | string | `exact` (counted) or `highest_id` (instant estimate; ids are dense). |
extra_tables | string[] | Tables that are not part of titlebase v1 (indexes, side tables). |
tbase docs get
Read onlyMCP tool docs_get
Fetch one document by UUID or row id, with its full stored JSON.
tbase docs get [OPTIONS] <FILE> <ID>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
<ID> | string | required | Document UUID, or SQLite row id (all digits). |
JSON output
| Field | Type | Description |
|---|
id | integer | SQLite row id. |
uuid | string | |
shape | "Envelope" | "EnvelopeEmpty" | "Flat" | "NotObject" | "InvalidJson" | How a row's JSON is laid out. |
bytes | integer | Stored size of the row. |
found_by | "rowid" | "uuid_order" | "uuid_scan" | "journal" | How the document was found. |
row | any | The whole stored row as JSON (envelope or flat), unchanged. |
raw | string | The stored text, only when it is not valid JSON. |
journal | object | Present when the row comes from the edit journal, not the plant. |
tbase docs list
Read onlyMCP tool docs_list
List documents in row id order, or sorted by any indexed column, one summary line each, with keyset paging.
tbase docs list [OPTIONS] <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
--limit | integer | 50 | Documents per page, 1 to 1000. |
--after-id | integer | | Start after this row id (the previous page's next_after_id). |
--sort | uuid | instrument_number | instrument_type | filed_date | instrument_date | book_type | book_number | page_number | consideration | market_source | case_number | loan_number | ucc_number | indexing_record_id | has_image | "id" | | Sort column (default id). Anything but id needs the sidecar index. |
--direction | asc | desc | | Sort direction (default asc). |
--cursor | string | | Continue from a previous page's next_cursor (any sort). |
JSON output
| Field | Type | Description |
|---|
documents | object[] | |
next_after_id | integer | Pass as after_id for the next page when sorting by id; null on the last page. |
next_cursor | string | Pass as cursor for the next page (any sort); null on the last page. |
indexed | boolean | True when the sidecar index answered. |
tbase docs search
Read onlyMCP tool docs_search
Search documents by instrument number, type, filed dates, party, grantor, grantee, addition, lot, block, book and page, sorted by any column; all given filters must match. Uses the sidecar index when current, else scans.
tbase docs search [OPTIONS] <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
--instrument-number | string | | Instrument number, for example 2026-001 (case-insensitive). End with * for a prefix match: 2026-*. |
--type | string | | Instrument type code, for example WD (case-insensitive). |
--party | string | | Grantor or grantee name: last name starts with this, or with party_match contains, the full name contains it (case-insensitive). |
--addition | string | | Subdivision or acreage legal addition equals this (case-insensitive). |
--limit | integer | 50 | Matches to return, 1 to 1000. |
--after-id | integer | | Start after this row id (the previous page's next_after_id). |
--grantor | string | | A grantor's name (same matching as party). |
--grantee | string | | A grantee's name (same matching as party). |
--party-match | "prefix" | "contains" | | How party, grantor and grantee match (default prefix). |
--filed-from | string | | Filed on or after this date: YYYY, YYYY-MM or YYYY-MM-DD. |
--filed-to | string | | Filed on or before this date, inclusive: YYYY, YYYY-MM or YYYY-MM-DD. |
--lot | string | | Lot number or span (4, 3-5); matches overlapping lot ranges on the same legal as addition. Needs the sidecar index. |
--block | string | | Block number or span, like lot. Needs the sidecar index. |
--book | string | | Document book number. |
--page | string | | Document page number. |
--sort | uuid | instrument_number | instrument_type | filed_date | instrument_date | book_type | book_number | page_number | consideration | market_source | case_number | loan_number | ucc_number | indexing_record_id | has_image | "id" | | Sort column (default id). Anything but id needs the sidecar index. |
--direction | asc | desc | | Sort direction (default asc). |
--cursor | string | | Continue from a previous result's next_cursor (any sort). |
--count | boolean | false | Also return the total number of matches (needs the sidecar index). |
JSON output
| Field | Type | Description |
|---|
indexed | boolean | True when the sidecar index answered. |
engine | "scan" | "index" | How a search was answered. |
note | string | How the search ran and what that costs. |
documents | object[] | |
next_after_id | integer | Pass as after_id for more matches when sorting by id; null when there are no more. |
next_cursor | string | Pass as cursor for more matches (any sort); null when there are no more. |
total | integer | Every match, when count was asked for and the index answered. |
seconds | number | |
tbase ac list
Read onlyMCP tool ac_list
List autocomplete values (additions, surveys, instrument and book types), optionally of one type.
tbase ac list [OPTIONS] <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
--type | string | | Only this autocomplete type, for example addition, survey, instrumentType or bookType. |
--limit | integer | 500 | Entries per page, 1 to 10000. |
--after-id | integer | | Start after this row id (the previous page's next_after_id). |
JSON output
| Field | Type | Description |
|---|
entries | object[] | |
next_after_id | integer | Pass as after_id for the next page; null on the last page. |
tbase lv list
Read onlyMCP tool lv_list
List land validations (plat validation records by addition), optionally for one addition.
tbase lv list [OPTIONS] <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
--addition | string | | Only land validations for this exact addition. |
--limit | integer | 200 | Entries per page, 1 to 5000. |
--after-id | integer | | Start after this row id (the previous page's next_after_id). |
JSON output
| Field | Type | Description |
|---|
entries | object[] | |
next_after_id | integer | Pass as after_id for the next page; null on the last page. |
tbase check roundtrip
Read onlyMCP tool check_roundtrip
Prove titlebase can rewrite a plant byte for byte: re-emit every row with titlebase's JSON writers, and optionally write and compare a full copy to a new file.
tbase check roundtrip [OPTIONS] <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). Never modified. |
--table | documents | landvalidations | autocompletes | | Only check one table. |
--samples | integer | 3 | Mismatch samples to show per table. |
--copy-to | string | | Also write a full copy to this new path and compare every row. Refuses to overwrite an existing file. |
JSON output
| Field | Type | Description |
|---|
file | string | |
ok | boolean | True when every valid row re-emits byte-identical and the copy, if made, is identical. |
reemit | object[] | |
copy | object | |
tbase docs create
Writes, journaledMCP tool docs_create
Create a document with a new UUID, in the plant's row shape; journaled and undoable, the plant file is untouched until save.
tbase docs create [OPTIONS] <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
--fields | object | | The document's fields as a JSON object (the inner `json` of the envelope). A new UUID is generated; do not pass `id`. |
--set | string[] | | `path=value` to set on the new document; value is JSON when it parses, otherwise text. Repeatable. |
--label | string | | Label for the journal run (shown in changes list). |
JSON output
| Field | Type | Description |
|---|
changed | boolean | False when the edit matched the row already (nothing journaled). |
run_id | integer | Journal run of this command; undo it with `tbase changes undo FILE --run N`. |
ops | object[] | |
table | string | |
uuid | string | The row's UUID. |
rowid | integer | Plant row id; for a created row, the id Save will give it. |
row | any | The whole row as it reads now (envelope or flat); null after a delete. |
warnings | string[] | |
undo | string | The command that undoes this write. |
tbase docs update
Writes, journaledMCP tool docs_update
Edit a document's fields by UUID or row id (set or remove paths); keeps the row's shape and PropertySync style, journaled and undoable.
tbase docs update [OPTIONS] <FILE> <ID>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
<ID> | string | required | Document UUID, or row id (all digits). |
--set | string[] | | `path=value` to set (JSON Pointer `/grantors/0/nameLast` or dotted `grantors.0.nameLast`); value is JSON when it parses, otherwise text. Repeatable. |
--remove | string[] | | Path to remove. Repeatable. |
--patch | object | object[] | | Patch ops: `[{"op":"set","path":"/instrumentType","value":"WD"}, {"op":"remove","path":"/comment"}]`. Applied before set and remove. |
--label | string | | Label for the journal run (shown in changes list). |
--force-record-id | boolean | false | Allow changing or removing an existing indexingRecordId. It links the document to PropertySync; only set this when you mean to break or replace that link. |
JSON output
| Field | Type | Description |
|---|
changed | boolean | False when the edit matched the row already (nothing journaled). |
run_id | integer | Journal run of this command; undo it with `tbase changes undo FILE --run N`. |
ops | object[] | |
table | string | |
uuid | string | The row's UUID. |
rowid | integer | Plant row id; for a created row, the id Save will give it. |
row | any | The whole row as it reads now (envelope or flat); null after a delete. |
warnings | string[] | |
undo | string | The command that undoes this write. |
tbase docs delete
Writes, journaledMCP tool docs_delete
Delete a document by UUID or row id; journaled and undoable, the plant file is untouched until save.
tbase docs delete [OPTIONS] <FILE> <ID>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
<ID> | string | required | Document UUID, or row id (all digits). |
--label | string | | Label for the journal run (shown in changes list). |
JSON output
| Field | Type | Description |
|---|
changed | boolean | False when the edit matched the row already (nothing journaled). |
run_id | integer | Journal run of this command; undo it with `tbase changes undo FILE --run N`. |
ops | object[] | |
table | string | |
uuid | string | The row's UUID. |
rowid | integer | Plant row id; for a created row, the id Save will give it. |
row | any | The whole row as it reads now (envelope or flat); null after a delete. |
warnings | string[] | |
undo | string | The command that undoes this write. |
tbase ac create
Writes, journaledMCP tool ac_create
Add an autocomplete value of a type; refuses a duplicate of the same type and value. Journaled and undoable.
tbase ac create [OPTIONS] --type <TYPE> --value <VALUE> <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
--type | string | required | Autocomplete type, for example addition, survey, instrumentType, bookType, marketSource. |
--value | string | required | The value, for example SAMPLE ADDITION 5. |
--label | string | | Label for the journal run (shown in changes list). |
JSON output
| Field | Type | Description |
|---|
changed | boolean | False when the edit matched the row already (nothing journaled). |
run_id | integer | Journal run of this command; undo it with `tbase changes undo FILE --run N`. |
ops | object[] | |
table | string | |
uuid | string | The row's UUID. |
rowid | integer | Plant row id; for a created row, the id Save will give it. |
row | any | The whole row as it reads now (envelope or flat); null after a delete. |
warnings | string[] | |
undo | string | The command that undoes this write. |
tbase ac update
Writes, journaledMCP tool ac_update
Edit an autocomplete value (type, value or any path) by UUID or row id; journaled and undoable.
tbase ac update [OPTIONS] <FILE> <ID>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
<ID> | string | required | Autocomplete UUID, or row id (all digits). |
--type | string | | New type. |
--value | string | | New value. |
--set | string[] | | `path=value` to set; value is JSON when it parses, otherwise text. Repeatable. |
--remove | string[] | | Path to remove. Repeatable. |
--patch | object | object[] | | Patch ops as a JSON array; applied first. |
--label | string | | Label for the journal run (shown in changes list). |
JSON output
| Field | Type | Description |
|---|
changed | boolean | False when the edit matched the row already (nothing journaled). |
run_id | integer | Journal run of this command; undo it with `tbase changes undo FILE --run N`. |
ops | object[] | |
table | string | |
uuid | string | The row's UUID. |
rowid | integer | Plant row id; for a created row, the id Save will give it. |
row | any | The whole row as it reads now (envelope or flat); null after a delete. |
warnings | string[] | |
undo | string | The command that undoes this write. |
tbase ac delete
Writes, journaledMCP tool ac_delete
Delete an autocomplete value by UUID or row id; journaled and undoable.
tbase ac delete [OPTIONS] <FILE> <ID>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
<ID> | string | required | Autocomplete UUID, or row id (all digits). |
--label | string | | Label for the journal run (shown in changes list). |
JSON output
| Field | Type | Description |
|---|
changed | boolean | False when the edit matched the row already (nothing journaled). |
run_id | integer | Journal run of this command; undo it with `tbase changes undo FILE --run N`. |
ops | object[] | |
table | string | |
uuid | string | The row's UUID. |
rowid | integer | Plant row id; for a created row, the id Save will give it. |
row | any | The whole row as it reads now (envelope or flat); null after a delete. |
warnings | string[] | |
undo | string | The command that undoes this write. |
tbase lv create
Writes, journaledMCP tool lv_create
Create a land validation for an addition (empty platValidation unless given); journaled and undoable.
tbase lv create [OPTIONS] --addition <ADDITION> <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
--addition | string | required | The addition (subdivision) the land validation is for. |
--fields | object | | More fields as a JSON object, for example `{"platValidation":[{"status":"0","lot":[...]}],"bookNumber":"5"}`. |
--set | string[] | | `path=value` to set; value is JSON when it parses, otherwise text. Repeatable. |
--label | string | | Label for the journal run (shown in changes list). |
JSON output
| Field | Type | Description |
|---|
changed | boolean | False when the edit matched the row already (nothing journaled). |
run_id | integer | Journal run of this command; undo it with `tbase changes undo FILE --run N`. |
ops | object[] | |
table | string | |
uuid | string | The row's UUID. |
rowid | integer | Plant row id; for a created row, the id Save will give it. |
row | any | The whole row as it reads now (envelope or flat); null after a delete. |
warnings | string[] | |
undo | string | The command that undoes this write. |
tbase lv update
Writes, journaledMCP tool lv_update
Edit a land validation (addition or any path) by UUID or row id; journaled and undoable.
tbase lv update [OPTIONS] <FILE> <ID>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
<ID> | string | required | Land validation UUID, or row id (all digits). |
--addition | string | | New addition name. |
--set | string[] | | `path=value` to set (for example `platValidation.0.status=1`); value is JSON when it parses, otherwise text. Repeatable. |
--remove | string[] | | Path to remove. Repeatable. |
--patch | object | object[] | | Patch ops as a JSON array; applied first. |
--label | string | | Label for the journal run (shown in changes list). |
JSON output
| Field | Type | Description |
|---|
changed | boolean | False when the edit matched the row already (nothing journaled). |
run_id | integer | Journal run of this command; undo it with `tbase changes undo FILE --run N`. |
ops | object[] | |
table | string | |
uuid | string | The row's UUID. |
rowid | integer | Plant row id; for a created row, the id Save will give it. |
row | any | The whole row as it reads now (envelope or flat); null after a delete. |
warnings | string[] | |
undo | string | The command that undoes this write. |
tbase lv delete
Writes, journaledMCP tool lv_delete
Delete a land validation by UUID or row id; journaled and undoable.
tbase lv delete [OPTIONS] <FILE> <ID>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
<ID> | string | required | Land validation UUID, or row id (all digits). |
--label | string | | Label for the journal run (shown in changes list). |
JSON output
| Field | Type | Description |
|---|
changed | boolean | False when the edit matched the row already (nothing journaled). |
run_id | integer | Journal run of this command; undo it with `tbase changes undo FILE --run N`. |
ops | object[] | |
table | string | |
uuid | string | The row's UUID. |
rowid | integer | Plant row id; for a created row, the id Save will give it. |
row | any | The whole row as it reads now (envelope or flat); null after a delete. |
warnings | string[] | |
undo | string | The command that undoes this write. |
tbase changes list
Read onlyMCP tool changes_list
List rows created, updated and deleted in the edit journal (per table, with UUIDs, row ids, ops and changed paths) and recent runs.
tbase changes list [OPTIONS] <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
--table | documents | landvalidations | autocompletes | | Only this table. |
--detail | boolean | false | Include each row's JSON before and after. |
--runs | integer | 20 | How many recent runs to list. |
JSON output
| Field | Type | Description |
|---|
journal | string | The journal file; null when the plant has never been edited. |
counts | object | |
tables | object[] | |
runs | object[] | Recent runs, newest first. |
tbase changes revert
Writes, journaledMCP tool changes_revert
Revert journaled changes by op, run or row back to how the row was before (undoable with changes_redo).
tbase changes revert [OPTIONS] <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
--op | integer | | Revert this op. |
--run | integer | | Revert every active op in this run. |
--row | string | | Revert every change to this row (UUID or row id). |
--table | documents | landvalidations | autocompletes | | Table of `row` (default documents). |
JSON output
| Field | Type | Description |
|---|
action | string | `undo` or `redo`. |
ops | object[] | The ops undone (newest first) or redone (oldest first). |
runs | integer[] | Runs those ops belong to. |
reverse | string | The command that reverses this. |
tbase changes undo
Writes, journaledMCP tool changes_undo
Undo the newest run, or one op or run by id; an op can be undone only while it is the newest change to its row.
tbase changes undo [OPTIONS] <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
--op | integer | | Undo this op only. |
--run | integer | | Undo every active op in this run. |
JSON output
| Field | Type | Description |
|---|
action | string | `undo` or `redo`. |
ops | object[] | The ops undone (newest first) or redone (oldest first). |
runs | integer[] | Runs those ops belong to. |
reverse | string | The command that reverses this. |
tbase changes redo
Writes, journaledMCP tool changes_redo
Redo the run undone last, or one op or run by id; refused if the row changed since it was undone.
tbase changes redo [OPTIONS] <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
--op | integer | | Redo this op only. |
--run | integer | | Redo every undone op in this run. |
JSON output
| Field | Type | Description |
|---|
action | string | `undo` or `redo`. |
ops | object[] | The ops undone (newest first) or redone (oldest first). |
runs | integer[] | Runs those ops belong to. |
reverse | string | The command that reverses this. |
tbase changes export
Writes, journaledMCP tool changes_export
Write the journal's changes to a new batch folder: batch.json (PropertySync batch, updates with top-level id), autocompletes, land validations, deletions, changes.titlebase and a manifest.
tbase changes export [OPTIONS] <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
--out | string | | Folder to create the batch folder in (default: next to the plant). |
JSON output
| Field | Type | Description |
|---|
folder | string | The new folder, `<stem>-changes-<YYYYMMDD-HHMMSS>`. |
files | string[] | |
tables | object[] | |
batch_documents | integer | Documents in batch.json (updates carry a top-level id). |
last_op_id | integer | Highest journal op included. |
warnings | string[] | |
tbase file save
Writes, journaledMCP tool file_save
Save: write a clean plant with every journaled edit applied (untouched rows byte-identical), verified by reopening; to --out or --in-place with a backup.
tbase file save [OPTIONS] <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
--out | string | | Write a new file here (must not exist). Required unless --in-place. |
--in-place | boolean | false | Replace the plant itself; the original is kept as `<file>.bak-<YYYYMMDD-HHMMSS>` first. |
JSON output
| Field | Type | Description |
|---|
out | string | The file written. |
in_place | boolean | |
backup | string | The original plant, kept before an in-place save. |
tables | object[] | |
created | object[] | |
extra_objects | string[] | Non-core tables, indexes, views and triggers copied over. |
verified | boolean | The written file was reopened and every row compared. |
ops_saved | integer | Journal ops marked as saved. |
seconds | number | |
tbase index build
Writes the sidecar onlyMCP tool index_build
Build the plant's sidecar search index at <file>.tbase/index.db (the plant itself is never changed); skips the work when the index is current unless force is set.
tbase index build [OPTIONS] <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). Opened read-only; never changed. |
--force | boolean | false | Rebuild even when the index is current. |
JSON output
| Field | Type | Description |
|---|
file | string | |
index | string | |
built | boolean | False when the index was already current and `force` was not set. |
state | "missing" | "old_format" | "stale" | "current" | Index state, as reported by `index_status`. |
documents | integer | |
parties | integer | |
legals | integer | |
related | integer | |
tags | integer | |
empty_stubs | integer | Documents that are `{"id":...,"json":[]}` stubs. |
flagged | integer | Documents with an unusual shape (stub, flat, invalid JSON, partly unreadable fields). They are still indexed. |
bytes | integer | |
seconds | number | |
rows_per_second | number | |
tbase index status
Read onlyMCP tool index_status
Show whether the plant's sidecar search index exists and is current, with its size, document count and build time.
tbase index status [OPTIONS] <FILE>
| Argument | Type | Default | Description |
|---|
<FILE> | string | required | Plant file (titlebase format SQLite). |
JSON output
| Field | Type | Description |
|---|
file | string | |
index | string | Where the index lives: `<file>.tbase/index.db`. |
exists | boolean | |
state | "missing" | "old_format" | "stale" | "current" | Index state, as reported by `index_status`. |
stale | boolean | True when the index exists but cannot be used until rebuilt. |
bytes | integer | Size of the index file in bytes. |
documents | integer | Documents in the index. |
built_at | string | When the index was built (UTC). |
build_seconds | number | |
tbase commands
Lists every command with its description, access and the JSON Schema of its input and output. This is the source of this page.
tbase commands --json
tbase mcp
Serves MCP over stdio, one tool per command. --file sets a default plant so tools can be called without file. See MCP server.
tbase mcp
tbase mcp --file ~/plants/sample-county-tx.titlebase
Aliases
tbase info is tbase file info.tbase undo and tbase redo are tbase changes undo and tbase changes redo.tbase save is tbase file save.