Skip to main content
Glama

Add Row

add_row

Create a row in a v2 app's collection, or return the existing row when key is already present (deduped:true). Row creation goes through this tool; there is no separate strict-create verb. Omit key to add a new row with a server-generated key, or pass key to ensure a row exists at that key. Passing key is also what makes a retry safe: a call unsure whether it already landed can repeat it and get the same row back rather than a duplicate. Without key, a retry mints a second row with its own server-generated key, since there is nothing to dedup against. The collection must be declared in the app's manifest with a write list that reaches the caller, which is the list that gates creates. An agent acts with its owner's authority, so owner covers it; there is no separate 'agent' role, and a manifest that names one is rejected. When key matches a row the collection's read list does not reach for this caller, the result is row_not_found rather than the row, matching what get_row would return, so this never reads past read. Returns { row, deduped? }.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
keyNoOptional stable key. Reusing an existing key returns the existing row (deduped:true), or row_not_found when the collection's read list does not reach that row for the caller.
dataYesThe row body - any JSON value valid against the collection's row schema (an object, or any JSON value for a schemaless collection).
app_idYesThe app id.
collectionYesThe collection name.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Added

TDQS

A4.7/5.0
Behavior4/5

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

Goes well beyond the annotations by disclosing the authorization model (owner authority covers agents, no separate 'agent' role, such a manifest is rejected) and the read-gating error semantics (key matching an unreadable row yields row_not_found, matching get_row). This is a mutation tool with destructiveHint=false and idempotentHint=false, and the description correctly explains that idempotency is conditional on `key` rather than contradicting the annotation.

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 create/dedup behavior, then layers retry semantics, permissions, and error gating in descending priority. No sentence merely restates the title or the schema, and the closing return-shape note is one clause.

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 supplies the return shape ({ row, deduped? }), the error path (row_not_found), the permission precondition, and the retry hazard — everything an agent needs to call this correctly and interpret the result.

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 description coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: why omitting `key` breaks retry safety and how the collection's `read` list governs the row_not_found outcome for a supplied key. `data` and the id fields are left entirely to the schema, which is acceptable given full coverage.

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?

Opens with a precise verb+resource ('Create a row in a v2 app's collection') and immediately names the dedup behavior that distinguishes it from a plain insert. It explicitly states there is no separate strict-create verb and names get_row as the read counterpart, so an agent can place it against siblings like get_row/update_row/delete_row/list_rows.

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

Usage Guidelines5/5

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

Spells out when to omit `key` (server-generated, new row) vs pass it (ensure-exists, retry-safe), and warns explicitly that retrying without `key` mints a duplicate. It also states the manifest precondition (a `write` list reaching the caller) that gates the call, which is exactly the kind of when-you-may-use guidance most definitions omit.

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