Skip to main content
Glama

JustFill PDF Form Automation

Server Details

Detect, review and fill existing PDF forms from JSON or Excel; reuse saved templates

Ownership verified
Status
Healthy
Uptime
6.9% over 55 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
mrmaciej1/justfill-mcp
GitHub Stars
0
Server Listing
JustFill PDF Forms

TDQS

A4.7/5.0

Scored across 15 tools

Disambiguation5/5

Each tool has a clearly distinct purpose, and descriptions explicitly include cross-references that separate near-neighbors (update_field vs update_fields, remove_field vs remove_fields vs prune_fields, render_preview vs render_filled_preview, list_fields vs list_templates). An agent can confidently route between single/batch/rule-based operations.

Naming Consistency5/5

All tools use consistent snake_case verb_noun or verb_object patterns (add_field, update_fields, remove_field, prune_fields, render_preview, save_template, open_pdf). No camelCase or stylistic mixing.

Tool Count5/5

15 tools fit comfortably in the recommended range and every tool maps to a real step in the PDF detect-edit-review-fill-save lifecycle. No redundant or padding tools.

Completeness4/5

Full field lifecycle (open, list, add, update, remove, prune), preview/review gates, fill, template save and list are all covered. Minor gap: templates can be listed and saved but not individually fetched or deleted, and no workspace enumeration beyond an ID.

Available Tools

15 tools
add_fieldAdd a fieldAInspect

Create a new fillable field on a page when detection missed an input (false negative).

Coordinates (`x`, `y`, `w`, `h`) are in percentages of page width/height
(`0.0`–`100.0`, top-left origin), read off `render_preview`. Assigns a
sequential agent field ID (`p{page_index}_a{n}`) with `confidence=1.0` and
`source="agent"`, and returns the created field object. Allowed `field_type`
values: `'text'` (default), `'number'`, `'date'`, `'checkbox'`, `'radio'`,
`'signature'`, `'dropdown'`, `'field'`, or `'cell'`. Optional `align`
(`'left'`, `'center'`, `'right'`) and `vertical_align` (`'top'`, `'middle'`,
`'bottom'`) control where text sits inside the box.

Persistence & review impact: persists immediately in the active workspace
(`workspace_id`) and invalidates any prior visual review receipt for
`page_index` on ML-detected layouts. Does not alter saved account templates
unless `save_template` is called after filling.

When to use:
- Use `add_field` only to create a missing field that detection missed.
- Use `update_field` (single) or `update_fields` (batch) to move, resize,
  rename, or change the type/alignment of an existing field.
- Use `remove_field` or `remove_fields` to delete false-positive fields.
NameRequiredDescriptionDefault
hYesHeight of the field box as a percentage of page height (`> 0.0` and `<= 100.0 - y`).
wYesWidth of the field box as a percentage of page width (`> 0.0` and `<= 100.0 - x`).
xYesHorizontal position of the box's left edge as a percentage of page width (`0.0` to `100.0`, origin at top-left).
yYesVertical position of the box's top edge as a percentage of page height (`0.0` to `100.0`, origin at top-left).
nameNoShort semantic label for the field (e.g. `'applicant_full_name'`, `'signature_date'`). Stored in the workspace and in templates saved via `save_template`.
alignNoHorizontal text alignment inside the box: `'left'`, `'center'`, or `'right'`. Omit or pass `None` for the default alignment.
field_typeNoField input type: `'text'` (default), `'number'`, `'date'`, `'checkbox'`, `'radio'`, `'signature'`, `'dropdown'`, `'field'`, or `'cell'`.text
page_indexNo0-based page index (`0` to `page_count - 1`) on which to place the new field.
workspace_idYesActive workspace ID returned by `open_pdf` (`summary.workspace_id`).
vertical_alignNoVertical text alignment inside the box: `'top'`, `'middle'`, or `'bottom'`. Omit or pass `None` for the default vertical alignment.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description discloses immediate persistence in the active workspace, invalidation of prior visual review receipts for ML-detected layouts, and that saved account templates are not altered unless save_template is called. It also describes the created field ID convention and source/confidence metadata.

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?

The description is front-loaded with purpose, then coordinates, persistence impact, and usage routing. Despite its length, every section serves a clear function for a 10-parameter mutation tool.

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?

Given the tool's complexity, 10 parameters, annotations, and output schema, the description provides enough context to invoke it correctly. It covers purpose, coordinate semantics, side effects, and alternatives without needing to explain the output schema in detail.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents every parameter, including coordinate ranges, field_type values, alignment options, page_index, and workspace_id. The description reinforces allowed values and adds that coordinates are read off render_preview, but it does not add much parameter meaning beyond the schema.

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?

The opening sentence states a specific verb, resource, and condition: create a new fillable field on a page when detection missed an input. It clearly distinguishes the tool from sibling update/remove operations.

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?

The 'When to use' section explicitly says to use add_field only for missing fields, and it names update_field, update_fields, remove_field, and remove_fields for their respective cases. This leaves no ambiguity about tool selection.

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

close_workspaceClose a PDF workspaceA
DestructiveIdempotent
Inspect

Delete one temporary workspace and its stored PDF and preview files when work is finished.

Deletes the temporary workspace record (`workspace_id`), its uploaded source
PDF, any rendered preview images (`preview_url`), and any generated output
PDF (`download_url`) before the automatic 24-hour TTL expiration. This does
not delete saved templates created with `save_template` or files the user has
already downloaded. The operation is idempotent (`already_closed=True` when
already gone), so cleanup code may safely call it in ``finally``.

When to use:
- Call `close_workspace` only after the user has received or downloaded the
  filled PDF from `fill_pdf` (and after calling `save_template`, if saving the
  layout), because closing immediately invalidates `download_url` and
  `preview_url` links.
NameRequiredDescriptionDefault
workspace_idYesActive workspace ID returned by `open_pdf` (`summary.workspace_id`) to close and purge.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description goes further by enumerating what is destroyed (workspace record, source PDF, previews, output PDF), what survives (saved templates, downloaded files), and the 24-hour TTL context. It also explains idempotency semantics via already_closed=True, which is more concrete than the hint alone; only the return payload shape is left to the output schema.

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

Conciseness4/5

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

Front-loaded with the action and destruction list, then a clearly separated usage block; every sentence carries information. Minor bloat from inline code formatting and parenthetical callouts (e.g. the doubled backticks around finally) that reads as documentation style rather than agent-facing guidance.

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 one-parameter destructive cleanup tool with annotations and an output schema, nothing essential is missing: destruction scope, retention exceptions, idempotency, TTL behavior, and call ordering are all covered, leaving only the return structure to the output schema.

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

Parameters3/5

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

With 100% schema description coverage and a single parameter, the schema already defines workspace_id and its origin in open_pdf's summary. The description reinforces this by tying the ID to lifecycle effects (closing invalidates download_url/preview_url), but adds no new syntax or format guidance, so baseline 3 applies.

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 (delete/close) and resource (one temporary workspace plus its stored PDF, preview images and output PDF), and immediately delimits scope by noting saved templates and already-downloaded files are untouched. That negation distinguishes it from sibling mutation tools like remove_field or save_template without needing the schema.

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?

The explicit 'When to use' block gives an ordering prerequisite: only after the user has received the filled PDF from fill_pdf and, if applicable, after save_template. It also states the consequence of calling early (download_url and preview_url become invalid), which is exactly the when-not guidance an agent needs.

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

fill_pdfFill the PDFA
Destructive
Inspect

Fill the PDF and return a download link (valid until the workspace expires).

`values` maps field id -> text (checkboxes: "yes"/"x"/"true" to tick).
`flatten=False` preserves existing form fields; it does not create fields
on scans. `fillable=True` creates interactive fields (subject to the
account's existing export entitlement) and takes precedence over flatten.
`editable`, `editable_widget_count` and `output_type` describe the actual PDF.
`editable` means at least one form widget is writable, not that all values are.
`warnings` lists text printed too small or cut off (with flatten=True
render_filled_preview reports them beforehand; with flatten=False editable
widgets are not measured). `output_mode` "watermarked" means the result
contains a JustFill watermark. A clean final output may consume one of the
account's existing fill entitlements; when none is available, the result
is watermarked.

Visual review gate & workflow routing:
- For ML-detected layouts (`source="ml"`), `fill_pdf` requires prior
  `render_preview` and `render_filled_preview` calls (with matching `values`,
  `flatten`, and `fillable` flags) on every populated page; otherwise it
  returns `required_calls` without generating the PDF.
- Use `render_filled_preview` first to verify placement and text fit at no
  cost; call `fill_pdf` only when ready to generate the downloadable PDF.
- Do not call `close_workspace` until the user has downloaded the file from
  `download_url`.
NameRequiredDescriptionDefault
valuesYesNon-empty mapping of `field_id` (from `open_pdf` or `list_fields`) to the string value to fill. Checkboxes tick on `'yes'`, `'x'`, or `'true'`. Must not contain restricted data (payment cards, PHI, government IDs, or authentication secrets).
flattenNoIf `True` (default), flattens filled values into static page content. If `False`, preserves existing embedded AcroForm widgets as editable fields.
fillableNoIf `True`, synthesizes interactive, editable AcroForm widgets for the fields in the output PDF (subject to account entitlement; takes precedence over `flatten`).
workspace_idYesActive workspace ID returned by `open_pdf` (`summary.workspace_id`).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare this is destructive, non-read-only, and non-idempotent; the description adds substantial behavioral context beyond that. It discloses download-link expiry, flatten/fillable precedence and entitlement effects, watermarking semantics, warning behavior, editable-widget meaning, and the ML-layout visual review gate.

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

Conciseness4/5

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

The description is front-loaded with the core action and then structured into parameter behavior and workflow-routing sections. It is dense and somewhat repetitive of schema content, but the length is largely justified by the tool's complexity.

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?

Given an output schema exists, the description need not explain return values, and it covers the critical workflow constraints, entitlement effects, preview prerequisites, and download lifecycle. An agent has enough context to invoke the tool correctly without needing external assumptions.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents the parameters thoroughly, and the description adds only marginal semantics such as flatten=False not creating fields on scans and fillable precedence. The checkbox value syntax is repeated from the schema rather than adding new parameter meaning.

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?

The description states a specific verb and resource: fill the PDF and return a download link. It also distinguishes the final generation step from preview and workspace-closing siblings by explicitly naming render_filled_preview and close_workspace.

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?

It gives explicit workflow routing: use render_filled_preview first, call fill_pdf only when ready, and for ML-detected layouts require prior render_preview and render_filled_preview calls. It also names a when-not condition via the required_calls behavior and warns not to close the workspace before download.

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

list_fieldsList fieldsA
Read-only
Inspect

List the current working fields and workspace summary for an open PDF workspace.

Returns `{"summary": ..., "fields": [...]}` for `workspace_id`, reflecting any
in-workspace edits made via `add_field`, `update_field`, `update_fields`,
`remove_field`, `remove_fields`, or `prune_fields`. Each field entry includes
`id`, `name`, `type`, `page_index` (0-based), bounding-box percentages
(`x`, `y`, `w`, `h`), `confidence`, `source` (`'template'`, `'acroform'`,
`'ml'`, or `'agent'`), and `needs_name_review`.

Filtering: pass a 0-based `page_index` to return only the fields on that
single page, or omit `page_index` (pass `None`) to list fields across all
pages in the workspace.

When to use:
- Use `list_fields` to inspect current field IDs, coordinates, or labels in an
  already-open workspace (for example, after editing fields or narrowing to one
  page) without re-running detection.
- Use `open_pdf` to load a document for the first time and create a workspace.
- Use `list_templates` to list saved, reusable account-level templates rather
  than the fields of an active workspace.
NameRequiredDescriptionDefault
page_indexNoOptional 0-based page index (`0` to `page_count - 1`) to filter fields to a single page. Omit or pass `None` to list fields across all pages in the workspace.
workspace_idYesActive workspace ID returned by `open_pdf` (`summary.workspace_id`).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, yet the description still adds real context: it states that results reflect in-workspace edits made by add/update/remove/prune_field(s), and it describes the confidence and needs_name_review attributes. This tells the agent the output is live state, not a static snapshot.

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

Conciseness4/5

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

Front-loaded with the core action, then return shape, filtering, and usage guidance in a scannable structure. The enumeration of every field-entry key partly duplicates the output schema, making it slightly longer than necessary.

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 annotations, a 100%-covered two-parameter schema, and an output schema present, the description covers everything an agent needs: scope, edit reflectivity, page filtering, and sibling routing. No gaps remain for correct invocation.

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 the baseline is 3, but the description adds meaning beyond the schema by framing page_index as the all-pages-vs-single-page toggle and tying workspace_id to an active, already-opened workspace. It largely reinforces rather than extends the schema text, which keeps it below a 5.

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 resource ('List the current working fields and workspace summary') plus the scope ('open PDF workspace'). It explicitly distinguishes itself from open_pdf and list_templates, so an agent can pick it without opening any schema.

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?

A dedicated 'When to use' block names the exact scenarios (inspecting IDs/coords/labels in an already-open workspace, after edits, or narrowed to one page) and routes the agent to the two siblings for other cases. No inference is required.

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

list_templatesList saved templatesA
Read-only
Inspect

List saved, reusable form templates on the authenticated JustFill account.

Ordering & limit behavior: returns up to `limit` (default `50`) saved
calibration templates for the authenticated account, ordered from most
recently updated to oldest, as `templates` (`name`, `document_id`, and
`fields` count). Does not require an open workspace.

When to use:
- Use `list_templates` to inspect which reusable document templates are
  already saved on the user's account (via `save_template` or the web editor).
- Do not confuse with `list_fields`, which lists the individual fillable form
  fields (`id`, `name`, `x`, `y`, `w`, `h`) of a currently open `workspace_id`.
NameRequiredDescriptionDefault
limitNoMaximum number of most recently updated templates to return for the authenticated account (default `50`).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly=true, destructive=false, and openWorld=false, but the description adds authentication scope, ordering behavior, default limit, return fields, and workspace independence. That is substantive behavioral context beyond annotations.

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-loads the purpose, then tight sections for ordering/limit and when-to-use guidance. The list_fields contrast includes a bit of field detail, but it earns its place by preventing a likely sibling mix-up.

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?

This is a low-complexity read tool with an output schema, rich annotations, and a complete description covering scope, ordering, limit, authentication context, and sibling differentiation. Nothing material is missing for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, and the only parameter, limit, is already fully documented with its default and meaning. The description repeats the default and adds ordering context but little parameter-level meaning beyond the schema, so the baseline 3 applies.

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 resource: list saved, reusable form templates on the authenticated account. It explicitly contrasts with list_fields, so an agent can distinguish it from the sibling without opening the schema.

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?

Gives explicit when-to-use guidance and a clear do-not-confuse rule with list_fields. It also states that no open workspace is required, which is a useful selection constraint.

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

open_pdfOpen a PDF or scanAInspect

Open a PDF (or an image of a form: JPG/PNG/TIFF) and detect its fields.

The document comes from exactly ONE of:
- `file`: a PDF/image the user attached in the chat, for clients that
  provide file parameters (no upload needed). A file without a
  download_url cannot be fetched; an upload_token covers that case,
- `url`: a public link to the document,
- `upload_token`: from request_file_upload, for files on the user's
  device or chat attachments that `file` cannot carry,
- `file_base64`: exact bytes of a small file (< ~200 KB). Larger base64
  passed through a model gets truncated, and a compressed or rebuilt file
  breaks field detection and no longer matches its template.
Resolution order: saved template (deterministic) -> embedded AcroForm ->
ML detection with per-field confidence. force_detect=True skips templates.
ML detection scans only the first `max_pages` pages; for a longer document
the result lists `unprocessed_page_indices`, which another open_pdf call
with a larger max_pages scans.
Returns a 24-hour `workspace_id` (`summary.workspace_id`), which every
subsequent workspace tool takes.

When to use:
- Call `open_pdf` once to load a document and initialize a workspace (or call
  it again with a larger `max_pages` or `force_detect=True`).
- Use `list_fields` to re-read fields in an already-open workspace without
  re-running detection, or `list_templates` to browse saved account templates.
NameRequiredDescriptionDefault
urlNoPublic HTTP or HTTPS URL of the PDF or form image (JPG, PNG, TIFF, WEBP; max 50 MB). Mutually exclusive with `file`, `upload_token`, and `file_base64`.
fileNo
filenameNoDisplay filename for the workspace and default output filename stem (e.g. `'w9.pdf'`). Automatically inferred from the attachment or URL path when left at the default `'document.pdf'`.document.pdf
max_pagesNoMaximum number of pages (starting from page 0, minimum 1) to scan during ML field detection. Unscanned pages are reported in `summary.unprocessed_page_indices`.
file_base64NoBase64-encoded bytes of a small unmodified PDF or image (< ~200 KB). For larger files, use `file`, `url`, or `request_file_upload` + `upload_token` to avoid model truncation. Mutually exclusive with `file`, `url`, and `upload_token`.
force_detectNoIf `True`, skips saved account templates and embedded AcroForm fields and forces a fresh ML detection pass across the first `max_pages` pages.
upload_tokenNoOne-time upload token returned by `request_file_upload` after the file has been uploaded (or `'latest'` to use the most recent unconsumed upload). Mutually exclusive with `file`, `url`, and `file_base64`.
min_confidenceNoMinimum ML detection confidence threshold in `0.0`–`1.0` (inclusive). ML-detected fields scoring below `min_confidence` are omitted; deterministic template and AcroForm fields always have confidence `1.0` and are kept.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare mutability and open-world hints; the description adds the substantive traits: the deterministic -> AcroForm -> ML resolution order, that detection is page-limited with unprocessed_page_indices reported, and that the workspace_id expires in 24 hours. It also warns that rebuilt/compressed files break field detection and that large base64 gets truncated.

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

Conciseness4/5

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

Front-loaded purpose followed by a bulleted source selector and a usage block, so the structure is easy to scan. It repeats the base64 size/truncation caveat from the schema and the max_pages behavior, which is mild redundancy but not damaging.

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?

An output schema exists, so return values need no explanation, and the description still names the key return field (summary.workspace_id) and its lifetime. For an 8-parameter, nested, open-world ingestion tool, nothing an agent needs in order to call it correctly is missing.

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

Parameters5/5

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

Schema coverage is already 88%, yet the description still adds value the schema cannot: the exactly-one-source constraint with a resolution-order rationale, the guidance that a file lacking download_url must use upload_token, and the ~200 KB base64 limit with the reason. This is meaningfully more than the field-level descriptions.

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 resource ("Open a PDF ... and detect its fields") and immediately names the accepted variants (JPG/PNG/TIFF). It is clearly distinguishable from siblings like list_fields and request_file_upload, which are called out by name.

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?

The closing "When to use" block explicitly says to call it once to load a document and initialize a workspace, and routes to list_fields for re-reading and list_templates for browsing templates. It also names the re-invocation conditions (larger max_pages or force_detect=True).

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

prune_fieldsBulk-delete matching fieldsA
Destructive
Inspect

Bulk-delete fields matching ALL given criteria (detection noise) in the active workspace.

Filter & guardrail semantics: permanently deletes every field in `workspace_id`
that satisfies **all** non-`None` filter criteria (`field_type`,
`confidence_below`, `width_below`, `height_below`, `page_index`). At least one
criterion **must** be provided — omitting all five criteria (`None`) is
rejected with `{"error": ...}` to prevent accidentally deleting all fields.
Thresholds (`confidence_below`, `width_below`, `height_below`) are
strictly-less-than (`<`); `width_below` and `height_below` are in `%` of page
width/height (`0.0`–`100.0`). Pass `exclude_ids` as a guardrail allowlist of
`field_id`s that must be preserved even when they match the criteria. Returns
`{"removed": <count>, "removed_ids": [...], "fields_remaining": <count>}` so
deletions are auditable (and reversible via `add_field`). Does not affect
saved templates unless `save_template` is called.

When to use:
- Use `prune_fields` for rule-based bulk cleanup of detection noise (e.g.
  tiny table cells or low-confidence boxes).
- Use `remove_fields` to delete an explicit list of known `field_id`s, or
  `remove_field` to delete a single field by ID.
NameRequiredDescriptionDefault
field_typeNoExact field type to match for deletion (e.g. `'cell'`, `'field'`, `'text'`, `'checkbox'`). Omit or pass `None` to match any type.
page_indexNo0-based page index (`0` to `page_count - 1`) to restrict pruning to a single page. Omit or pass `None` to prune matching fields across all pages.
exclude_idsNoOptional guardrail allowlist of `field_id`s to protect and keep in the workspace even if they match all pruning criteria.
width_belowNoStrictly-less-than width threshold as a percentage of page width (`0.0`–`100.0`); only fields with `w < width_below` match. Omit or pass `None` for no width filter.
height_belowNoStrictly-less-than height threshold as a percentage of page height (`0.0`–`100.0`); only fields with `h < height_below` match. Omit or pass `None` for no height filter.
workspace_idYesActive workspace ID returned by `open_pdf` (`summary.workspace_id`).
confidence_belowNoStrictly-less-than ML confidence threshold (`0.0`–`1.0`); only fields with `confidence < confidence_below` match. Omit or pass `None` for no confidence filter.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description goes well beyond that: it explains the all-None rejection guard, the AND-semantics of criteria, strictly-less-than thresholds, the exclude_ids allowlist as a safety mechanism, the exact return payload for auditability, reversibility via add_field, and that saved templates are untouched unless save_template is called. That is exactly the extra context the annotation bar asks for.

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

Conciseness4/5

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

Front-loaded with the destructive action and the guardrail, then structured into a semantics block and a 'When to use' block. Some threshold-range phrasing repeats the schema, so it is a touch longer than strictly needed, but nearly every sentence carries decision-relevant information.

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 7-parameter destructive bulk operation, the description covers the dangerous edge case (empty criteria), safety valves (exclude_ids), matching semantics, side effects on templates, and even the return shape despite an output schema existing. Nothing an agent needs before invoking it destructively 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% and already documents each parameter's units and ranges, so the baseline is 3. The description adds value the schema does not: that criteria are conjunctive (ALL non-None filters must match), that at least one must be supplied, and how exclude_ids overrides matching. Marginal duplication of the percent/threshold semantics keeps it at 4 rather than 5.

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?

The first line states a specific verb+resource+scope: bulk-delete fields matching ALL criteria in the active workspace, framed as detection-noise cleanup. It is immediately distinguishable from remove_fields/remove_field, which the description names explicitly.

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?

A dedicated 'When to use' block names both alternatives (remove_fields for explicit ID lists, remove_field for a single ID) and the condition that selects each. It also flags the scenario class (tiny table cells, low-confidence boxes) where this tool is the right choice.

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

remove_fieldRemove a fieldA
Destructive
Inspect

Permanently delete a single false-positive field from the active workspace by its field_id.

Permanence & unknown-id behavior: immediately removes `field_id` from
`workspace_id` and returns `{"removed": 1, "fields_remaining": <count>}` (or
`{"removed": 0, "fields_remaining": <count>, "unknown_field_ids": [field_id]}`
if `field_id` is not found). Deletion is permanent within the active
workspace — to restore a deleted field, re-add it with `add_field` or re-open
the document with `open_pdf`. Saved account templates are unaffected unless
`save_template` is called afterward.

When to use:
- Use `remove_field` to delete one specific false-positive field box (e.g. a
  stray box over printed text).
- Use `remove_fields` to delete 2 or more known `field_id`s in a single batch
  call.
- Use `prune_fields` for rule-based bulk filtering by `confidence_below`,
  `width_below`, `height_below`, `field_type`, or `page_index`.
NameRequiredDescriptionDefault
field_idYesID of the field to permanently delete from the workspace (from `open_pdf` or `list_fields`, e.g. `'p0_f3'`).
workspace_idYesActive workspace ID returned by `open_pdf` (`summary.workspace_id`).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond destructiveHint=true by disclosing exact return payloads for both the success and unknown-id cases, stating deletion is permanent within the active workspace, specifying recovery paths (add_field, open_pdf), and noting the scope boundary that saved templates are unaffected unless save_template is called.

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

Conciseness4/5

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

Front-loaded with the destructive action and its permanence before any conditional detail, and the bulleted alternative routing is easy to scan. The inline JSON return snippets are somewhat verbose given an output schema exists, which keeps it just under top marks.

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 two-parameter destructive tool with full annotation coverage and an output schema, nothing an agent needs is missing: scope, permanence, recovery, error behavior, and sibling routing are all present. Return-value detail is technically redundant with the output schema but does not detract.

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 the baseline is 3, but the description adds value: it ties field_id to a single false-positive box, defines the unknown-id outcome, and clarifies that removal is scoped to workspace_id's active workspace. It stops short of syntax examples, which the schema already supplies ('p0_f3').

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 resource ('Permanently delete a single false-positive field') and bounds it by workspace and field_id. The singular scope is explicitly contrasted with the plural and rule-based siblings, so an agent can distinguish it from remove_fields and prune_fields immediately.

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?

Provides an explicit 'When to use' block: remove_field for one specific field, remove_fields for 2+ known ids in a batch, prune_fields for rule-based filtering by named criteria. Each alternative is named with the condition that selects it, leaving nothing to inference.

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

remove_fieldsRemove many fieldsA
Destructive
Inspect

Permanently delete multiple fields by ID from the active workspace in a single batch mutation.

ID-list, partial-failure & persistence semantics: deduplicates `field_ids`,
deletes every matching field from `workspace_id`, and commits the updated
workspace state immediately. Returns `{"removed": <count>, "fields_remaining": <count>}`.
Any ID in `field_ids` that does not exist in the workspace is ignored during
deletion and reported in sorted `unknown_field_ids` while all valid IDs in
the batch are still removed (no error is raised for unknown IDs). Deletion is
irreversible within the active workspace — removed fields can only be
recovered via `add_field` or a fresh `open_pdf` call, and saved account
templates are not altered unless `save_template` is called afterward.

When to use:
- Use `remove_fields` when deleting an explicit list of 2 or more known
  false-positive `field_id`s at once.
- Use `remove_field` when deleting a single `field_id`.
- Use `prune_fields` for criteria-based bulk removal by `confidence_below`,
  `width_below`, `height_below`, `field_type`, or `page_index` instead of
  listing individual IDs.
NameRequiredDescriptionDefault
field_idsYesList of field IDs (from `open_pdf` or `list_fields`, e.g. `['p0_f2', 'p0_f5']`) to permanently remove from the workspace. Duplicate IDs are deduplicated; unknown IDs are ignored and returned in `unknown_field_ids`.
workspace_idYesActive workspace ID returned by `open_pdf` (`summary.workspace_id`).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare destructiveHint=true; the description goes well beyond that by disclosing irreversibility, the recovery paths (`add_field`, `open_pdf`), that saved templates are unaffected unless `save_template` is called, and the partial-failure rule that unknown IDs are silently skipped rather than erroring. It also states the returned counts and sorted `unknown_field_ids`, which is exactly the behavioral detail an agent needs before a destructive batch call.

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

Conciseness4/5

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

Front-loaded with the destructive action and scoped alternative routing, then grouped into a labeled semantics paragraph and a bulleted 'When to use' list. Slightly dense in the middle block, but every sentence carries operational information; 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 destructive two-parameter batch tool with an output schema present, the definition covers safety, irreversibility, recovery, partial-failure behavior, and sibling routing. Nothing an agent needs to invoke it correctly 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 the baseline is 3; the description adds batch-level meaning the schema does not — that valid IDs are still committed when some IDs are unknown (no error raised for the batch), and where `workspace_id` comes from. Some overlap with the schema's dedup/unknown-ID notes, but the partial-failure framing is genuinely new.

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 resource ('permanently delete multiple fields by ID'), plus scope ('from the active workspace in a single batch mutation'). It explicitly distinguishes itself from both `remove_field` (single) and `prune_fields` (criteria-based), so an agent can select it without opening any schema.

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?

The 'When to use' block gives an explicit selection rule (2+ known false-positive IDs), names both alternatives by name, and describes the condition that routes to each (`remove_field` for one ID, `prune_fields` for confidence/size/type/page criteria). Nothing is left to inference.

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

render_filled_previewPreview values in placeAInspect

Preview how the filled page will look before fill_pdf. Costs nothing.

`values` maps field id -> text (checkboxes tick on "yes"/"x"/"true"). Text
placement, size and wrapping come from the same code as the export, with
the same flatten/fillable flags as fill_pdf. Not simulated: a watermark or
an account limit that stops fill_pdf.
In the JSON, `fit` lists values that were shrunk or cut and `warnings`
what to fix first. `preview_url` links to the same image; some clients
(e.g. ChatGPT) do not display tool images, so there the user sees the page
only through `preview_url`. Restricted data (payment cards, PHI,
government ids, or authentication secrets) is not accepted by this public
plugin.

When to use:
- Use `render_filled_preview` to verify text placement, alignment, and font
  sizing on each populated page at no cost before calling `fill_pdf` (required
  for every populated page on ML-detected layouts).
- Use `render_preview` to inspect empty field bounding boxes and `field_id`
  labels without values.
- Use `fill_pdf` once visual review is complete to generate the downloadable
  filled PDF.
NameRequiredDescriptionDefault
valuesYesMapping of `field_id` (from `open_pdf` or `list_fields`) to the string value to render. Checkboxes tick on `'yes'`, `'x'`, or `'true'`. Do not pass restricted data (payment cards, PHI, government IDs, or authentication secrets).
flattenNoIf `True` (default), bakes text statically into the page content. If `False`, preserves existing embedded AcroForm widgets as editable. Must match the `flatten` flag later passed to `fill_pdf`.
fillableNoIf `True`, synthesizes interactive AcroForm widgets on flat/scanned PDFs (takes precedence over `flatten`). Must match the `fillable` flag later passed to `fill_pdf`.
page_indexNo0-based page index (`0` to `page_count - 1`) of the document to render.
workspace_idYesActive workspace ID returned by `open_pdf` (`summary.workspace_id`).

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses zero cost, that rendering uses the same code path and flatten/fillable flags as the export, and crucially what is NOT simulated (watermarks, account limits). Also notes client-side image rendering limits (ChatGPT) and restricted-data rejection, which annotations do not cover.

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 purpose and cost in the first two lines, then structured bullets for usage. Every sentence carries operational information (flags, return keys, restricted data, client rendering) 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?

No output schema exists, but the description fully documents the return payload (fit, warnings, preview_url) and the cost/safety model, so an agent has everything needed to call 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 coverage is 100%, so the baseline is 3, and the description adds real value: it restates the checkbox convention and stresses that flatten/fillable must match the later fill_pdf call, a cross-tool constraint not evident from the schema alone. It does not explain page_index or workspace_id beyond the schema, so it falls just short of 5.

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?

The first sentence states a specific verb and resource ('Preview how the filled page will look') and anchors it relative to a named sibling ('before fill_pdf'). An agent can immediately distinguish it from render_preview and fill_pdf.

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?

The 'When to use' block explicitly names the three relevant siblings and the condition selecting each: render_filled_preview for values/placement, render_preview for empty bounding boxes, fill_pdf for the final download. It also states the preview is required for populated pages on ML-detected layouts.

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

render_previewPreview detected boxesAInspect

Render a page with the field boxes drawn on it, to verify placement.

Blue = deterministic (template/AcroForm/agent), green/orange/red = ML
confidence bands (`>= 0.7`, `0.4`–`0.7`, `< 0.4`). Labels show field ids.
The result has the image and a `preview_url` link to the same image; some
clients (e.g. ChatGPT) do not display tool images, so there the user sees
the page only through `preview_url`. Also records the field-layout visual
review receipt for `page_index` required before `fill_pdf` or `save_template`
on ML-detected layouts.

When to use:
- Use `render_preview` to inspect empty field box positions, IDs, false
  positives, and missed inputs before filling or after modifying geometry with
  `add_field`, `update_field`, `update_fields`, `remove_field`, `remove_fields`,
  or `prune_fields`.
- Use `render_filled_preview` instead to see actual field values typeset inside
  those boxes and check for text overflow before calling `fill_pdf`.
NameRequiredDescriptionDefault
page_indexNo0-based page index (`0` to `page_count - 1`) to render with field bounding-box overlays.
workspace_idYesActive workspace ID returned by `open_pdf` (`summary.workspace_id`).

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing a side effect they don't cover: it records a field-layout visual review receipt for page_index that gates fill_pdf/save_template on ML layouts. It also explains the color-band legend and the client limitation where tool images aren't displayed, so the agent knows to surface preview_url.

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 action, then legend, then return-value caveat, then a clearly delimited 'When to use' block. Every sentence carries operational information 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?

With no output schema, the description still explains the return (image plus preview_url) and its client-display caveat. The gating side effect, alternatives, and trigger conditions are all covered, leaving nothing an agent needs 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 meaning: page_index is not just a render target, it is the page whose visual review receipt gets recorded and required downstream. workspace_id is left to the schema, which documents it adequately.

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 resource (render a page with field boxes drawn) and immediately frames the goal (verify placement). It explicitly distinguishes itself from the sibling render_filled_preview, so an agent can route between the two without opening schemas.

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?

Provides an explicit 'When to use' section: inspect empty boxes before filling or after geometry edits via add_field/update_field/remove_field/prune_fields, and a named alternative (render_filled_preview) for value/overflow checks. The prerequisite for fill_pdf and save_template is also stated.

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

request_file_uploadRequest a file-upload linkAInspect

Create a one-time upload slot for a PDF (or form photo) when direct file input is unavailable.

For a document on the user's device, or a chat attachment that open_pdf's
`file` parameter cannot carry (the tool call does not accept a file, or the
file arrives without a download_url); tool arguments cannot carry file
bytes reliably. Documents with payment-card data, PHI, government
identifiers, passwords, API keys/tokens, or MFA/OTP codes are not accepted.

Returns `upload_url`, a page where the user opens and drops the file (one
click); `post_url`, which accepts the file as a multipart POST
(`curl -sf -F "file=@document.pdf" <post_url>`) for headless runtimes with
network access to justfill.app (n8n, a server shell; chat sandboxes
usually have none); and `upload_token` for open_pdf. A base64 copy or a
shrunk file is no substitute: modified bytes break detection.

The slot is single-use and expires in 30 minutes.

When to use:
- Use `open_pdf(file=...)` directly if the client passes a chat attachment
  with a `download_url`, or `open_pdf(url=...)` if the file is at a public
  HTTP/HTTPS link.
- Call `request_file_upload` only as a fallback when neither `file` nor `url`
  can deliver the original document, then pass the returned `upload_token` to
  `open_pdf(upload_token=...)`.
NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Goes well beyond the annotations: discloses that the slot is single-use, expires in 30 minutes, rejects payment-card data, PHI, government IDs, passwords, API keys and MFA/OTP codes, and warns that re-encoded bytes (base64, shrunk files) break detection. Its three return artifacts (upload_url, post_url with a concrete curl example, upload_token) are explained in operational terms. Only gap is that permission/auth requirements for creating the slot are unstated.

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

Conciseness4/5

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

Front-loaded with the purpose and the fallback condition, then organized into returns and a when-to-use list. It's long, but for a multi-step fallback flow most sentences carry real information. Minor deductions for the awkward mid-sentence line breaks and for restating return values that the output schema already covers.

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?

Annotations cover the safety profile and an output schema exists, yet the description still supplies the failure modes (stale bytes, expired slot, sensitive content) and the exact wiring into open_pdf that an agent needs to complete the flow without trial and error.

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?

Zero parameters, so the schema has nothing to document and the baseline is 4. The description doesn't invent redundant parameter talk and instead spends its words on outputs and gating conditions, which is the right allocation.

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 resource — "Create a one-time upload slot for a PDF (or form photo)" — plus the precise condition that gates it: "when direct file input is unavailable." That condition alone separates it from open_pdf and every other sibling in the list.

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?

An explicit "When to use" block names the two preferred paths (open_pdf(file=...) with a download_url, open_pdf(url=...) for a public link) and restricts this tool to the fallback case, then closes the loop by telling the agent to feed the returned upload_token back into open_pdf. Both the when and the when-not are stated, with the alternative tool named.

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

save_templateSave layout as templateAInspect

Persist the reviewed field layout: a future open_pdf of this exact file returns these fields with confidence 1.0 and no ML pass.

Field names (set with update_fields name=..., e.g. 'age_score',
'total_abcd2') are stored in the template, so later sessions map values
by meaning instead of by coordinates. False positives present at save
time are stored too, so remove them first with `remove_fields` or
`prune_fields`. For ML-detected layouts, every page with fields must be
reviewed via `render_preview` before saving.

When to use:
- Call `save_template` after filling (only when the user confirms) to persist
  in-workspace field edits (`add_field`, `update_field`, `remove_field`) across
  future sessions for the same blank PDF.
- Use `list_templates` to view existing saved templates on the account.
NameRequiredDescriptionDefault
nameYesHuman-readable display name for the saved template (e.g. `'IRS Form W-9'`, `'Vendor Onboarding Form'`).
workspace_idYesActive workspace ID returned by `open_pdf` (`summary.workspace_id`) whose reviewed field layout should be saved.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare a safe non-destructive write; the description adds the real behavioral payload: templates capture field names so later sessions map by meaning rather than coordinates, false positives present at save time get baked in, and unreviewed pages are a documented precondition. It also discloses the downstream consequence (confidence 1.0, no ML pass), which is exactly the context annotations cannot convey.

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

Conciseness4/5

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

Front-loaded with the effect and its consequence, then a clearly separated 'When to use' list. Slightly long and heavy on backticked identifiers, but every sentence carries operational information rather than 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 two-parameter persistence tool with an output schema already defined, the description covers the effect, the preconditions, the ordering against sibling mutation tools, and the alternative for inspection. Nothing needed to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are well documented in-schema, including the pointer to open_pdf's summary.workspace_id. The description's use of 'name=...' refers to field names set via update_fields rather than the template `name` parameter, so it adds no extra semantics about the two arguments themselves. Baseline 3 is appropriate.

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?

The opening sentence states a specific verb and resource ('Persist the reviewed field layout') and immediately defines the observable effect: a future open_pdf of the exact file returns these fields with confidence 1.0 and no ML pass. That distinguishes it cleanly from siblings like update_fields (in-session edit) and list_templates (read-only listing).

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?

An explicit 'When to use' block states the trigger (after filling, only when the user confirms), the class of edits persisted (add_field, update_field, remove_field), and names the alternative for viewing saved templates (list_templates). It also gives ordering prerequisites: remove false positives with remove_fields/prune_fields first, and review every page via render_preview for ML-detected layouts.

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

update_fieldUpdate a fieldA
Destructive
Inspect

Modify an existing field's position, size, semantic name, type, or alignment in the active workspace.

Overwrite/merge behavior: performs a partial update (patch) on `field_id` in
`workspace_id`. Only the optional parameters explicitly provided with non-`None`
values (`x`, `y`, `w`, `h`, `name`, `field_type`, `align`, `vertical_align`)
overwrite the field's attributes; omitted or `None` parameters keep their
existing values unchanged. Editing an ML-detected field (`source="ml"`)
promotes it to `source="agent"` with `confidence=1.0`. Returns the updated
field dict, or `{"error": ...}` if `field_id` is not found in the workspace.

Persistence & review impact: changes persist immediately in the active
workspace (`workspace_id`), invalidate the page's visual review receipt when
geometry (`x`, `y`, `w`, `h`) changes, and do not affect saved account
templates unless `save_template` is called.

When to use:
- Use `update_field` when modifying a single existing field.
- Use `update_fields` for batch updates across 2 or more fields in one call
  (e.g. assigning semantic `name`s before `save_template`).
- Use `add_field` to create a missing field, or `remove_field` to delete a
  false-positive field.
NameRequiredDescriptionDefault
hNoNew box height as a percentage of page height (`> 0.0` and `<= 100.0 - y`). Omit or pass `None` to keep the existing `h`.
wNoNew box width as a percentage of page width (`> 0.0` and `<= 100.0 - x`). Omit or pass `None` to keep the existing `w`.
xNoNew left-edge horizontal coordinate as a percentage of page width (`0.0`–`100.0`, top-left origin). Omit or pass `None` to keep the existing `x`.
yNoNew top-edge vertical coordinate as a percentage of page height (`0.0`–`100.0`, top-left origin). Omit or pass `None` to keep the existing `y`.
nameNoNew short semantic label for the field (e.g. `'company_name'`, `'total_score'`). Omit or pass `None` to keep the existing `name`.
alignNoNew horizontal text alignment: `'left'`, `'center'`, or `'right'`. Omit or pass `None` to keep the existing alignment.
field_idYesID of the existing field to modify (from `open_pdf`, `list_fields`, or `add_field`, e.g. `'p0_f1'` or `'p0_a1'`).
field_typeNoNew field type: `'text'`, `'number'`, `'date'`, `'checkbox'`, `'radio'`, `'signature'`, `'dropdown'`, `'field'`, or `'cell'`. Omit or pass `None` to keep the existing type.
workspace_idYesActive workspace ID returned by `open_pdf` (`summary.workspace_id`).
vertical_alignNoNew vertical text alignment: `'top'`, `'middle'`, or `'bottom'`. Omit or pass `None` to keep the existing vertical alignment.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, and openWorldHint=false, so the safety profile is covered structurally, and the description adds real context: patch semantics for non-None params, ML-to-agent source promotion with confidence=1.0, immediate persistence, review-receipt invalidation on geometry changes, and template isolation unless save_template is called. It also discloses the error return shape for a missing field_id. However the destructiveHint=true annotation is never reconciled in prose -- the description presents this as a routine patch without warning that a field's geometry or type can be irreversibly altered, which is the one behavior an agent most needs spelled out for a destructive operation.

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

Conciseness4/5

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

Front-loaded with the core action, then organized under labeled blocks (Overwrite/merge, Persistence & review impact, When to use) that let an agent scan to the relevant concern. It runs long for a single-field update, and the parameter list is enumerated twice (in the header sentence and again in the patch paragraph), which is mild redundancy.

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?

An output schema exists, so return values needn't be described, yet the description still notes the updated-field dict and the error variant. With ten parameters, a destructive mutation, and cross-cutting effects on review receipts and templates, every consequence an agent needs before calling is present.

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% and each parameter already documents its range and None semantics, so the baseline is 3. The description earns above baseline by stating the unifying rule that ties all eight optional params together -- only non-None values overwrite, everything else is preserved -- which is a cross-parameter contract the per-field schema text cannot express, plus the conditional side effect on source/confidence tied to field_type edits.

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?

The description opens with a specific verb and resource plus the full attribute set that can be modified ('position, size, semantic name, type, or alignment'), and scopes it to 'the active workspace'. It is immediately distinguishable from add_field, remove_field, and update_fields, all of which are named with their own trigger conditions.

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?

A dedicated 'When to use' block states the single-field case explicitly and routes three alternatives: update_fields for 2+ fields in one call, add_field for missing fields, remove_field for false positives. Both the inclusion condition and the exclusion conditions are given, leaving nothing to inference.

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

update_fieldsUpdate many fieldsA
Destructive
Inspect

Batch-update multiple existing fields in the active workspace in a single call.

Each item in `updates` is `{"field_id": ..., x?, y?, w?, h?, name?,
field_type?, align?, vertical_align?}`. Only keys provided with non-`None`
values overwrite the target field's attributes; omitted keys keep their
existing values, and edited ML fields (`source="ml"`) are promoted to
`source="agent"` (`confidence=1.0`).

Partial-failure & persistence semantics: unknown `field_id`s are skipped and
reported in `unknown_field_ids` while all valid updates in the batch are
applied and listed in `updated`. However, an invalid `field_type`, `align`,
or `vertical_align` raises an error and aborts the entire batch without
saving partial edits. Changes persist immediately in `workspace_id` without
affecting saved templates unless `save_template` is called.

When to use:
- Prefer `update_fields` over repeated `update_field` calls whenever renaming,
  repositioning, or resizing 2 or more fields at once.
- Use `update_field` for a single field, or `add_field` to create new fields.
NameRequiredDescriptionDefault
updatesYesList of partial-update dicts, each with `'field_id'` (str) plus any attributes to modify: `'x'`, `'y'`, `'w'`, `'h'` (float, `0.0`–`100.0` % of page), `'name'` (str), `'field_type'` (`'text'|'number'|'date'|'checkbox'|'radio'|'signature'|'dropdown'|'field'|'cell'`), `'align'` (`'left'|'center'|'right'`), or `'vertical_align'` (`'top'|'middle'|'bottom'`). Omitted keys keep their existing values.
workspace_idYesActive workspace ID returned by `open_pdf` (`summary.workspace_id`).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint=true, openWorldHint=false), the description discloses partial-failure semantics: unknown field_ids are skipped and reported while valid updates apply, but an invalid field_type/align/vertical_align aborts the whole batch with no partial save. It also explains ML-to-agent promotion with confidence=1.0 and that edits persist to the workspace but not to templates unless save_template is called.

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

Conciseness4/5

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

Front-loaded with purpose, then semantics, then a scannable 'When to use' list — well organized. The literal dict sketch of update keys duplicates the schema's list of the same fields, costing a line of redundancy.

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 destructive batch mutation, the description covers atomicity, skip-vs-abort behavior, persistence scope, and template interaction; an output schema exists so return-shape detail is unnecessary, and it still names the key result keys (updated, unknown_field_ids).

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 already 100%, so baseline is 3; the description adds the non-obvious semantic that omitted keys preserve existing values and that editing an ML field flips source to agent. The inline item-shape sketch largely repeats the schema's own enumeration of allowed values, so it earns 4 rather than 5.

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?

The first sentence gives a specific verb and resource ('Batch-update multiple existing fields in the active workspace') plus the batching scope, and later text explicitly distinguishes it from update_field and add_field. An agent can route between the three without opening any schema.

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?

A dedicated 'When to use' block states the selection rule ('prefer update_fields ... whenever ... 2 or more fields at once') and names the alternatives for the single-field and create cases. Exclusions and alternatives are explicit, not inferred.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 14 tool updates
    • Changedadd_field10 fields changed
      • addedInput schema / properties / align / description
        Added value: +"Horizontal text alignment inside the box: `'left'`, `'center'`, or `'right'`. Omit or pass `None` for the default alignment."
      • addedInput schema / properties / field_type / description
        Added value: +"Field input type: `'text'` (default), `'number'`, `'date'`, `'checkbox'`, `'radio'`, `'signature'`, `'dropdown'`, `'field'`, or `'cell'`."
      • addedInput schema / properties / h / description
        Added value: +"Height of the field box as a percentage of page height (`> 0.0` and `<= 100.0 - y`)."
      • addedInput schema / properties / name / description
        Added value: +"Short semantic label for the field (e.g. `'applicant_full_name'`, `'signature_date'`). Stored in the workspace and in templates saved via `save_template`."
      • addedInput schema / properties / page_index / description
        Added value: +"0-based page index (`0` to `page_count - 1`) on which to place the new field."
      • addedInput schema / properties / vertical_align / description
        Added value: +"Vertical text alignment inside the box: `'top'`, `'middle'`, or `'bottom'`. Omit or pass `None` for the default vertical alignment."
      • addedInput schema / properties / w / description
        Added value: +"Width of the field box as a percentage of page width (`> 0.0` and `<= 100.0 - x`)."
      • addedInput schema / properties / workspace_id / description
        Added value: +"Active workspace ID returned by `open_pdf` (`summary.workspace_id`)."
      • addedInput schema / properties / x / description
        Added value: +"Horizontal position of the box's left edge as a percentage of page width (`0.0` to `100.0`, origin at top-left)."
      • addedInput schema / properties / y / description
        Added value: +"Vertical position of the box's top edge as a percentage of page height (`0.0` to `100.0`, origin at top-left)."
    • Changedclose_workspace1 field changed
      • addedInput schema / properties / workspace_id / description
        Added value: +"Active workspace ID returned by `open_pdf` (`summary.workspace_id`) to close and purge."
    • Changedfill_pdf4 fields changed
      • addedInput schema / properties / fillable / description
        Added value: +"If `True`, synthesizes interactive, editable AcroForm widgets for the fields in the output PDF (subject to account entitlement; takes precedence over `flatten`)."
      • addedInput schema / properties / flatten / description
        Added value: +"If `True` (default), flattens filled values into static page content. If `False`, preserves existing embedded AcroForm widgets as editable fields."
      • addedInput schema / properties / values / description
        Added value: +"Non-empty mapping of `field_id` (from `open_pdf` or `list_fields`) to the string value to fill. Checkboxes tick on `'yes'`, `'x'`, or `'true'`. Must not contain restricted data (payment cards, PHI, government IDs, or authentication secrets)."
      • addedInput schema / properties / workspace_id / description
        Added value: +"Active workspace ID returned by `open_pdf` (`summary.workspace_id`)."
    • Changedlist_fields2 fields changed
      • addedInput schema / properties / page_index / description
        Added value: +"Optional 0-based page index (`0` to `page_count - 1`) to filter fields to a single page. Omit or pass `None` to list fields across all pages in the workspace."
      • addedInput schema / properties / workspace_id / description
        Added value: +"Active workspace ID returned by `open_pdf` (`summary.workspace_id`)."
    • Changedlist_templates1 field changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of most recently updated templates to return for the authenticated account (default `50`)."
    • Changedopen_pdf7 fields changed
      • addedInput schema / properties / file_base64 / description
        Added value: +"Base64-encoded bytes of a small unmodified PDF or image (< ~200 KB). For larger files, use `file`, `url`, or `request_file_upload` + `upload_token` to avoid model truncation. Mutually exclusive with `file`, `url`, and `upload_token`."
      • addedInput schema / properties / filename / description
        Added value: +"Display filename for the workspace and default output filename stem (e.g. `'w9.pdf'`). Automatically inferred from the attachment or URL path when left at the default `'document.pdf'`."
      • addedInput schema / properties / force_detect / description
        Added value: +"If `True`, skips saved account templates and embedded AcroForm fields and forces a fresh ML detection pass across the first `max_pages` pages."
      • addedInput schema / properties / max_pages / description
        Added value: +"Maximum number of pages (starting from page 0, minimum 1) to scan during ML field detection. Unscanned pages are reported in `summary.unprocessed_page_indices`."
      • addedInput schema / properties / min_confidence / description
        Added value: +"Minimum ML detection confidence threshold in `0.0`–`1.0` (inclusive). ML-detected fields scoring below `min_confidence` are omitted; deterministic template and AcroForm fields always have confidence `1.0` and are kept."
      • addedInput schema / properties / upload_token / description
        Added value: +"One-time upload token returned by `request_file_upload` after the file has been uploaded (or `'latest'` to use the most recent unconsumed upload). Mutually exclusive with `file`, `url`, and `file_base64`."
      • addedInput schema / properties / url / description
        Added value: +"Public HTTP or HTTPS URL of the PDF or form image (JPG, PNG, TIFF, WEBP; max 50 MB). Mutually exclusive with `file`, `upload_token`, and `file_base64`."
    • Changedprune_fields7 fields changed
      • addedInput schema / properties / confidence_below / description
        Added value: +"Strictly-less-than ML confidence threshold (`0.0`–`1.0`); only fields with `confidence < confidence_below` match. Omit or pass `None` for no confidence filter."
      • addedInput schema / properties / exclude_ids / description
        Added value: +"Optional guardrail allowlist of `field_id`s to protect and keep in the workspace even if they match all pruning criteria."
      • addedInput schema / properties / field_type / description
        Added value: +"Exact field type to match for deletion (e.g. `'cell'`, `'field'`, `'text'`, `'checkbox'`). Omit or pass `None` to match any type."
      • addedInput schema / properties / height_below / description
        Added value: +"Strictly-less-than height threshold as a percentage of page height (`0.0`–`100.0`); only fields with `h < height_below` match. Omit or pass `None` for no height filter."
      • addedInput schema / properties / page_index / description
        Added value: +"0-based page index (`0` to `page_count - 1`) to restrict pruning to a single page. Omit or pass `None` to prune matching fields across all pages."
      • addedInput schema / properties / width_below / description
        Added value: +"Strictly-less-than width threshold as a percentage of page width (`0.0`–`100.0`); only fields with `w < width_below` match. Omit or pass `None` for no width filter."
      • addedInput schema / properties / workspace_id / description
        Added value: +"Active workspace ID returned by `open_pdf` (`summary.workspace_id`)."
    • Changedremove_field2 fields changed
      • addedInput schema / properties / field_id / description
        Added value: +"ID of the field to permanently delete from the workspace (from `open_pdf` or `list_fields`, e.g. `'p0_f3'`)."
      • addedInput schema / properties / workspace_id / description
        Added value: +"Active workspace ID returned by `open_pdf` (`summary.workspace_id`)."
    • Changedremove_fields2 fields changed
      • addedInput schema / properties / field_ids / description
        Added value: +"List of field IDs (from `open_pdf` or `list_fields`, e.g. `['p0_f2', 'p0_f5']`) to permanently remove from the workspace. Duplicate IDs are deduplicated; unknown IDs are ignored and returned in `unknown_field_ids`."
      • addedInput schema / properties / workspace_id / description
        Added value: +"Active workspace ID returned by `open_pdf` (`summary.workspace_id`)."
    • Changedrender_filled_preview5 fields changed
      • addedInput schema / properties / fillable / description
        Added value: +"If `True`, synthesizes interactive AcroForm widgets on flat/scanned PDFs (takes precedence over `flatten`). Must match the `fillable` flag later passed to `fill_pdf`."
      • addedInput schema / properties / flatten / description
        Added value: +"If `True` (default), bakes text statically into the page content. If `False`, preserves existing embedded AcroForm widgets as editable. Must match the `flatten` flag later passed to `fill_pdf`."
      • addedInput schema / properties / page_index / description
        Added value: +"0-based page index (`0` to `page_count - 1`) of the document to render."
      • addedInput schema / properties / values / description
        Added value: +"Mapping of `field_id` (from `open_pdf` or `list_fields`) to the string value to render. Checkboxes tick on `'yes'`, `'x'`, or `'true'`. Do not pass restricted data (payment cards, PHI, government IDs, or authentication secrets)."
      • addedInput schema / properties / workspace_id / description
        Added value: +"Active workspace ID returned by `open_pdf` (`summary.workspace_id`)."
    • Changedrender_preview2 fields changed
      • addedInput schema / properties / page_index / description
        Added value: +"0-based page index (`0` to `page_count - 1`) to render with field bounding-box overlays."
      • addedInput schema / properties / workspace_id / description
        Added value: +"Active workspace ID returned by `open_pdf` (`summary.workspace_id`)."
    • Changedsave_template2 fields changed
      • addedInput schema / properties / name / description
        Added value: +"Human-readable display name for the saved template (e.g. `'IRS Form W-9'`, `'Vendor Onboarding Form'`)."
      • addedInput schema / properties / workspace_id / description
        Added value: +"Active workspace ID returned by `open_pdf` (`summary.workspace_id`) whose reviewed field layout should be saved."
    • Changedupdate_field10 fields changed
      • addedInput schema / properties / align / description
        Added value: +"New horizontal text alignment: `'left'`, `'center'`, or `'right'`. Omit or pass `None` to keep the existing alignment."
      • addedInput schema / properties / field_id / description
        Added value: +"ID of the existing field to modify (from `open_pdf`, `list_fields`, or `add_field`, e.g. `'p0_f1'` or `'p0_a1'`)."
      • addedInput schema / properties / field_type / description
        Added value: +"New field type: `'text'`, `'number'`, `'date'`, `'checkbox'`, `'radio'`, `'signature'`, `'dropdown'`, `'field'`, or `'cell'`. Omit or pass `None` to keep the existing type."
      • addedInput schema / properties / h / description
        Added value: +"New box height as a percentage of page height (`> 0.0` and `<= 100.0 - y`). Omit or pass `None` to keep the existing `h`."
      • addedInput schema / properties / name / description
        Added value: +"New short semantic label for the field (e.g. `'company_name'`, `'total_score'`). Omit or pass `None` to keep the existing `name`."
      • addedInput schema / properties / vertical_align / description
        Added value: +"New vertical text alignment: `'top'`, `'middle'`, or `'bottom'`. Omit or pass `None` to keep the existing vertical alignment."
      • addedInput schema / properties / w / description
        Added value: +"New box width as a percentage of page width (`> 0.0` and `<= 100.0 - x`). Omit or pass `None` to keep the existing `w`."
      • addedInput schema / properties / workspace_id / description
        Added value: +"Active workspace ID returned by `open_pdf` (`summary.workspace_id`)."
      • addedInput schema / properties / x / description
        Added value: +"New left-edge horizontal coordinate as a percentage of page width (`0.0`–`100.0`, top-left origin). Omit or pass `None` to keep the existing `x`."
      • addedInput schema / properties / y / description
        Added value: +"New top-edge vertical coordinate as a percentage of page height (`0.0`–`100.0`, top-left origin). Omit or pass `None` to keep the existing `y`."
    • Changedupdate_fields2 fields changed
      • addedInput schema / properties / updates / description
        Added value: +"List of partial-update dicts, each with `'field_id'` (str) plus any attributes to modify: `'x'`, `'y'`, `'w'`, `'h'` (float, `0.0`–`100.0` % of page), `'name'` (str), `'field_type'` (`'text'|'number'|'date'|'checkbox'|'radio'|'signature'|'dropdown'|'field'|'cell'`), `'align'` (`'left'|'center'|'right'`), or `'vertical_align'` (`'top'|'middle'|'bottom'`). Omitted keys keep their existing values."
      • addedInput schema / properties / workspace_id / description
        Added value: +"Active workspace ID returned by `open_pdf` (`summary.workspace_id`)."
  2. 15 tool updates
    • First observedadd_field
    • First observedclose_workspace
    • First observedfill_pdf
    • First observedlist_fields
    • First observedlist_templates
    • First observedopen_pdf
    • First observedprune_fields
    • First observedremove_field
    • First observedremove_fields
    • First observedrender_filled_preview
    • First observedrender_preview
    • First observedrequest_file_upload
    • First observedsave_template
    • First observedupdate_field
    • First observedupdate_fields

Publisher details

Operator
JustFill · Publisher source
Vendor relationship
First-party · Publisher source
Restrictions
Not applicable

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Turn flat PDFs into fillable forms and fill them from data, documents, or a spreadsheet. Remote MCP server (Streamable HTTP) with OAuth sign-in at https://api.getemboss.ai/mcp, no local install required.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables filling any PDF form, including scanned or AcroForm, through a browser-based drag-and-drop editor. Works entirely locally with no data leaving the machine.
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables AI coding agents to inspect digital or scanned PDF forms and worksheets, map detected answer slots through a virtual Excel/Set-of-Marks view, and inject baseline-snapped text, multi-line answers, or option marks into clean output PDFs. Supports visual verification of completed pages.
    6
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.