← All tools
Tables
User-defined record types with typed fields, for the things that are genuinely rows rather than prose.
6Tools
25Parameters
2026-09-16Generated
muninn_table_define
Writes
3 parameters
Declare a table (a kind of thing you want to track — Staff, Sources, Clients) and the fields its records share. Re-calling with the same slug UPDATES the definition: fields you pass replace the current set, so send the whole list, not a delta. Field `key` is permanent and is what record values are stored under; `label` is what a human sees and can be renamed freely. Mark a field private:true to keep it out of the grid, out of csv/xlsx export, and out of any team-shared view — private values never leave the encrypted record body. Field types: text, textarea, number, date, select, multi-select, checkbox, nested-table. Use `textarea` for anything that runs to more than a line — notes, a description, an address, a bio: it stores exactly like `text` and tells the app to give it a multi-line box instead of a single-line input.
| Parameter | Type | Required | Description |
| tableSlug |
string |
Required |
Stable identifier, e.g. 'bui-staff'. Permanent — this is how records are filed. |
| title |
string |
Required |
Human-readable name, e.g. 'Staff'. Renameable. |
| fields |
object[] |
Required |
The full field list, in display order. Replaces any existing definition. |
muninn_table_list
Read only
0 parameters
List every table you have declared, with its fields and how many records each holds. Counts are top-level records only — entries in a nested table are not counted as records of the parent table. Use this before adding a record, to check the table exists and to see what fields it expects.
muninn_table_record_add
Writes
6 parameters
Add a record to a table. `values` is keyed by field key (see muninn_table_list). Pass parentRecordId to file this as an entry in the nested table under an existing record — that is how a running log lives under a standing profile. Nesting is capped at one level: a record may hold a nested table, a nested record may not. Returns {recordId} — the record's memory id, which muninn_memory_get and muninn_memory_update accept.
| Parameter | Type | Required | Description |
| tableSlug |
string |
Required |
Which table to file this record into. Must already be declared. |
| values |
object |
Required |
Field values keyed by field key, e.g. {"role":"Engineer","status":"active"}. Unknown keys are rejected. |
| parentRecordId |
string |
— |
Memory id of the parent record. Set this to add an entry to that record's nested table (a log entry under a profile). |
| tags |
string[] |
default [] |
Optional tags. Filing into a table is NOT a tag — it is structural — so no table tag is added for you. |
| project |
string |
— |
Project slug to scope this record. |
| occurredAt |
string |
— |
ISO 8601 datetime of when this actually happened, if not now. Useful for backfilling log entries. |
muninn_table_records_export
Read only
5 parameters
Export a table's records - the other half of muninn_table_records_import, and what makes verifying one possible without resolving every record by hand. Returns recordId as the first column, then the table's fields in their declared order, so an export diffs directly against the file it came from. PRIVATE fields are excluded by default and are NEVER included in csv at all, whatever includePrivate says. Reading bodies costs one subrequest each, so pass limit/offset on a large table; the response says whether more remain.
| Parameter | Type | Required | Description |
| tableSlug |
string |
Required |
Which table to export. |
| format |
stringjson · csv |
default "json" |
json returns rows as objects; csv quotes every field, which is what multi-line and Thai bodies need. |
| includePrivate |
boolean |
default false |
Include fields marked private:true. Ignored for csv, which never carries private values. |
| limit |
integer |
default 50 |
How many records to read in this call. |
| offset |
integer |
default 0 |
Where to resume from. Use the nextOffset the previous call returned. |
muninn_table_records_import
Writes
8 parameters
Import MANY records into one table in a single call. dryRun is TRUE BY DEFAULT - the first call validates and reports what would be written, and nothing is saved until you call again with dryRun:false. Validates the whole batch before writing anything and returns every error at once with its record index, so a bad cell costs one round trip, not one per record. Nothing is coerced: a checkbox field wants true/false, not the string TRUE. Pass upsertKey (field keys forming a natural key) with onConflict:update to make re-running the same import idempotent instead of duplicating everything. Writes are BUDGETED per call - the response carries remaining and nextIndex, and you re-send the tail from there.
| Parameter | Type | Required | Description |
| tableSlug |
string |
Required |
Which table to import into. Must already be declared with muninn_table_define. |
| records |
object[] |
Required |
The records to import, in order. Their INDEX in this array is what error messages and the per-record result refer to. |
| project |
string |
— |
Project slug applied to every record that does not set its own. |
| tags |
string[] |
default [] |
Tags merged into every record's own tags. |
| dryRun |
boolean |
default true |
TRUE BY DEFAULT. Validate and report without writing. Pass false to commit. |
| upsertKey |
string[] |
— |
Field keys forming a natural key, e.g. [source_file, worksheet]. Requires reading existing records, so it is refused on tables larger than 300 rows. |
| onConflict |
stringskip · update · error |
default "error" |
What to do when upsertKey matches an existing record. Only meaningful with upsertKey. |
| maxWrites |
integer |
— |
How many records to commit in THIS call. Defaults to 6, which is what a free-plan subrequest budget allows. Raise it on a paid plan. |
muninn_table_records_list
Read only
3 parameters
List the records in a table, in order. Pass parentRecordId instead to list the nested table under one record (its log). By default returns ids and positions only — cheap, no record bodies read. Pass resolve:true to also return each record's field values; private fields are excluded from resolved values.
| Parameter | Type | Required | Description |
| tableSlug |
string |
— |
List the top-level records of this table. |
| parentRecordId |
string |
— |
List the nested table under this record instead. Takes precedence over tableSlug. |
| resolve |
boolean |
default false |
true = also read each record body and return its field values (private fields excluded). |
← Back to all 74 tools
Every tables tool on this page is callable the moment a model is connected, on an account that costs nothing.
150 items free — memories, skills, bundles, tasks, table rows and artifacts all count. No card, and free does not expire. Paid lifts the limit.