Skip to main content
Glama

Fill the form once per spreadsheet row

fill_batch

Fill one copy of a PDF form for every row of a spreadsheet. Fill a form for every row of a CSV (csv_text or csv_url, up to 1000 rows). mapping is {column: field_id}; omit it to use the suggested mapping. If mapping is omitted, suggest_mapping runs first and is billed as one context fill. Batches up to 50 rows finish before this returns; larger ones keep running, poll get_batch. Each row is billed as one fill. retention (ephemeral or account_default) is accepted but changes nothing: the form keeps the setting it was created with. Pass dry_run=true to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.

Input Schema

NameRequiredDescriptionDefault
csv_urlNo
dry_runNo
form_idYes
mappingNo
csv_textNo
retentionNo

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / examples
      Previous value: -[
      -  {
      -    "csv_text": "Full Name,Email\nGrace Hopper,grace@example.com\nAda Lovelace,ada@example.com\n",
      -    "form_id": "11111111-2222-3333-4444-555555555555",
      -    "mapping": {
      -      "Email": 2,
      -      "Full Name": 1
      -    }
      -  }
      -]New value: +[
      +  {
      +    "csv_text": "Full Name,Email\nGrace Hopper,grace@example.com\nAda Lovelace,ada@example.com\n",
      +    "form_id": "11111111-2222-3333-4444-555555555555",
      +    "mapping": {
      +      "Email": 2,
      +      "Full Name": 1
      +    }
      +  },
      +  {
      +    "csv_text": "Full Name,Email\nGrace Hopper,grace@example.com\nAda Lovelace,ada@example.com\n",
      +    "dry_run": true,
      +    "form_id": "11111111-2222-3333-4444-555555555555",
      +    "mapping": {
      +      "Email": 2,
      +      "Full Name": 1
      +    }
      +  }
      +]
    • addedInput schema / properties / dry_run
      Added value: +{
      +  "default": false,
      +  "title": "Dry Run",
      +  "type": "boolean"
      +}
  2. Changed1 schema field changed
    • addedInput schema / examples
      Added value: +[
      +  {
      +    "csv_text": "Full Name,Email\nGrace Hopper,grace@example.com\nAda Lovelace,ada@example.com\n",
      +    "form_id": "11111111-2222-3333-4444-555555555555",
      +    "mapping": {
      +      "Email": 2,
      +      "Full Name": 1
      +    }
      +  }
      +]
  3. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Adds substantial context beyond annotations: per-row billing, the 50-row synchronous cutoff with polling, the 1000-row cap, the fact that retention is accepted but is a no-op because the form keeps its creation setting, and exactly what dry_run does and cannot check. It also discloses the hidden suggest_mapping cost when mapping is omitted.

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?

Dense but front-loaded: the core action comes first, then mapping behavior, then async/billing semantics, then caveats. Every sentence conveys a distinct operational fact with no filler.

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?

For a 6-parameter mutation tool with an output schema (so return shape needn't be explained), the description covers cost, async behavior, parameter effects, and the rehearsal escape hatch. Only the csv_text/csv_url relationship is unaddressed, which is minor.

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?

With 0% schema description coverage, the description carries the burden well: it defines mapping as {column: field_id}, explains csv_text/csv_url as row sources with a 1000-row cap, and clarifies retention's inert behavior and dry_run's meaning. It never states that csv_text and csv_url are mutually exclusive or what form csv_url must take, which is the main remaining gap.

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?

States a specific verb and scope: 'Fill one copy of a PDF form for every row of a spreadsheet', immediately distinguishing it from single-fill siblings like fill_form and fill_form_from_context. The resource (PDF form) and cardinality (one per row) are unambiguous.

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 operational guidance: omit mapping to use suggest_mapping (and its billing consequence), poll get_batch for batches over 50 rows, and pass dry_run=true to rehearse. It does not explicitly say when to prefer fill_form over this tool for a single record, so routing against siblings is left partly implicit.

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.