Skip to main content
Glama

muninn_table_records_import

Destructive

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.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "tableSlug": "<tableSlug>",
      "records": "<records>"
    },
    "name": "muninn_table_records_import"
  }
}

Input Schema

NameRequiredDescriptionDefault
tagsNoTags merged into every record's own tags.
dryRunNoTRUE BY DEFAULT. Validate and report without writing. Pass false to commit.
projectNoProject slug applied to every record that does not set its own.
recordsYesThe records to import, in order. Their INDEX in this array is what error messages and the per-record result refer to.
maxWritesNoHow many records to commit in THIS call. Defaults to 6, which keeps one call within the server's per-call limit. Call again to commit the rest.
tableSlugYesWhich table to import into. Must already be declared with muninn_table_define.
upsertKeyNoField keys forming a natural key, e.g. [source_file, worksheet]. Requires reading existing records, so it is refused on tables larger than 300 rows.
onConflictNoWhat to do when upsertKey matches an existing record. Only meaningful with upsertKey.error

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only flag destructive/non-idempotent writes, but the description adds a great deal beyond them: dryRun defaults to true, the whole batch is validated before any write, all errors return at once with record index, values are not coerced, and writes are budgeted with remaining/nextIndex for tail re-sends. That is exactly the operational context an agent needs for a destructive mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core behavior (bulk import, dryRun default) and then ordered by operational concern: validation, coercion, idempotency, budgeting. Dense but every sentence carries a distinct, actionable fact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still explains the key return signals (per-record errors with index, remaining, nextIndex), so an agent knows how to react to the response. For an 8-parameter destructive bulk tool, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds real meaning: the upsertKey + onConflict:update pairing that makes re-runs idempotent, the dryRun flow, and the per-call write budget tied to maxWrites. It goes beyond restating the schema without contradicting it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

'Import MANY records into one table in a single call' states a specific verb, resource, and scope. The 'MANY ... in a single call' framing cleanly distinguishes it from the singular sibling muninn_table_record_add without needing to open either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: use the first call as dryRun to validate, re-call with dryRun:false to commit, and pass upsertKey with onConflict:update when re-running should be idempotent. It never explicitly names the alternative single-record tool, so the when-to-use-vs-sibling guidance is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources