laserfiche-mcp
This MCP server connects Claude (or any MCP client) to a self-hosted Laserfiche repository, enabling searching, browsing, reading, and optionally writing documents and metadata.
Search & Discovery
search_entries— Run raw Laserfiche query syntax against the repositorysearch_by_name— Simplified name-pattern search with optional folder scopingsearch_natural— LLM-friendly guided search: first call returns grammar reference + discovered templates + candidate queries; second call executes with automatic 400 repair
Browsing & Navigation
list_folder— List immediate children of any folderget_entry/get_entry_by_path— Fetch full metadata by ID or backslash-delimited pathget_field_values— Read all template field values assigned to an entry
Document Content
get_document_text— Server-extracted text (v2 API only)get_document_edoc— Inspect edoc metadata, download raw bytes as base64, or extract text client-side via pypdf
Schema & Definitions
list_field_definitions,list_tag_definitions,list_template_definitions,list_link_definitions— Enumerate repository metadata definitionsget_template_fields— Get fields for a specific template with required-field filteringget_audit_reasons— List audit reason codes for delete/export operations
Async Task Management
get_task_status,wait_for_task,task_wait_or_poll— Poll or block on async operations
Write Operations (opt-in via LF_READ_ONLY=false)
Create folders, import documents, copy entries asynchronously
Rename and move entries
Set, merge, or clear field values, tags, and entry links
Assign or remove templates (with optional required-field pre-validation)
Delete entries (cascading for folders), edocs, or specific page ranges
Safety Guardrails
Read-only by default; writes require explicit opt-in
Path-prefix fencing (
LF_WRITE_PATHS_ALLOW/LF_WRITE_PATHS_DENY) and tool-level allowlistsFolder-delete batch caps and optional audit-reason requirements
HMAC-signed two-step confirmation tokens for destructive operations (expire after 5 minutes)
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@laserfiche-mcpsearch for documents containing 'project plan' in the repository"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
laserfiche-mcp
Community project — not affiliated with or endorsed by Laserfiche.
A Model Context Protocol server that lets Claude (Desktop, Code, or any MCP client) search and read documents in a Laserfiche repository.
Current release v2.2.0 — read and write tools for self-hosted Repository API v1 and v2, a one-click Claude Desktop extension, and an optional remote HTTP transport with per-user OAuth for web clients. See the changelog for detail and the roadmap for what's next.
What you can do with it
Once connected, Claude can:
Read (always available):
Search the repository with native Laserfiche search syntax, by name pattern, or via the LLM-friendly
search_naturalflow (asks the server for templates first, then runs with automatic 400 repair)List the contents of any folder, look up an entry by ID or path, read all template field values, list field/tag/template/link definitions and audit reasons
Inspect document metadata, fetch the raw edoc as base64, or extract text server-side (PDF via pypdf) — all via
get_document_edoc(..., mode=...)
Write (opt-in via LF_READ_ONLY=false):
Create folders, import documents, copy entries (async), rename and move entries
Set, merge, and clear fields, tags, and links on an entry
Assign and remove templates — with optional client-side validation of repository-required fields before the API call
Delete entries (folders cascade), edocs, and specific page ranges — all with a two-step preview→confirm-token flow, HMAC-signed and bound to operation + entry, expiring after 5 minutes
Operate safely — every write checks the entry's path against
LF_WRITE_PATHS_ALLOW / LF_WRITE_PATHS_DENY, folder deletes refuse
unless force_large_delete=true when child count exceeds
LF_DELETE_FOLDER_MAX_DESCENDANTS, and LF_WRITE_TOOLS_ALLOWED can
scope a deployment to e.g. metadata-only writes.
Related MCP server: Document Tools
Install
Two ways to run it, depending on who you are.
For everyone — the Claude Desktop extension
Chat with your Laserfiche repository from Claude Desktop — no terminal, no config files.
1. Download
Download the extension (always the newest version), or browse the latest release. You'll need Claude Desktop installed first.
2. Double-click & connect
Double-click the file, click Install, and fill in the short form that appears:
Field | What to enter |
Repository API URL | Your Laserfiche server address, e.g. |
Repository name | The repository you pick when signing in to Laserfiche Web Access |
Username | A Laserfiche account that can read the repository |
Password | That account's password — stored safely in your computer's keychain |
Not sure what goes where? Ask whoever runs Laserfiche at your organization — it takes them a minute.
3. Ask
Open a chat and try:
"Find every invoice from March in the Accounting folder."
"What's in the Onboarding folder? Summarize the newest document."
"Search for contracts mentioning Acme and list them with dates."
Claude canlook, but never change or delete — the extension is read-only by default, and your password lives in your operating system's keychain, not a text file.
Full walkthrough for end users and team rollouts: docs/desktop-extension.md.
For developers — the Python package
uvx laserfiche-mcp # run directly, no install
pip install laserfiche-mcp # or add it to your environmentRequires Python 3.10+ and a reachable Laserfiche Repository API Server (self-hosted) with a service account that can read it, plus any MCP client (Claude Desktop, Claude Code, MCP Inspector). For local development:
git clone https://github.com/SamuelSHernandez/laserfiche-mcp
cd laserfiche-mcp
uv sync --extra devConfigure
Copy the example file and fill in your repository details:
cp .env.example .env
$EDITOR .envMinimum required variables for self-hosted password-grant auth:
Variable | Example |
|
|
|
|
|
|
|
|
| (your service account password) |
|
|
|
|
Optional write-mode variables (all default off; see the Safety model section for context):
Variable | Default | Purpose |
|
| Set |
| unset | Comma-separated path prefixes where writes are permitted (case-insensitive) |
| unset | Comma-separated path prefixes where writes are refused (deny wins over allow) |
| unset | Comma-separated write-tool names to scope what registers; e.g. metadata-only |
|
| Refuse folder deletes above this immediate-child count unless |
|
| When |
|
| Validate repo-wide required fields client-side before |
|
| Pre-flight field / tag / template / link-type names against cached schema definitions; returns |
|
| Cache window for the schema-definition lookups that back |
|
| Client-side cap on |
|
| Cap on |
See .env.example for the full list including OAuth
config, pagination limits, request timeout, retry attempts, and SSL
verification.
API version note: LFRepositoryAPI ships with different routing surfaces across builds. Older self-hosted installs expose
/v1/...paths; newer ones expose/v2/.... Probe your server with:curl {LF_REPO_API_URL}/v1/Repositories curl {LF_REPO_API_URL}/v2/RepositoriesWhichever returns a
200with a JSON repo list is your version. If the wrong value is set, every call fails with400 UnsupportedApiVersion. The default isv1because that is what most current on-prem installations expose.
Auth note: Laserfiche self-hosted does not accept HTTP Basic auth. The server exchanges your username/password for a bearer token at
POST /{api_version}/Repositories/{repository_id}/Tokenon first request and refreshes it automatically before expiry. The same flow works on both v1 and v2.
Connect to Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json
(macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"laserfiche": {
"command": "uvx",
"args": ["laserfiche-mcp"],
"env": {
"LF_REPO_API_URL": "https://lf.example.com/LFRepositoryAPI",
"LF_REPOSITORY_ID": "my-repo",
"LF_API_VERSION": "v1",
"LF_USERNAME": "service-account",
"LF_PASSWORD": "replace-me",
"LF_AUTH_MODE": "password",
"LF_READ_ONLY": "true"
}
}
}
}Restart Claude Desktop. The Laserfiche tools will appear in the tool picker.
Connect to Claude Code
claude mcp add laserfiche -- uvx laserfiche-mcp(Pass env vars via --env LF_REPO_API_URL=... flags or set them in your
shell before running Claude Code.)
Test it locally with the MCP Inspector
npx @modelcontextprotocol/inspector uvx laserfiche-mcpThis opens a UI where you can call each tool directly and watch the JSON-RPC traffic — useful for verifying endpoint shapes against your specific Repository API Server version before wiring it into Claude.
Remote HTTP (web clients)
The default transport is stdio — for local clients that launch the server as a subprocess (Claude Desktop, Claude Code, Cursor, Gemini CLI). Web and cloud clients (claude.ai custom connectors, ChatGPT connectors) can't spawn a local process; they connect to a URL. The same server can serve those clients over Streamable HTTP:
laserfiche-mcp --http # binds 127.0.0.1:8000, path /mcp
laserfiche-mcp --http --port 9000 # override port for this runConfiguration (all optional, LF_* env like everything else):
Variable | Default | Purpose |
|
| Bind interface. Loopback by default — not reachable off the machine. |
|
| Listen port. |
|
| Endpoint path; clients connect to |
| (unset) | Static shared bearer token. Simplest auth; ignored when OAuth is on. |
| (unset) | Turns on per-user OAuth — verifies each caller's token against this authorization server. |
The --http server chooses its auth by precedence: OAuth (if
LF_HTTP_OAUTH_ISSUER is set) → static token (if LF_HTTP_AUTH_TOKEN) →
none (loopback only). OAuth is the multi-user path for claude.ai / ChatGPT;
see Per-user OAuth below.
Verify locally with the Inspector (point it at the URL, not the command):
laserfiche-mcp --http &
npx @modelcontextprotocol/inspector # then connect to http://127.0.0.1:8000/mcpPer-user OAuth
For a multi-user connector, run the server as an OAuth 2.1 Resource Server — each user signs in through your existing identity provider (LFDS, Microsoft Entra, Okta, Auth0, Google) and the server verifies their token:
pip install 'laserfiche-mcp[oauth]'
LF_HTTP_OAUTH_ISSUER="https://login.microsoftonline.com/<tenant>/v2.0" \
LF_HTTP_PUBLIC_URL="https://lf.example.com/mcp" \
LF_HTTP_OAUTH_AUDIENCE="api://laserfiche-mcp" \
LF_HTTP_OAUTH_REQUIRED_SCOPES="laserfiche.read" \
laserfiche-mcp --http --host 0.0.0.0The server then serves protected-resource metadata (RFC 9728), so claude.ai /
ChatGPT discover your authorization server, run the authorization_code + PKCE
flow, and present a bearer token that this server verifies (signature via JWKS,
plus aud / iss / exp / scopes). This is authentication at the edge —
verified requests still reach Laserfiche via the shared service account, so the
Laserfiche audit trail shows that account, not the end user. Full details,
including IdP registration and the security checklist, are in
docs/remote-http.md.
Connecting a web client
claude.ai and ChatGPT connectors need a public HTTPS URL. In practice that
means putting this server behind a reverse proxy (or a tunnel like cloudflared
/ ngrok for a spike) and adding the resulting https://…/mcp URL as a custom
connector in the client's settings.
Read this before exposing --http to a network.
Configure auth: OAuth (
LF_HTTP_OAUTH_ISSUER) for multi-user, or at least a long randomLF_HTTP_AUTH_TOKEN. Binding off-loopback with neither logs a warning and leaves your repository reachable unauthenticated.Terminate TLS at a reverse proxy in front of this server (it speaks plain HTTP).
Your Laserfiche server is self-hosted behind a firewall; a public connector needs a deliberate network path in to it (VPN / DMZ / tunnel).
See docs/remote-http.md for the full deployment and security checklist.
Tools
Tool names below are shown in their original verb-first form (
get_entry,set_fields, ...) for readability. In v2.0 every tool is also registered under thelaserfiche_{resource}_{verb}form (laserfiche_entry_get,laserfiche_field_set, ...). Both names resolve to the same function. Thelaserfiche_*names are the recommended path; the old names remain as deprecation aliases through v2.x and will be removed in v3.0. The authoritative mapping lives in_V2_RENAME_MAPinsrc/laserfiche_mcp/server.py.
Reads (always registered)
Tool | v2 name | Purpose |
|
| Run a raw Laserfiche search query, e.g. |
|
| Convenience wrapper: name pattern + optional folder scope |
|
| Two-mode guided search: ask for grammar+templates, then run with auto-repair on 400 |
|
| List children of a folder by ID |
|
| Fetch metadata for one entry by ID |
|
| Resolve a full path to an entry |
|
| Read all template fields assigned to an entry |
|
| Server-side extracted text (v2 only; v1 use |
|
| Inspect edoc ( |
|
| List repos for this account; falls back to the configured repo if endpoint disabled |
|
| Enumerate all field definitions; pass |
|
| Enumerate tag definitions; supports |
|
| Enumerate template definitions; supports |
|
| Enumerate entry-link type definitions; supports |
|
| Atomic "what fields does this template need" lookup; pass |
|
| Audit reasons available to the authenticated user (for delete/export) |
|
| Poll the status of an async operation (delete, copy) |
|
| Block until an async operation reaches a terminal state |
Writes (registered only when LF_READ_ONLY=false)
Tool | v2 name | Purpose | Two-step token? |
|
| OVERWRITE all field values on an entry (fields not in the body are deleted) | — |
|
| GET-then-PUT helper: update specific fields, preserve the rest | — |
|
| OVERWRITE all tags on an entry | — |
|
| Add/remove specific tags without touching others | — |
|
| OVERWRITE all entry links | — |
|
| Assign a template, optionally with initial field values (preflight-validated) | — |
|
| Clear the template assignment | — |
|
| Create a child folder under a parent | — |
|
| Multipart upload from a local file path; capped by | — |
|
| Async copy via | — |
|
| Rename an entry — preview shows old/new path, then re-call with the token | yes |
|
| Move (optionally rename) — fence applies to both source AND destination paths | yes |
|
| Delete an entry (folders cascade); preview shows child count + batch-cap status | yes |
|
| Wipe the electronic-document content; entry + metadata remain | yes |
|
| Delete specific page ranges; refuses empty | yes |
Tools with two-step token return a preview + HMAC-signed
confirmation_token on first call. Surface the preview to the user; on
go-ahead, re-call with the same arguments plus the token. Tokens are
bound to (operation, entry_id, entry_name), expire after 5 minutes,
and are invalidated by server restart.
Using search_natural
search_entries requires hand-written Laserfiche query syntax. If the
server rejects the query the only feedback the LLM gets is a generic HTTP
400 — there's nothing actionable to retry against. search_natural is the
LLM-friendly path:
First call — pass the user's question and (optionally) a
folder_pathto scope the answer; leavelf_queryunset. The tool samples up to ten entries from that folder, returns the templates and field names it found, the Laserfiche search grammar reference, and 2–3 candidate query strings the LLM can choose from or refine.Second call — same
question, plus the chosenlf_query. On HTTP 400, the tool tries up to two automatic repairs (escape unescaped quotes inside values, then wildcard-wrap bareName=values iffuzzy=True) before returning a structured error with all attempts visible so the LLM can author a fresh query.
The page-size cap for search_natural is the dedicated LF_MAX_PAGE_SIZE
env var (default 100) — some self-hosted SimpleSearches implementations
reject $top values above an internal limit, so this defaults lower than
the list/folder cap.
get_document_edoc modes
On v1 servers the Laserfiche Text export endpoint doesn't exist, so
get_document_text cannot return anything. get_document_edoc gained a
mode parameter as the workaround:
Mode | Use it when |
| You only need metadata (size, content-type). Default. |
| You want the raw file as base64 — capped at |
| You want extracted text. PDFs go through |
All tool descriptions are written to read like prompts — they tell the
model when to use the tool, valid input shapes, and what kind of follow-up
is expected. See src/laserfiche_mcp/server.py.
Errors
Every tool returns a stable dict on failure instead of raising — so the
LLM gets actionable, structured data instead of Error executing tool ....
{
"mode": "error",
"operation": "laserfiche_entry_delete",
"kind": "not_found",
"error": "not_found",
"status_code": 404,
"server_error_code": null,
"server_message": null,
"reason": "Server returned 404 — the entry, path, or endpoint does not exist.",
"request_id": "9f2c…",
"upstream_trace_id": null,
"entry_id": 999
}kind is one of five canonical ToolErrorKind values — LLMs branch on
this for category-level decisions (retry vs ask user vs abort):
Kind | Meaning |
| The named entry, path, or endpoint doesn't exist. Verify with the user. |
| Credentials, ACLs, or local fence config refused the operation. |
| The server told the caller to slow down. Back off and retry. |
| The request is malformed or fails a local pre-flight. Fix and re-call. |
| LF returned 5xx, 405, or an opaque failure. Retry once, then surface. |
error is the more-specific subkind. Server-mapped subkinds:
Subkind | Triggers |
| HTTP 401/403, LF errorCode 9010, or LF 9528 ("LFDS unreachable" — usually creds too) |
| LF errorCode 9039/9066 |
| HTTP 404 |
| HTTP 405 — usually an MCP routing bug |
| HTTP 415 — usually a wire-format bug (missing |
| HTTP 429 |
| HTTP 5xx or unrecognized failure |
Tools also have pre-server mode: error shapes (path_not_allowed,
path_traversal_blocked, exceeds_batch_cap,
invalid_confirmation_token, missing_required_fields,
page_range_required, invalid_page_range, invalid_name,
invalid_field_name, invalid_tag_name, invalid_template_name,
invalid_link_type, file_not_found, size_exceeds_cap,
tool_not_allowed). list_repositories returns mode: fallback
instead of erroring when the server doesn't expose the endpoint — see
the docstring for the response shape.
See docs/error-contract.md for the full
taxonomy, per-tool triggers, and the kind ↔ subkind mapping.
Safety model
Wondering what Claude actually sees and where your document content goes? See Data handling & privacy — it covers the data flow, what leaves the machine, and how to scope a service account so sensitive folders are never exposed. The rest of this section is about the write-mode guards.
Writes are off by default. When you enable them (LF_READ_ONLY=false),
the following guards are available — all independent, all opt-in
except as noted:
Path-prefix fences (
LF_WRITE_PATHS_ALLOW,LF_WRITE_PATHS_DENY) — every write checks the entry'sfullPath(or the parent's for creates) against the configured prefixes. Case-insensitive, deny wins over allow, both\and/accepted.move_entryfences on BOTH source and destination paths so a token from an allowed source can't be replayed to land in a denied folder. Strongest single fence — recommended for any non-trivial deployment.Tool-level allowlist (
LF_WRITE_TOOLS_ALLOWED) — restrict which write tools register at all. Example:merge_fields,merge_tags,assign_templatefor a metadata-only deployment that can't create or delete anything.Folder-delete batch cap (
LF_DELETE_FOLDER_MAX_DESCENDANTS, default 50) —delete_entryon a folder with more immediate children refuses unlessforce_large_delete=trueis passed alongside the confirmation token. The preview surfacesexceeds_batch_cap: trueso the LLM can explain the size before re-calling.Audit-reason requirement (
LF_REQUIRE_AUDIT_REASON, default false) — when true,delete_entryrefuses without anaudit_reason_id. Useget_audit_reasonsto enumerate valid IDs.Required-field validation (
LF_VALIDATE_REQUIRED_FIELDS, default true) —assign_templatelistsFieldDefinitions, findsisRequired: truefields, checks them against what's on the entry and what's in the caller'sfields=, and returns a structuredmissing_required_fieldserror before the PUT — instead of the server's opaqueMultistatus response. [9039].Two-step confirmation tokens (always on for destructive ops) —
rename_entry,move_entry,delete_entry,delete_edoc,delete_pagesreturn a preview + HMAC-signed token on first call; execute on second call. Tokens bind to(operation, entry_id, entry_name), expire after 5 minutes, invalidate on server restart.
Recommended starting config for write mode
"env": {
"LF_READ_ONLY": "false",
"LF_WRITE_PATHS_ALLOW": "\\Sandbox\\mcp-test", // scope to a sandbox first
"LF_WRITE_TOOLS_ALLOWED": "create_folder,import_document,merge_fields,merge_tags,assign_template,delete_entry",
"LF_DELETE_FOLDER_MAX_DESCENDANTS": "10",
"LF_REQUIRE_AUDIT_REASON": "false" // turn on once you have a workflow
}Pre-create the sandbox folder by hand in the Laserfiche web client; the
fence needs an existing parent to read its fullPath. Once
smoke-tested, broaden the tool list — path scope is still the strongest
fence regardless of which tools are registered.
Roadmap
v2.x follow-ups (deferred from the v2.0 audit) — write-tool collapses (
field_update(mode),tag_update(add, remove),link_update(mode)), preview/execute splits of the 5 destructive tools, parameter-description polish for the JSON schema the LLM sees, structured JSON logging (LF_LOG_FORMAT=json) with aredact()helper. Working notes indocs/internal/TODO.md.Server-side audit logging — sidecar file with rotation, capturing every write tool call with the authenticated user, target entry, and outcome.
Cloud — Laserfiche Cloud support (
signin.laserfiche.comJWT-signedclient_credentialsflow plus theapi.laserfiche.comv2-only endpoint surface).v3.0 — Remove the verb-first deprecation aliases (
get_entry,set_fields, ...). Only thelaserfiche_{resource}_{verb}names remain.Beyond — Workflow trigger tools, async
/Searchesflow for large result sets, server-side text extraction for Office documents.
Development
uv sync --extra dev
uv run pytest # mocked HTTP, enforces 80% coverage baseline
uv run ruff check src tests
uv run mypy srcTests use pytest-httpx to mock the Repository API and committed
fixture PDFs to exercise the text-extraction paths — they don't require a
real Laserfiche server.
Opt-in integration tests
LF_INTEGRATION_TEST=1 uv run pytest tests/test_integration.pyReads the same LF_* env vars the server uses at runtime. Optional
overrides:
LF_INTEGRATION_FOLDER_PATH— folder used in thesearch_naturalMode A test (defaults to repository root)LF_INTEGRATION_PDF_ENTRY_ID— known PDF entry; if unset, edoc tests skipLF_INTEGRATION_SAFE_QUERY— a query expected to return results on your repo (defaults to{LF:Name="*"})
Use this before tagging a release if you have a reachable repository — it catches issues that mocked HTTP can't surface (server-side query syntax quirks, real PDF extraction, transport-level rejections).
Contributing
Issues and PRs welcome — particularly:
Endpoint corrections for Repository API Server builds the v1 / v2 wire format hasn't been validated against
Laserfiche Cloud client + JWT-signed
client_credentialsassertion flowServer-side audit logging for write-mode deployments (sidecar file + rotation)
Structured JSON logging + per-tool-call redaction (
LF_LOG_FORMAT=json)Async
/Searchesflow for very large result sets
This is a community project, not affiliated with or endorsed by Laserfiche.
License
Released under the MIT License. Copyright (c) 2026 Samuel S. Hernandez.
Available Tools
38 toolsget_audit_reasonsA
Return the audit-reason codes the authenticated user is allowed to supply.
Use before delete_entry or get_document_edoc (with export
auditing) when LF_REQUIRE_AUDIT_REASON=true or when the user is
asking for an audited delete. The response is grouped by operation
type — pick an ID from the correct group.
Returns: Dict shaped roughly as {"deleteEntry": [{id, name, ...}], "exportDocument": [...], ...}. Each item has id, name, and
description. The id is what you pass to delete_entry as
audit_reason_id.
On failure: returns {"mode": "error", "error": <slug>, ...}.
Common slugs: auth_failed if the account isn't permitted to audit.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavior: it returns a dict grouped by operation type, details each item's fields, and describes failure responses including common error slugs like 'auth_failed'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with distinct sections for purpose, usage, return value, and failure cases. Every sentence earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters and the presence of an output schema, the description explains the return shape, error handling, and provides enough context for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No input parameters exist (empty schema), so baseline is 4. The description adds value by explaining the output structure and how to use the returned IDs, which is more than the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Return the audit-reason codes the authenticated user is allowed to supply.' It specifies the exact verb and resource, and distinguishes from sibling tools by focusing on audit reasons.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use before 'delete_entry' or 'get_document_edoc' under specific conditions (LF_REQUIRE_AUDIT_REASON=true or audited delete). It tells the agent which IDs to pick from the response groups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_edocA
Download or inspect a document's raw electronic file (edoc).
The recommended path for reading document content on v1 servers
(get_document_text has no endpoint to call there). Three modes
trade off cost vs. depth:
Args:
entry_id: Integer entry ID. Must point to an electronic document,
not a folder.
mode:
"info" (default) — fetches the edoc but returns only its
size and content-type, plus a hint. No bytes enter the model's
context. Cheapest; safe to call on anything as a first probe.
``"bytes"`` — returns the edoc as base64-encoded bytes plus
content-type and size. Refused if the edoc exceeds
``LF_EDOC_MAX_BYTES`` (default 25 MB) — see ``max_bytes``.
``"text"`` — extracts readable text server-side:
- ``application/pdf`` → pypdf, page by page, truncated to
``text_char_limit``. Response includes ``pages_total``,
``pages_extracted``, ``truncated``.
- ``text/*`` → decoded directly as UTF-8 (replacement chars
on bad bytes).
- Anything else (.docx, .xlsx, images, etc.) → structured
error naming the content-type and suggesting ``mode="bytes"``
for client-side handling. OCR is not attempted.
- Encrypted or malformed PDFs → structured error with the
underlying exception class.
max_bytes: Per-call override for ``LF_EDOC_MAX_BYTES``. Use to
raise the cap for a specific large document without changing
the server-wide default.
text_char_limit: Truncate extracted text after this many
characters (default 50,000). Truncation is signalled by the
``truncated`` field, NOT a marker in the text itself.Returns: Always a dict. Shape depends on mode — see above.
On size-cap refusal, response contains error="size_exceeds_cap"
plus byte_size and max_bytes so the LLM can decide whether
to raise the cap and retry.
On failure: returns {"mode": "error", "error": <slug>, "entry_id": <int>, ...}. Common slugs: not_found (entry is a
folder, or has no edoc), auth_failed.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 'info' (default): metadata only, no bytes returned. 'bytes': base64 payload, capped by max_bytes / LF_EDOC_MAX_BYTES. 'text': server-side extracted text — PDF via pypdf, text/* decoded directly, other types return unsupported_content_type. OCR is not attempted. | info |
| entry_id | Yes | Entry ID of an electronic document (not a folder). | |
| max_bytes | No | Per-call override for LF_EDOC_MAX_BYTES (default 25 MB). Only applies to mode='bytes' and 'text'. | |
| text_char_limit | No | Truncate extracted text after this many characters (mode='text' only). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It thoroughly discloses behavior: three modes with detailed return info, size cap handling, error slugs for various cases (e.g., `not_found`, `auth_failed`), and details on text extraction limitations (OCR not attempted, encrypted PDFs).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with bullet points for modes and parameter details. It is fairly long but each sentence adds value. Slightly verbose in explaining modes, but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (4 params, 3 modes, output schema), the description is very complete. It explains return shapes per mode, error responses with common slugs, and size cap behavior. The output schema exists but the description adds essential context on failure modes and edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description adds significant detail beyond the schema. For example, it explains the mode enum in depth (including default and behavior for each), the `max_bytes` override, `text_char_limit` truncation signaling, and the `entry_id` requirement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Download or inspect a document's raw electronic file (edoc).' It also distinguishes itself from the sibling tool `get_document_text` by noting that `get_document_text` has no endpoint on v1 servers, making the purpose specific and differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it is the recommended path for reading content on v1 servers, and explains the three modes with trade-offs. It does not explicitly state when not to use, but the alternatives are implied through the mode explanations and the mention of `get_document_text`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_textA
Download a document's server-extracted text (v2-only).
Use for "summarize this document", "what does this say", or any other task that needs the readable contents of a document rather than the raw binary. The text comes from Laserfiche's own extraction pipeline (OCR for image documents, upstream extraction for office files), so you get clean text without having to parse a PDF yourself.
v1 servers do not expose this endpoint. If your deployment is on
v1 (the default), this tool returns a structured error at the client
layer. Use get_document_edoc(entry_id, mode="text") instead — it
fetches the raw edoc and extracts text client-side (pypdf for PDFs,
direct decode for text/* MIME types).
Args:
entry_id: Integer entry ID of an electronic document (not a folder).
max_chars: Truncate the returned text after this many characters
(default 50,000). The response's truncated field signals
whether truncation occurred.
Returns: {"entry_id": <int>, "text": <str>, "char_count": <int>, "truncated": <bool>} on success.
On failure: returns {"mode": "error", "error": <slug>, "entry_id": <int>, ...}. Common slugs: not_found (entry is a
folder, or has no extracted text), method_not_allowed /
server_error (v1 server — fall back to get_document_edoc).
| Name | Required | Description | Default |
|---|---|---|---|
| entry_id | Yes | Entry ID of an electronic document. | |
| max_chars | No | Truncate the returned text after this many characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description fully discloses behavior: v2-only, extraction pipeline (OCR for images, upstream for office), truncation with max_chars, detailed error slugs for various failure modes (not_found, method_not_allowed, server_error). Essentially all behavioral traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with sections (Args, Returns, On failure) and bullet points. Some sentences are verbose but every sentence adds value. Could be slightly more compact without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 2 parameters, an output schema, and complex behavior (version restriction, error handling), the description covers everything needed: input constraints, output format, error slugs, version fallback. The agent can fully understand how to invoke and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already provides good descriptions (100% coverage), but the description adds crucial context: entry_id must be an electronic document (not folder), max_chars defaults to 50000 and truncation is signaled by the 'truncated' field. This goes beyond what the schema defines.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool downloads server-extracted text for electronic documents, with explicit use cases ('summarize this document', 'what does this say'). It distinguishes itself from get_document_edoc which provides raw binary, and from other siblings that retrieve different data types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (tasks needing readable contents) and when not (v1 servers, raw binary needs). Provides fallback instruction to use get_document_edoc with mode='text'. No ambiguity about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entryA
Fetch metadata for a single entry by ID.
Use this once you have an entry ID (from search, list_folder, or
get_entry_by_path) and need the entry's full metadata: name, type
(Folder vs Document), full path, parent ID, template name, page count
(for paginated documents), and timestamps.
This does NOT return field values — for those, call get_field_values.
This does NOT return document content — for that, call
get_document_edoc (mode="text" for extracted text, mode="bytes"
for the raw file).
Args: entry_id: Integer entry ID.
Returns: EntryDetail (id, name, entry_type, parent_id, full_path,
template_name, page_count, is_electronic_document, extension, creation
time, last modified time).
On failure: returns {"mode": "error", "error": <slug>, "entry_id": <int>, ...}.
Common slugs: not_found, auth_failed.
| Name | Required | Description | Default |
|---|---|---|---|
| entry_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description carries full burden. Clearly states it returns metadata only and not field values or content. Describes error slugs. Minor lack of mention of auth requirements, but acceptable for a read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with clear sections, bullet points, and explicit 'does NOT' statements. Slightly verbose but every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given output schema exists, description provides enough context: lists return fields, covers error handling, and explains what the tool does not do. Complete for a single-parameter metadata fetch tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter entry_id. Description adds context: 'Integer entry ID' and where to obtain it (from search, list_folder, etc.), which adds value beyond schema's type and required declaration.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Fetch metadata for a single entry by ID' with specific verb and resource. Distinguishes from siblings by noting alternative tools for field values and document content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (once you have an entry ID from specific tools) and what it does NOT return, with clear pointers to alternatives (get_field_values, get_document_edoc). Includes return format and error handling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entry_by_pathA
Resolve a backslash-delimited Laserfiche path to its entry.
Use this when the user refers to a location by its name path rather
than an ID — typical when they paste a path from the Laserfiche web
client, or when you've authored a path from a known folder structure.
Once resolved, the returned id feeds into list_folder,
get_entry, get_field_values, etc.
Args:
full_path: Path from the repository root, backslash-separated.
Example: "\Imports\2024\Onboarding\Smith,John". Forward
slashes are also accepted.
Returns: EntryDetail — same shape as get_entry.
On failure: returns {"mode": "error", "error": <slug>, "full_path": <str>, ...}. Common slugs: not_found (no entry at
that path), auth_failed.
| Name | Required | Description | Default |
|---|---|---|---|
| full_path | Yes | Path from the repository root, backslash-separated. Forward slashes are also accepted. Case-insensitive. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully describes behavior: it resolves the path, returns an EntryDetail, and on failure returns an error object with specific slugs. It also notes that forward slashes are accepted. This is sufficient for a read-only lookup tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: first paragraph gives purpose, second explains usage, third covers failure. It is concise without being terse, though the failure paragraph could be slightly reduced. Front-loaded with core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no nested objects), the description covers return values (EntryDetail shape), failure modes with common slugs, and usage context. No output schema is present, but the description provides enough information. It is complete for a straightforward path resolution tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds usage examples and context but does not significantly expand on the schema's explanation (e.g., case-insensitivity is in the schema but not in the description). The parameter semantics are adequately covered by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'resolve' targeting a 'backslash-delimited Laserfiche path' to its entry, clearly distinguishing it from sibling tools like 'get_entry' (which uses IDs) and search tools. It explicitly states when to use it: when the user refers to a location by path rather than ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (user pastes a path, or path authored from known structure) and what to do with the result (feed ID into other tools). It does not explicitly state when not to use it, but the usage context is clear and differentiates it from alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_field_valuesA
Read the template field values currently on an entry.
Use after you have an entry ID and need the metadata fields the user
is asking about — e.g. "what's the status of this form?", "who's the
assigned reviewer?", "when was this signed?". For the entry's own
properties (name, type, path), use get_entry instead.
Args: entry_id: Integer entry ID.
Returns: {"values": [...]} — a list of field-value descriptors
under the values key. Each item has field_name, values
(always a list, even for single-value fields), field_type,
is_multi_value, and is_required. Empty / unset fields are
typically omitted by the Repository API rather than returned with
empty values, so an empty list usually means the entry has no
template assigned.
On failure: returns {"mode": "error", "error": <slug>, "entry_id": <int>, ...}. Common slugs: not_found, auth_failed.
| Name | Required | Description | Default |
|---|---|---|---|
| entry_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description fully details the return format, including the structure of each field descriptor and behavior for empty/unset fields. It also covers failure modes with common error slugs. However, it doesn't mention authorization or rate limits, but as a read operation with no annotations, the provided information is still substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-line purpose, followed by usage guidance, examples, parameter definition, return format details, and error information. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, output schema detailed in description), the description provides complete context. It covers when to use, what to expect in return, and error handling. The distinction from get_entry makes it contextually complete among siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'entry_id' is explained in the Args section as 'Integer entry ID', which combined with the context of needing an entry ID makes its purpose clear. While the schema itself has no description (0% coverage), the description compensates adequately, though it could be more explicit about what the ID refers to.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads template field values from an entry, with a specific verb 'Read' and resource 'template field values'. It distinguishes from sibling tool 'get_entry' by noting that for entry properties (name, type, path) one should use get_entry instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use the tool: after having an entry ID and needing metadata fields. It gives example questions and directly advises against using it for entry properties, directing to get_entry instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_task_statusA
Look up the status of an async operation by its token.
The async tools (delete_entry, copy_entry, sometimes
import_document) return an operation_token instead of the
final result — call this to check whether the operation finished.
For "wait until done" semantics, use wait_for_task instead so
you don't have to write a polling loop.
Args: operation_token: The string token returned by the originating async tool.
Returns: Server's task payload — operationToken,
operationType, percentComplete, status (one of
NotStarted, InProgress, Completed, Failed,
Canceled), redirectUri (set when the op produced a new
entry, e.g. after a copy), entryId (the resulting entry's ID
when applicable), errors (list — empty on success), and
timestamps.
On failure: returns {"mode": "error", "error": <slug>, "operation_token": <str>, ...}. Common slugs: not_found
(token unknown — usually expired or from a different server
instance), auth_failed.
| Name | Required | Description | Default |
|---|---|---|---|
| operation_token | Yes | Operation token returned by an async tool (delete_entry, copy_entry, occasionally import_document). Server-scoped; tokens from a different server instance won't resolve. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description fully discloses behavior: returns detailed payload (operationToken, operationType, percentComplete, status, redirectUri, entryId, errors, timestamps) and error responses with common slugs (not_found, auth_failed).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured: brief summary, then context, alternative tool, detailed Args and Returns. Every sentence adds value; no redundancy. Front-loaded with purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and presence of output schema, the description is comprehensive: covers purpose, usage, alternative, parameter semantics, and return values in detail, including errors.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers the only parameter (100% coverage). Description adds important context beyond schema: 'Server-scoped; tokens from a different server instance won't resolve,' which aids agent understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the purpose: 'Look up the status of an async operation by its token.' Identifies the verb 'look up' and specific resource 'status of async operation,' and distinguishes from sibling tools like wait_for_task.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes when to use: to check whether an async operation finished using an operation_token. Provides an alternative: 'For wait until done semantics, use wait_for_task instead so you don't have to write a polling loop.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_template_fieldsA
Return the fields belonging to a single template, with full field metadata.
Closes the most common pre-assign workflow gap: instead of fetching
list_template_definitions then list_field_definitions and
cross-referencing client-side, this returns the template's field
list directly with each field's type, constraints, and required
flag inlined. Use this BEFORE assign_template to construct the
fields argument.
Args:
template_name: Exact template name (case-sensitive on most
builds). Use list_template_definitions to discover
available names.
required_only: When True, return only fields where
is_required is true. Useful for "what's the minimum I
have to supply?" workflows.
Returns: {"template_name": <str>, "template_id": <int>, "field_count": <int>, "fields": [...]} where each field has
name, field_type, is_required, is_multi_value,
list_values, default_value, length, constraint.
On failure: returns {"mode": "error", "error": <slug>, ...}.
Slugs: invalid_template_name when the template name doesn't
exist in the repository (with the list of valid names in the
response); server_error for upstream issues.
| Name | Required | Description | Default |
|---|---|---|---|
| required_only | No | When True, return only fields where is_required is true — useful for 'what's the minimum I have to supply?' workflows. | |
| template_name | Yes | Exact template name (case-sensitive on most builds). Use list_template_definitions to discover available names. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description fully discloses behavior: return structure, field metadata details, failure slugs (invalid_template_name, server_error), and case-sensitivity. It meets the full burden for a read-only tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with Args, Returns, and On failure sections. Each sentence adds value, though slightly verbose. Efficient for the information density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's role in a broader workflow and the presence of an output schema, the description is thorough: explains return format, error handling, usage context, and links to sibling tools. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. The description adds extra context beyond the schema: clarifies case-sensitivity for template_name, suggests using list_template_definitions, and explains the required_only parameter's utility. This justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns fields belonging to a single template with full field metadata. It distinguishes itself from siblings like list_template_definitions and list_field_definitions by solving the cross-referencing gap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit workflow guidance: use this BEFORE assign_template to construct the fields argument. Also mentions using list_template_definitions to discover names. Lacks explicit when-not-to-use instructions but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_audit_reason_listA
Return the audit-reason codes the authenticated user is allowed to supply.
Use before delete_entry or get_document_edoc (with export
auditing) when LF_REQUIRE_AUDIT_REASON=true or when the user is
asking for an audited delete. The response is grouped by operation
type — pick an ID from the correct group.
Returns: Dict shaped roughly as {"deleteEntry": [{id, name, ...}], "exportDocument": [...], ...}. Each item has id, name, and
description. The id is what you pass to delete_entry as
audit_reason_id.
On failure: returns {"mode": "error", "error": <slug>, ...}.
Common slugs: auth_failed if the account isn't permitted to audit.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description fully discloses behavior. It details the return format (grouped by operation type, each with id, name, description), failure modes (error slugs like auth_failed), and the fact that the entity is a query/list operation. No contradictions exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the primary purpose and usage context. It is comprehensive but slightly verbose; minor trimming could improve conciseness without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool, the description is complete. It covers purpose, when to use, return format (including pseudo-schema), failure modes, and error handling. The output schema existence is noted, and the description provides a richer explanation than the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters (schema is empty). Per calibration, baseline is 4. The description adds value by explaining the output structure and usage context, far exceeding the baseline. It fully compensates for the lack of parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Return the audit-reason codes the authenticated user is allowed to supply,' specifying a distinct verb and resource. It differentiates from sibling tools (e.g., get_entry, list_folder) which are general retrieval operations, whereas this tool returns codes for a specific use case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Use before delete_entry or get_document_edoc (with export auditing) when LF_REQUIRE_AUDIT_REASON=true or when the user is asking for an audited delete.' It also explains how to interpret the response and adapt behavior based on the operation type.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_document_get_edocA
Download or inspect a document's raw electronic file (edoc).
The recommended path for reading document content on v1 servers
(get_document_text has no endpoint to call there). Three modes
trade off cost vs. depth:
Args:
entry_id: Integer entry ID. Must point to an electronic document,
not a folder.
mode:
"info" (default) — fetches the edoc but returns only its
size and content-type, plus a hint. No bytes enter the model's
context. Cheapest; safe to call on anything as a first probe.
``"bytes"`` — returns the edoc as base64-encoded bytes plus
content-type and size. Refused if the edoc exceeds
``LF_EDOC_MAX_BYTES`` (default 25 MB) — see ``max_bytes``.
``"text"`` — extracts readable text server-side:
- ``application/pdf`` → pypdf, page by page, truncated to
``text_char_limit``. Response includes ``pages_total``,
``pages_extracted``, ``truncated``.
- ``text/*`` → decoded directly as UTF-8 (replacement chars
on bad bytes).
- Anything else (.docx, .xlsx, images, etc.) → structured
error naming the content-type and suggesting ``mode="bytes"``
for client-side handling. OCR is not attempted.
- Encrypted or malformed PDFs → structured error with the
underlying exception class.
max_bytes: Per-call override for ``LF_EDOC_MAX_BYTES``. Use to
raise the cap for a specific large document without changing
the server-wide default.
text_char_limit: Truncate extracted text after this many
characters (default 50,000). Truncation is signalled by the
``truncated`` field, NOT a marker in the text itself.Returns: Always a dict. Shape depends on mode — see above.
On size-cap refusal, response contains error="size_exceeds_cap"
plus byte_size and max_bytes so the LLM can decide whether
to raise the cap and retry.
On failure: returns {"mode": "error", "error": <slug>, "entry_id": <int>, ...}. Common slugs: not_found (entry is a
folder, or has no edoc), auth_failed.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 'info' (default): metadata only, no bytes returned. 'bytes': base64 payload, capped by max_bytes / LF_EDOC_MAX_BYTES. 'text': server-side extracted text — PDF via pypdf, text/* decoded directly, other types return unsupported_content_type. OCR is not attempted. | info |
| entry_id | Yes | Entry ID of an electronic document (not a folder). | |
| max_bytes | No | Per-call override for LF_EDOC_MAX_BYTES (default 25 MB). Only applies to mode='bytes' and 'text'. | |
| text_char_limit | No | Truncate extracted text after this many characters (mode='text' only). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility. It thoroughly explains behavioral traits: mode-specific handling, size cap enforcement, truncation signaling, error slugs (not_found, auth_failed), and that OCR is not attempted. It also details response shapes and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections for Args, Returns, and On failure, using bullet points for modes. It is front-loaded with the purpose. While somewhat lengthy, every sentence adds value. Minor redundancy in error explanation could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (4 parameters, 3 modes, output schema present), the description is exceptionally complete. It covers all modes, error cases, edge cases (encrypted PDFs, unsupported types), and explains why get_document_text is unavailable on v1. It leaves no ambiguity for agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant context beyond schema defaults and descriptions. It explains per-mode applicability of max_bytes and text_char_limit, the default cap of 25 MB, and how bytes mode refuses oversized files. It also clarifies that text_char_limit truncation is signaled via a field, not a marker.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Download or inspect a document's raw electronic file (edoc)', differentiating from sibling tools by noting that 'get_document_text has no endpoint to call there' on v1 servers. It explicitly describes three modes and their purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises using 'info' as a first probe, and distinguishes between modes for different needs. It implicitly contrasts with get_document_text by explaining when this tool is the alternative. However, it does not explicitly list all alternative tools or provide a when-not-to-use scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_document_get_textA
Download a document's server-extracted text (v2-only).
Use for "summarize this document", "what does this say", or any other task that needs the readable contents of a document rather than the raw binary. The text comes from Laserfiche's own extraction pipeline (OCR for image documents, upstream extraction for office files), so you get clean text without having to parse a PDF yourself.
v1 servers do not expose this endpoint. If your deployment is on
v1 (the default), this tool returns a structured error at the client
layer. Use get_document_edoc(entry_id, mode="text") instead — it
fetches the raw edoc and extracts text client-side (pypdf for PDFs,
direct decode for text/* MIME types).
Args:
entry_id: Integer entry ID of an electronic document (not a folder).
max_chars: Truncate the returned text after this many characters
(default 50,000). The response's truncated field signals
whether truncation occurred.
Returns: {"entry_id": <int>, "text": <str>, "char_count": <int>, "truncated": <bool>} on success.
On failure: returns {"mode": "error", "error": <slug>, "entry_id": <int>, ...}. Common slugs: not_found (entry is a
folder, or has no extracted text), method_not_allowed /
server_error (v1 server — fall back to get_document_edoc).
| Name | Required | Description | Default |
|---|---|---|---|
| entry_id | Yes | Entry ID of an electronic document. | |
| max_chars | No | Truncate the returned text after this many characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: text source (OCR/extraction pipeline), truncation behavior, return format, and error slugs (not_found, method_not_allowed, server_error). It also explains the dependency on v2 and the fallback.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections (purpose, usage, args, returns). Front-loaded with the main action, then provides necessary details. Every sentence adds value; no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity and presence of output schema, the description covers all aspects: input parameters, output structure, error handling, version dependency, and alternative tools. It is fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds value beyond schema: clarifies entry_id must be for an electronic document (not folder), specifies default max_chars (50,000), and explains the truncated response field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('Download a document's server-extracted text'), specifies it's v2-only, and gives explicit use cases like 'summarize this document'. It distinguishes itself from siblings by mentioning the v1 limitation and fallback tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('needs readable contents of a document') and when not to use ('v1 servers do not expose this endpoint'), including a direct alternative (use get_document_edoc with mode='text'). Also warns against using for folders.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_entry_getA
Fetch metadata for a single entry by ID.
Use this once you have an entry ID (from search, list_folder, or
get_entry_by_path) and need the entry's full metadata: name, type
(Folder vs Document), full path, parent ID, template name, page count
(for paginated documents), and timestamps.
This does NOT return field values — for those, call get_field_values.
This does NOT return document content — for that, call
get_document_edoc (mode="text" for extracted text, mode="bytes"
for the raw file).
Args: entry_id: Integer entry ID.
Returns: EntryDetail (id, name, entry_type, parent_id, full_path,
template_name, page_count, is_electronic_document, extension, creation
time, last modified time).
On failure: returns {"mode": "error", "error": <slug>, "entry_id": <int>, ...}.
Common slugs: not_found, auth_failed.
| Name | Required | Description | Default |
|---|---|---|---|
| entry_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description mentions it retrieves metadata (read-only behavior), specifies the return fields, and describes error response format. It does not explicitly mention side effects or authentication, but the read-only nature is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with a clear first sentence, then usage context, explicit exclusions, and a concise args/returns section. Every sentence adds value, and it is appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single parameter, no annotations, but presence of output schema, the description covers purpose, usage, parameter, return fields, and error conditions comprehensively. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema description coverage, the description mentions the sole parameter 'entry_id' as 'Integer entry ID.' This adds minimal information over the schema type definition; however, since there is only one simple parameter, it is adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Fetch metadata for a single entry by ID' with explicit verb and resource. Distinguishes from sibling tools by noting it does not return field values (call get_field_values) or document content (call get_document_edoc).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: after obtaining an entry ID from search, list_folder, or get_entry_by_path. Also provides explicit guidance on what not to use it for and which alternative tools to call instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_entry_get_by_pathA
Resolve a backslash-delimited Laserfiche path to its entry.
Use this when the user refers to a location by its name path rather
than an ID — typical when they paste a path from the Laserfiche web
client, or when you've authored a path from a known folder structure.
Once resolved, the returned id feeds into list_folder,
get_entry, get_field_values, etc.
Args:
full_path: Path from the repository root, backslash-separated.
Example: "\Imports\2024\Onboarding\Smith,John". Forward
slashes are also accepted.
Returns: EntryDetail — same shape as get_entry.
On failure: returns {"mode": "error", "error": <slug>, "full_path": <str>, ...}. Common slugs: not_found (no entry at
that path), auth_failed.
| Name | Required | Description | Default |
|---|---|---|---|
| full_path | Yes | Path from the repository root, backslash-separated. Forward slashes are also accepted. Case-insensitive. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses failure modes (error slugs like 'not_found', 'auth_failed') and the output shape, which provides good behavioral context for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for purpose, usage, arguments, returns, and failures. It is front-loaded with the main purpose and concise enough. Minor redundancy with schema but acceptable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (single parameter, output schema defined), the description covers all necessary aspects: purpose, usage guidance, parameter details, return value shape, and failure modes. No critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a thorough description and examples. The tool description adds value by repeating the parameter info in a readable form, noting that forward slashes are accepted, and providing an explicit example. It does not add much beyond the schema but is helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool resolves a backslash-delimited Laserfiche path to its entry, using specific verbs. It distinguishes from siblings like 'get_entry' (which uses an ID) by explicitly referencing path-based resolution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use: when the user refers to a location by its path, such as from the web client. It also explains how the returned id feeds into other tools, but it does not mention when *not* to use it or provide explicit alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_entry_searchA
Run a raw Laserfiche search query and return matching entries.
Use when you already know how to express the search in Laserfiche query
syntax. If the user describes what they want in natural language and you
are unsure how to translate, prefer search_natural (which asks the
server for the available templates and field names first). For a simple
name-pattern lookup, search_by_name is the cheaper option.
Query syntax cheat sheet:
{LF:Name="Onboarding*"}— name pattern (*and?wildcards){[Loan Application]:[Last Name]="Smith"}— field on template{LF:LookIn="\Imports\2024"}— restrict to a folder subtreeCombine with
&(AND) /|(OR), e.g.{LF:Name="*.pdf"} & {[Application]:[Status]="Approved"}
Args:
query: A Laserfiche search expression. Quote string values with
double quotes; escape inner quotes by doubling them.
max_results: Page size (default 25, capped by LF_MAX_RESULTS_CEILING,
typically 200).
Returns: SearchResults with entries (id, name, entry_type,
full_path), total_count, and next_link. Drill in with
get_entry or get_field_values.
On failure: returns {"mode": "error", "error": <slug>, ...} instead
of raising. Slugs you might see here: server_error (most common, the
SimpleSearches endpoint is fragile on some self-hosted builds — see
search_natural for a more resilient path), auth_failed,
rate_limited. Full taxonomy in docs/error-contract.md.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Laserfiche search expression. Each clause wrapped in braces and combined with `&` (AND) or `|` (OR). Quote string values with double quotes; escape inner quotes with `\"`. | |
| max_results | No | Page size. Defaults to LF_MAX_RESULTS_DEFAULT (25). Capped at LF_MAX_RESULTS_CEILING (typically 200). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses return format, error slugs, and that the endpoint can be fragile on some builds.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage guidelines, cheat sheet, args, returns, and error handling. Every sentence adds value with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema and 2 parameters, the description is complete, covering usage, errors, and providing a cheat sheet.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds value by explaining query structure, default max_results, capping, and error return format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it runs a raw Laserfiche search query, and distinguishes from siblings like search_natural and search_by_name, providing specific verb+resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool (already know query syntax) and when not (natural language → search_natural; simple name → search_by_name). Also provides a query syntax cheat sheet.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_entry_search_by_nameA
Find entries by file/folder name pattern, optionally scoped to a folder path.
Use when the user is searching by name and the full Laserfiche query
syntax is overkill. This wraps search_entries with a
{LF:Name="..."} (plus optional {LF:LookIn="..."}) clause built
for you.
Args:
name_pattern: A name with optional wildcards — * matches any
sequence, ? matches one character. Examples:
"Onboarding*" (starts-with), "*.pdf" (ends-with),
"Smith,?" (exactly one char after the comma).
in_folder_path: Backslash-delimited Laserfiche path to scope the
search to. Example: "\Imports\2024".
max_results: Page size (default 25, capped by LF_MAX_RESULTS_CEILING).
Returns: same SearchResults shape as search_entries.
On failure: returns {"mode": "error", "error": <slug>, ...}. See
docs/error-contract.md. Note that SimpleSearches is the same fragile
endpoint behind search_entries — fall back to search_natural
if you get repeated server_error results.
| Name | Required | Description | Default |
|---|---|---|---|
| max_results | No | Page size (default 25, capped by LF_MAX_RESULTS_CEILING). | |
| name_pattern | Yes | Name with optional wildcards. `*` matches any sequence (including empty); `?` matches exactly one character. Case-insensitive. No wildcards = exact match. | |
| in_folder_path | No | Optional backslash-delimited folder path to scope the search. Forward slashes are also accepted. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool wraps search_entries, uses the same fragile endpoint, and describes the return shape and error format. It also mentions case-insensitivity and wildcards. It could add more about rate limits or pagination details, but the existing transparency is quite good.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (Args, Returns, On failure). It is concise, front-loads the purpose, and every sentence adds value. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters and an output schema (not shown but mentioned), the description covers purpose, usage, parameter details, return shape, error handling, and alternatives. It is complete and leaves no significant gaps for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with good descriptions, but the description adds extra value with detailed wildcard examples for name_pattern, path format for in_folder_path, and a note about max_results default being capped by LF_MAX_RESULTS_CEILING. These examples enhance understanding beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool finds entries by file/folder name pattern and positions it as a convenience wrapper over search_entries. It distinguishes itself from sibling tools like search_entries and search_natural by specifically targeting name-based searches without full query syntax.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use when the user is searching by name and the full Laserfiche query syntax is overkill.' It also provides a fallback strategy: 'fall back to search_natural if you get repeated server_error results.' This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_entry_search_naturalA
Two-mode search: guidance first, then execution with automatic repair.
Most Laserfiche servers reject malformed query syntax with a generic HTTP 400. This tool gives the host LLM a structured way to author a working query without trial-and-error against the user.
Mode A — lf_query omitted
Returns mode="guidance" with:
* grammar — the Laserfiche search syntax reference this server
understands, with examples.
* discovered_templates — template names and field names sampled
from folder_path (or the repository root). Use these to
author template-field queries like
{[Personnel]:[Last Name]="Smith"}.
* candidate_queries — up to 3 starter queries built from the
question's keywords. Pick one or refine it, then call again with
lf_query.
* follow_up — the exact follow-up call shape.
Mode B — lf_query provided
Executes the query and returns mode="results" (or
mode="error" with structured detail). On HTTP 400, up to two
automatic repairs are attempted:
1. Escape unescaped ``"`` characters inside ``="..."`` value spans.
2. Wrap ``Name="value"`` values in ``*`` wildcards (only when
``fuzzy=True`` and the value has no wildcard).
Each attempt is recorded in ``attempts`` on the error response.Pagination
max_results is clamped to LF_MAX_PAGE_SIZE (default 100).
Some self-hosted SimpleSearches implementations 400 on larger
$top values, so the cap is lower than the list-folder ceiling.
When next_link is null but the result count hit the effective
cap, pagination_unknown=true is surfaced — there may be more
results, the server just didn't say.
What this tool does NOT do It does not silently fall back to folder traversal. If both repairs still 400, you get a structured error so the user knows search failed and the host LLM can author a fresh query.
On failure
Mode B returns {mode: "error", attempts: [...]} with the full
repair history visible — each attempt records the query, the repair
tag applied, the HTTP status, and the server's error body, enough
context for the LLM to write a different query. Other failures
(auth, rate limit, network) come back via the generic error
contract; see docs/error-contract.md.
| Name | Required | Description | Default |
|---|---|---|---|
| fuzzy | No | When True (default), Mode B attempts a wildcard-wrap repair if the server 400s on a Name=value clause with no wildcards. Set False for exact-match queries that should NOT be relaxed. | |
| lf_query | No | Laserfiche query to execute (Mode B). Omit to get guidance (Mode A): grammar reference, sampled templates, candidate queries to refine. | |
| question | Yes | The user's natural-language search question. Used by Mode A to extract keywords for candidate queries and surfaced in Mode B responses for correlation. | |
| folder_path | No | Backslash-delimited folder path. In Mode A, narrows the template sample to this subtree; in Mode B, the LLM should embed {LF:LookIn="<path>"} in lf_query itself if scoping is wanted. | |
| max_results | No | Page size. Clamped to LF_MAX_PAGE_SIZE (default 100) — some self-hosted SimpleSearches implementations 400 on larger $top. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the burden of behavioral transparency. It covers two operational modes, automatic repair attempts on HTTP 400 (with details on repair steps), pagination behavior (max_results clamped, potential 400s on large $top, 'pagination_unknown' flag), and structured error responses. It also explicitly states what the tool does NOT do (no silent fallback).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but well-structured with clear headings (Mode A, Mode B, Pagination, What this tool does NOT do, On failure). It is front-loaded with the core purpose. Some redundancy exists (e.g., error handling mentioned twice), but overall the structure aids readability given the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (two modes, automatic repair, pagination nuances, error handling) and the presence of an output schema, the description covers all necessary context: what the tool does, when to use each mode, constraints (clamping, 400 risks), failure behavior, and explicit exclusions. No missing aspects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 5 parameters have descriptions in the schema (100% coverage). The description adds extra meaning beyond the schema: for max_results it explains why it's clamped and the risk of 400s; for lf_query it explains mode semantics; for fuzzy it details the wildcard repair behavior; for folder_path it explains usage in both modes. This additional context is valuable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool does two-mode search: guidance (Mode A when lf_query omitted) and execution with automatic repair (Mode B when lf_query provided). It explicitly distinguishes itself by stating 'What this tool does NOT do' (no silent fallback), helping to differentiate from sibling tools like laserfiche_entry_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use Mode A (to get guidance, grammar, templates, candidate queries) versus Mode B (to execute a query). It also describes the automatic repair behavior and pagination. However, it does not explicitly compare against sibling tools like laserfiche_entry_search or search_entries, missing an opportunity to guide users on alternative choices.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_field_definition_listA
List every field definition in the repository.
Use before authoring a field-based search query or preparing a field
update — the response tells you which fields exist, their types
(String, ShortInteger, List, Date, ...), whether they
accept multi-value, whether they're required at the repository level,
and (for List fields) the allowed values.
Independent fields and template-scoped fields are both returned.
Combine with list_template_definitions to see which fields belong
to which template.
Args:
max_results: Page size (default 25, capped by LF_MAX_RESULTS_CEILING).
skip: 0-indexed offset for pagination through large repositories.
summary_only: If True, return only {count, names} instead of the
full OData listing.
Returns: Server's raw OData listing with value (list of field
definitions). Each item includes id, name, fieldType,
isRequired, isMultiValue, listValues, defaultValue,
length, constraint.
On failure: returns {"mode": "error", "error": <slug>, ...}.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | 0-indexed offset for pagination through large repositories. | |
| max_results | No | Page size (default 25, capped by LF_MAX_RESULTS_CEILING). | |
| summary_only | No | When True, return only {count, names} instead of the full OData listing — useful for 'what's available?' lookups that would otherwise return 30-50 KB of definition payload. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: it returns a raw OData listing with specific fields, describes pagination (max_results, skip), the summary_only option, and failure mode ('On failure: returns error...'). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured: opening sentence, usage context, parameter details with Args, return format, and failure mode. Each sentence is informative without redundancy. Front-loaded with the main purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters and an output schema, the description covers purpose, usage context, all parameters, return format (including fields and error structure), and relationships with other tools. No gaps for an AI agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining the purpose of summary_only (reduces payload for quick lookups) and noting that max_results is capped by LF_MAX_RESULTS_CEILING, which is not in the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists every field definition in the repository, specifies the types of information returned (field names, types, multi-value, required, list values), and distinguishes from siblings by mentioning 'Combine with list_template_definitions' to show template membership.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'before authoring a field-based search query or preparing a field update.' Also suggests combining with list_template_definitions for template-scoped fields, providing clear guidance on tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_field_values_getA
Read the template field values currently on an entry.
Use after you have an entry ID and need the metadata fields the user
is asking about — e.g. "what's the status of this form?", "who's the
assigned reviewer?", "when was this signed?". For the entry's own
properties (name, type, path), use get_entry instead.
Args: entry_id: Integer entry ID.
Returns: {"values": [...]} — a list of field-value descriptors
under the values key. Each item has field_name, values
(always a list, even for single-value fields), field_type,
is_multi_value, and is_required. Empty / unset fields are
typically omitted by the Repository API rather than returned with
empty values, so an empty list usually means the entry has no
template assigned.
On failure: returns {"mode": "error", "error": <slug>, "entry_id": <int>, ...}. Common slugs: not_found, auth_failed.
| Name | Required | Description | Default |
|---|---|---|---|
| entry_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description carries full burden. It fully describes return format under 'values' key, each field item structure, empty/unset field handling (omitted by Repository API), and failure modes with error slugs. This is comprehensive behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with separate sections for purpose, usage, args, returns, and errors. Each sentence adds value, though slightly verbose in the returns section. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single parameter and presence of output schema, description covers all necessary context: when to use, output structure details, empty behavior, and failure modes. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage for the only parameter 'entry_id'. Description adds only 'Integer entry ID' which adds minimal meaning. With no schema description, this is insufficient; should provide more context like expected range or source of entry ID.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states 'Read the template field values currently on an entry' with specific verb and resource. Distinguishes from sibling tools like 'get_entry' by clarifying that 'For the entry's own properties (name, type, path), use get_entry instead.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use after you have an entry ID and need the metadata fields the user is asking about' with concrete query examples. Also provides negative guidance: 'For the entry's own properties, use get_entry instead.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_folder_listA
List the immediate children (documents and subfolders) of a folder by ID.
Use this for browse-style navigation when the user references a known
folder. The root folder is typically ID 1 — start there if you have
nothing else. To navigate from a path string, resolve it first with
get_entry_by_path. To search across the whole repo, use
search_natural or search_entries.
Args:
folder_id: Integer entry ID of the parent folder.
max_results: Page size (default 25, capped by LF_MAX_RESULTS_CEILING).
skip: 0-indexed offset for pagination. Combine with max_results
to walk a large folder in chunks; check next_link to know
when to stop.
Returns: SearchResults with entries, total_count (server
fills it only when the build supports $count), and next_link.
Each entry has id, name, entry_type, full_path, creation_time, and
last_modified_time. Drill into a single entry with get_entry or
get_field_values.
On failure: returns {"mode": "error", "error": <slug>, "folder_id": <int>, ...}. Common slugs: not_found (folder ID
doesn't exist), auth_failed (no read permission).
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | 0-indexed offset for pagination. Combine with max_results to walk a large folder in chunks; check next_link to know when to stop. | |
| folder_id | Yes | Integer entry ID of the parent folder. The root folder is typically ID 1. | |
| max_results | No | Page size (default 25, capped by LF_MAX_RESULTS_CEILING). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully covers behavioral traits: pagination details (max_results, skip, next_link), total_count availability, return structure, and error slugs (not_found, auth_failed). This is comprehensive for a listing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with Args and Returns sections, but it is slightly verbose for a simple tool. It could be trimmed while retaining all information, but it is not overly long and is front-loaded with purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description goes beyond expectations by detailing pagination, error handling, entry fields, and suggesting next steps (get_entry, get_field_values). It is fully complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 value by providing practical usage context (e.g., 'root is typically ID 1', 'check next_link to know when to stop'), which enhances understanding beyond the schema descriptions alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'List the immediate children (documents and subfolders) of a folder by ID,' which is a specific verb and resource. It distinguishes itself from siblings like get_entry_by_path (path resolution) and search_natural/search_entries (full repository search) by explicitly mentioning alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states when to use ('browse-style navigation when the user references a known folder') and when not to use ('To navigate from a path string, resolve it first with get_entry_by_path. To search across the whole repo, use search_natural or search_entries').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_link_definition_listA
List the entry-link type definitions available on this repository.
Use before calling set_links — you need a linkTypeId from
this listing to construct a valid link. Each link type is directed:
it has a sourceLabel (how the relationship reads from the source
entry) and a targetLabel (how it reads from the target).
Args:
max_results: Page size (default 25).
skip: 0-indexed offset for pagination.
summary_only: If True, return only {count, names}.
Returns: Server's raw OData listing with value. Each item has
linkTypeId, sourceLabel, targetLabel, and
linkTypeDescription. Common defaults include "Supersedes" / "Superseded by" and "Attachment" / "Message".
On failure: returns {"mode": "error", "error": <slug>, ...}.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | 0-indexed offset for pagination through large repositories. | |
| max_results | No | Page size (default 25, capped by LF_MAX_RESULTS_CEILING). | |
| summary_only | No | When True, return only {count, names} instead of the full OData listing — useful for 'what's available?' lookups that would otherwise return 30-50 KB of definition payload. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully describes the behavior: returns OData listing with value, each item has linkTypeId, sourceLabel, targetLabel, linkTypeDescription; mentions default link types and error format. It discloses pagination behavior and summary_only mode, adding useful context beyond a simple list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, followed by usage context, parameter docs, return format, and error handling. Every sentence adds value with no redundancy. It is efficiently written.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and an output schema (not fully detailed), the description provides sufficient context about the operation: list, pagination, return structure, and error handling. It could mention that it's read-only, but that is implied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already provides parameter info. The description adds value by explaining the effect of summary_only (avoids large payload) and clarifies defaults and pagination offset. This goes beyond the schema's descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists entry-link type definitions with a specific verb ('List') and resource ('entry-link type definitions'). It distinguishes from sibling list tools (e.g., field, tag, template definitions) by focusing on link types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use before calling set_links — you need a linkTypeId from this listing to construct a valid link.' This provides clear when-to-use guidance. It does not explicitly list when not to use, but the context and sibling names make the purpose distinct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_repository_listA
List the repositories this account can reach on the server.
Useful for confirming which repository the server is pointed at and for discovering alternate repositories the same account can access.
Endpoint variability: some self-hosted Laserfiche builds disable
the /Repositories endpoint entirely. When the call fails, this
tool does NOT raise — it returns the configured repo as a fallback
so downstream tools can still run. Branch on mode == "fallback"
if you need to distinguish a partial answer from a full enumeration.
Returns: On a healthy build, the server's raw OData listing with
value: [{repoId, displayName, ...}, ...]. On endpoint
failure: {"mode": "fallback", "warning": <str>, "server_error": <classified error>, "value": [{"repoId": "<LF_REPOSITORY_ID>", "displayName": null, "is_configured": true}]}.
On failure: this tool never raises and never returns mode: "error" — see the fallback shape above.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully explains behavior: it handles endpoint failure by returning a fallback instead of raising an error, and specifies that it never returns mode:error. This is comprehensive for a zero-parameter tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear first sentence, followed by usage guidance and detailed return shapes. It is concise but includes necessary details about fallback.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and the presence of an output schema, the description thoroughly explains both success and failure return shapes, including the fallback mode. It covers edge cases and is complete for effective tool use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so baseline is 4. The description adds no parameter info, which is appropriate as none exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists repositories the account can reach. It has a specific verb and resource, but does not explicitly distinguish from sibling list tools like list_folder or search_entries, though it is unique in purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (confirming repository, discovering alternates) and provides guidance on endpoint variability and fallback behavior. It does not list alternatives or when not to use, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_tag_definition_listA
List every tag definition in the repository.
Use before calling set_tags / merge_tags to confirm a tag
exists — the server rejects tags that aren't defined here. Tags are
a flat namespace in Laserfiche, distinct from template fields.
Args:
max_results: Page size (default 25, capped by LF_MAX_RESULTS_CEILING).
skip: 0-indexed offset for pagination.
summary_only: If True, return only {count, names}.
Returns: Server's raw OData listing with value (list of tag
definitions). Each item has id, name, and isSecurityTag.
Many repositories ship with no tags defined; an empty value is
normal.
On failure: returns {"mode": "error", "error": <slug>, ...}.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | 0-indexed offset for pagination through large repositories. | |
| max_results | No | Page size (default 25, capped by LF_MAX_RESULTS_CEILING). | |
| summary_only | No | When True, return only {count, names} instead of the full OData listing — useful for 'what's available?' lookups that would otherwise return 30-50 KB of definition payload. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description fully carries burden. Discloses server rejection of undefined tags, empty value normal for many repos, pagination behavior, and failure mode. Could add more on rate limits or auth requirements, but overall transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with Args and Returns sections. Every sentence provides essential information. No redundant or filler text. Efficient for agent consumption.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values are expected there. Description still clarifies the raw OData structure, fields, failure mode, and common edge case (empty repos). Complete for agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions, so baseline is 3. Description adds value beyond schema: mentions LF_MAX_RESULTS_CEILING cap, explains summary_only as useful for 'what's available?' lookups, and clarifies pagination offset meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'List every tag definition in the repository' with specific verb and resource. Distinguishes from sibling tools like set_tags/merge_tags and other list tools through context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to use before set_tags/merge_tags to confirm tag existence, explains server rejection of undefined tags, and notes that tags are a flat namespace distinct from template fields. Provides clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_task_get_statusA
Look up the status of an async operation by its token.
The async tools (delete_entry, copy_entry, sometimes
import_document) return an operation_token instead of the
final result — call this to check whether the operation finished.
For "wait until done" semantics, use wait_for_task instead so
you don't have to write a polling loop.
Args: operation_token: The string token returned by the originating async tool.
Returns: Server's task payload — operationToken,
operationType, percentComplete, status (one of
NotStarted, InProgress, Completed, Failed,
Canceled), redirectUri (set when the op produced a new
entry, e.g. after a copy), entryId (the resulting entry's ID
when applicable), errors (list — empty on success), and
timestamps.
On failure: returns {"mode": "error", "error": <slug>, "operation_token": <str>, ...}. Common slugs: not_found
(token unknown — usually expired or from a different server
instance), auth_failed.
| Name | Required | Description | Default |
|---|---|---|---|
| operation_token | Yes | Operation token returned by an async tool (delete_entry, copy_entry, occasionally import_document). Server-scoped; tokens from a different server instance won't resolve. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description fully discloses the behavior: it is a read-only status check, details the return payload structure, and explains failure modes with common error slugs like 'not_found' and 'auth_failed'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is front-loaded with the core purpose, followed by context, usage guidance, and detailed returns/errors. Every sentence is informative and well-organized without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter) and the presence of an output schema, the description covers all necessary aspects: purpose, usage, parameter, return values including fields and possible errors, and differentiation from sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already includes a description and examples for the single parameter 'operation_token'. The description adds minimal additional context (e.g., mentioning which tools return the token), but the schema carries the bulk of the semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Look up the status of an async operation by its token', specifying the verb (look up), resource (status of async operation), and mechanism (by token). It also distinguishes from the sibling 'wait_for_task' by explaining the difference in semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides guidance on when to use this tool versus alternatives: 'For "wait until done" semantics, use wait_for_task instead so you don't have to write a polling loop.' Also lists the originating async tools that return the token.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_task_updateA
Check or wait on an async operation. timeout_seconds=0 returns immediately.
Wraps the two underlying tools:
timeout_seconds=0→get_task_status. Returns the current payload without waiting. Right for "is this done yet?" polling loops written by the caller.timeout_seconds>0(default 60) →wait_for_task. Polls atpoll_interval_secondsuntil terminal or until the deadline.
Args:
operation_token: Token from the originating async tool.
timeout_seconds: 0 for single-poll; >0 for blocking wait.
Bounded above by what your MCP client tolerates as a tool
call duration.
poll_interval_seconds: Delay between status checks when waiting.
Bounded below at 0.1s. Ignored when timeout_seconds=0.
Returns: Same payload as get_task_status / wait_for_task.
The wait variant adds timed_out: bool for deadline misses.
On failure: same shapes as the underlying tools.
| Name | Required | Description | Default |
|---|---|---|---|
| operation_token | Yes | Token from the originating async tool (delete_entry, copy_entry, occasionally import_document). | |
| timeout_seconds | No | 0 for single-poll (get_task_status semantics); >0 for blocking wait (wait_for_task semantics). | |
| poll_interval_seconds | No | Delay between status checks when waiting. Bounded below at 0.1s. Ignored when timeout_seconds=0. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: two execution paths, return payload (same as underlying tools), added timed_out field for wait variant, and failure shapes. No contradictions or hidden traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with paragraphs and bullet points, about 10 sentences all adding value. Slightly wordy but not excessive. Each section earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists (context indicates true), the description explains return payload and failure handling. It covers all parameter behaviors, modes, and edge cases. No missing context for agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. The description adds semantic value: operation_token origin (async tools list), timeout_seconds behavior and client-tolerance bound, poll_interval_seconds lower bound and ignored condition. Exceeds schema info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks or waits on an async operation, distinguishing two modes based on timeout_seconds. It explicitly mentions wrapping two underlying tools, providing specific verb-resource combinations and differentiation from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear guidance on when to use timeout_seconds=0 (single-poll) vs >0 (blocking wait), and mentions polling loops. It does not explicitly list alternatives or when-not-to-use, but the context is sufficient. Siblings include get_task_status and wait_for_task, but this tool is a composite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_task_waitA
Block until an async operation reaches a terminal state.
Preferred over manual polling with get_task_status. Returns
quickly when the op is fast; otherwise polls at poll_interval_seconds
until Completed, Failed, or Canceled — or until
timeout_seconds is reached, in which case the last observed
status is returned with timed_out=true so the caller can decide
whether to keep waiting.
Args: operation_token: Token from the originating async tool. timeout_seconds: Maximum time to wait (default 60). Set higher for large folder deletes or large copies. poll_interval_seconds: Delay between status checks (default 1.0). Bounded below at 0.1s.
Returns: Same payload as get_task_status, with an added
timed_out boolean indicating whether the wait ended on timeout.
On failure: if a poll call fails mid-wait, returns
{"mode": "error", "error": <slug>, "operation_token": <str>, ...}.
Common slugs: not_found (token invalidated by server restart),
auth_failed.
| Name | Required | Description | Default |
|---|---|---|---|
| operation_token | Yes | Operation token returned by an async tool (delete_entry, copy_entry, occasionally import_document). Server-scoped; tokens from a different server instance won't resolve. | |
| timeout_seconds | No | Maximum time to wait. Set higher for large folder deletes or large copies. Returns the last observed status with timed_out=True if the deadline is reached. | |
| poll_interval_seconds | No | Delay between status checks. Bounded below at 0.1s. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: blocking, polling interval, timeout handling, return payload with timed_out flag, and error scenarios with common slugs like not_found and auth_failed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a summary line followed by details, Args, Returns, and On failure sections. It is slightly verbose but each sentence adds value and information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description adequately covers the tool's behavior, return value (same as get_task_status plus timed_out), and error handling. All parameters are explained with use-case guidance, making it complete for agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers all parameters with descriptions and examples, and the description adds practical guidance (e.g., higher timeout for large deletes) and bounds clarification for poll_interval, going beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool blocks until an async operation reaches a terminal state and explicitly distinguishes it from manual polling using get_task_status, providing a specific verb-resource pair with clear scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description recommends this tool over manual polling with get_task_status and provides context for increasing timeout for large operations, but does not explicitly differentiate from other sibling wait tools like wait_for_task or task_wait_or_poll.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_template_definition_listA
List template definitions in the repository.
Use to discover which templates exist before calling assign_template.
Pass template_name to fetch a single template by name (the same
listing, filtered server-side).
Args:
template_name: If set, return only the template with this exact
name. Case-sensitive on most builds.
max_results: Page size (default 25, capped by LF_MAX_RESULTS_CEILING).
skip: 0-indexed offset for pagination.
summary_only: If True, return only {count, names}.
Returns: Server's raw OData listing with value. Each item has
id, name, displayName, description, fieldCount,
and color. This response does NOT enumerate the fields ON the
template — use list_field_definitions to inspect those (they're
the ones with isRequired=true when scoped to the template).
On failure: returns {"mode": "error", "error": <slug>, ...}.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | 0-indexed offset for pagination through large repositories. | |
| max_results | No | Page size (default 25, capped by LF_MAX_RESULTS_CEILING). | |
| summary_only | No | When True, return only {count, names} instead of the full OData listing — useful for 'what's available?' lookups that would otherwise return 30-50 KB of definition payload. | |
| template_name | No | If set, return only the template with this exact name. Case-sensitive on most builds. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and delivers: it explains return format (OData listing with specific fields), pagination (max_results, skip), server-side filtering, case sensitivity, summary mode, error format, and that fields are not included. This is comprehensive behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (use case, parameter descriptions, return format, error format). Every sentence adds value, and it is appropriately sized for the tool's complexity. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 parameters, an output schema, and no annotations, the description covers all critical aspects: purpose, usage, all parameters with added context, return data structure, error handling, and links to related tools. It is fully self-contained and allows correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds value beyond schema: for summary_only it explains the payload size benefit, and for template_name it clarifies case-sensitivity and server-side filtering. The description enriches parameter understanding without redundancy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List template definitions in the repository.' It differentiates from sibling tools like list_field_definitions by noting it does not return fields, and explicitly connects to assign_template. The purpose is specific and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly recommends using this tool 'before calling assign_template' and explains the summary_only mode for 'what's available?' lookups. It also describes the error format. It does not explicitly state when not to use, but the context is strong enough for an agent to infer usage boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laserfiche_template_field_listA
Return the fields belonging to a single template, with full field metadata.
Closes the most common pre-assign workflow gap: instead of fetching
list_template_definitions then list_field_definitions and
cross-referencing client-side, this returns the template's field
list directly with each field's type, constraints, and required
flag inlined. Use this BEFORE assign_template to construct the
fields argument.
Args:
template_name: Exact template name (case-sensitive on most
builds). Use list_template_definitions to discover
available names.
required_only: When True, return only fields where
is_required is true. Useful for "what's the minimum I
have to supply?" workflows.
Returns: {"template_name": <str>, "template_id": <int>, "field_count": <int>, "fields": [...]} where each field has
name, field_type, is_required, is_multi_value,
list_values, default_value, length, constraint.
On failure: returns {"mode": "error", "error": <slug>, ...}.
Slugs: invalid_template_name when the template name doesn't
exist in the repository (with the list of valid names in the
response); server_error for upstream issues.
| Name | Required | Description | Default |
|---|---|---|---|
| required_only | No | When True, return only fields where is_required is true — useful for 'what's the minimum I have to supply?' workflows. | |
| template_name | Yes | Exact template name (case-sensitive on most builds). Use list_template_definitions to discover available names. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, but the description fully compensates by detailing return structure (including failure modes with specific error slugs), case-sensitivity of template names, and optional parameter behavior. No contradictions with annotations (none exist).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then follows a logical structure (workflow gap, args, returns). It is detailed yet not excessively long; every sentence adds value. Slight redundancy in return structure but overall well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully covers the tool's purpose, parameters, return values, error handling, and workflow context. Given the presence of an output schema (described), it leaves no gaps for an AI agent to function correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are well-described. The description adds additional context like examples for template_name and practical use case for required_only, providing value beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Return the fields belonging to a single template, with full field metadata', using a specific verb and resource. It distinguishes itself from siblings like list_template_definitions and list_field_definitions by highlighting the workflow gap it fills.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'Use this BEFORE assign_template to construct the fields argument' and contrasts with alternatives 'instead of fetching list_template_definitions then list_field_definitions'. Clearly marks when and why to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_field_definitionsA
List every field definition in the repository.
Use before authoring a field-based search query or preparing a field
update — the response tells you which fields exist, their types
(String, ShortInteger, List, Date, ...), whether they
accept multi-value, whether they're required at the repository level,
and (for List fields) the allowed values.
Independent fields and template-scoped fields are both returned.
Combine with list_template_definitions to see which fields belong
to which template.
Args:
max_results: Page size (default 25, capped by LF_MAX_RESULTS_CEILING).
skip: 0-indexed offset for pagination through large repositories.
summary_only: If True, return only {count, names} instead of the
full OData listing.
Returns: Server's raw OData listing with value (list of field
definitions). Each item includes id, name, fieldType,
isRequired, isMultiValue, listValues, defaultValue,
length, constraint.
On failure: returns {"mode": "error", "error": <slug>, ...}.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | 0-indexed offset for pagination through large repositories. | |
| max_results | No | Page size (default 25, capped by LF_MAX_RESULTS_CEILING). | |
| summary_only | No | When True, return only {count, names} instead of the full OData listing — useful for 'what's available?' lookups that would otherwise return 30-50 KB of definition payload. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes response structure (types, multi-value, allowed values), pagination parameters, summary_only behavior, and error format. No annotations provided, but description compensates well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with summary, organized into paragraphs and bullet points, no wasted words. Efficiently covers all necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Thoroughly covers pagination, summary mode, output fields, and error response. Given output schema existence and parameter count, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% description coverage; description adds value by explaining default page size, capping, and the purpose of summary_only (avoiding large payloads).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'List every field definition in the repository' with verb and resource. Distinguishes from sibling tools like get_template_fields by mentioning combination with list_template_definitions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use before authoring a field-based search query or preparing a field update' and suggests combining with list_template_definitions. No explicit when-not-to-use but clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_folderA
List the immediate children (documents and subfolders) of a folder by ID.
Use this for browse-style navigation when the user references a known
folder. The root folder is typically ID 1 — start there if you have
nothing else. To navigate from a path string, resolve it first with
get_entry_by_path. To search across the whole repo, use
search_natural or search_entries.
Args:
folder_id: Integer entry ID of the parent folder.
max_results: Page size (default 25, capped by LF_MAX_RESULTS_CEILING).
skip: 0-indexed offset for pagination. Combine with max_results
to walk a large folder in chunks; check next_link to know
when to stop.
Returns: SearchResults with entries, total_count (server
fills it only when the build supports $count), and next_link.
Each entry has id, name, entry_type, full_path, creation_time, and
last_modified_time. Drill into a single entry with get_entry or
get_field_values.
On failure: returns {"mode": "error", "error": <slug>, "folder_id": <int>, ...}. Common slugs: not_found (folder ID
doesn't exist), auth_failed (no read permission).
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | 0-indexed offset for pagination. Combine with max_results to walk a large folder in chunks; check next_link to know when to stop. | |
| folder_id | Yes | Integer entry ID of the parent folder. The root folder is typically ID 1. | |
| max_results | No | Page size (default 25, capped by LF_MAX_RESULTS_CEILING). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Details pagination behavior, max_results cap, return format including conditional total_count, and error slugs like not_found and auth_failed, with no annotations to contradict.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with purpose first, then usage, parameters, returns, and errors; all sentences are informative and focused.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given moderate complexity, the description covers all aspects: purpose, usage, parameters, return format with fields, pagination, and error handling, making it self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage, and description adds context like root folder default, page size default, and pagination usage, slightly exceeding baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists immediate children of a folder by ID, using specific verbs and resources, and distinguishes it from siblings like search_natural and get_entry_by_path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (browse-style navigation for known folders), provides default root ID, and names alternatives for path resolution and global search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_link_definitionsA
List the entry-link type definitions available on this repository.
Use before calling set_links — you need a linkTypeId from
this listing to construct a valid link. Each link type is directed:
it has a sourceLabel (how the relationship reads from the source
entry) and a targetLabel (how it reads from the target).
Args:
max_results: Page size (default 25).
skip: 0-indexed offset for pagination.
summary_only: If True, return only {count, names}.
Returns: Server's raw OData listing with value. Each item has
linkTypeId, sourceLabel, targetLabel, and
linkTypeDescription. Common defaults include "Supersedes" / "Superseded by" and "Attachment" / "Message".
On failure: returns {"mode": "error", "error": <slug>, ...}.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | 0-indexed offset for pagination through large repositories. | |
| max_results | No | Page size (default 25, capped by LF_MAX_RESULTS_CEILING). | |
| summary_only | No | When True, return only {count, names} instead of the full OData listing — useful for 'what's available?' lookups that would otherwise return 30-50 KB of definition payload. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It describes the return format (OData listing with value, fields), behavior of summary_only parameter (return {count, names}), and failure mode (error object). This is comprehensive for a read-only listing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with sections for purpose, usage, args, returns, and failure. Front-loaded with purpose. Could be slightly more concise but is efficient and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (3 params, no required, with output schema), the description covers all necessary aspects: usage, pagination, summary mode, return fields, and failure. It even includes common examples of link types, making it highly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions, but the description adds value by explaining defaults (max_results default 25, skip default 0) and the pragmatic use of summary_only to avoid heavy payloads. This contextual information goes beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List the entry-link type definitions available on this repository,' providing a specific verb and resource. It distinguishes itself from sibling listing tools by specifying 'entry-link type definitions' and further explains directed link types with source and target labels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'Use before calling set_links — you need a linkTypeId from this listing to construct a valid link,' providing clear context for when to use. Does not explicitly exclude alternatives, but the direct reference to set_links makes the use case obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_repositoriesA
List the repositories this account can reach on the server.
Useful for confirming which repository the server is pointed at and for discovering alternate repositories the same account can access.
Endpoint variability: some self-hosted Laserfiche builds disable
the /Repositories endpoint entirely. When the call fails, this
tool does NOT raise — it returns the configured repo as a fallback
so downstream tools can still run. Branch on mode == "fallback"
if you need to distinguish a partial answer from a full enumeration.
Returns: On a healthy build, the server's raw OData listing with
value: [{repoId, displayName, ...}, ...]. On endpoint
failure: {"mode": "fallback", "warning": <str>, "server_error": <classified error>, "value": [{"repoId": "<LF_REPOSITORY_ID>", "displayName": null, "is_configured": true}]}.
On failure: this tool never raises and never returns mode: "error" — see the fallback shape above.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: endpoint variability, fallback behavior on failure, non-raising nature, and output shape including 'mode' field to distinguish full vs fallback responses.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections for purpose, usage, endpoint variability, return shape, and failure behavior. Every sentence adds value, and it is appropriately front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, an output schema, and no annotations, the description fully covers the tool's behavior, return format, error handling, and edge cases, making it highly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameters, so the description does not need to add parameter information. It is sufficient and complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists repositories accessible by the account, with a specific verb ('List') and resource ('repositories'). It also distinguishes itself from sibling search tools by detailing its unique fallback behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context for when to use the tool (confirming the current repository and discovering alternate ones), but does not explicitly exclude scenarios or contrast with sibling tools like 'laserfiche_repository_list'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tag_definitionsA
List every tag definition in the repository.
Use before calling set_tags / merge_tags to confirm a tag
exists — the server rejects tags that aren't defined here. Tags are
a flat namespace in Laserfiche, distinct from template fields.
Args:
max_results: Page size (default 25, capped by LF_MAX_RESULTS_CEILING).
skip: 0-indexed offset for pagination.
summary_only: If True, return only {count, names}.
Returns: Server's raw OData listing with value (list of tag
definitions). Each item has id, name, and isSecurityTag.
Many repositories ship with no tags defined; an empty value is
normal.
On failure: returns {"mode": "error", "error": <slug>, ...}.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | 0-indexed offset for pagination through large repositories. | |
| max_results | No | Page size (default 25, capped by LF_MAX_RESULTS_CEILING). | |
| summary_only | No | When True, return only {count, names} instead of the full OData listing — useful for 'what's available?' lookups that would otherwise return 30-50 KB of definition payload. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description covers read-only nature, return format (OData list with id, name, isSecurityTag), pagination, and error response. Could mention rate limits or auth but sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured: purpose, usage guidance, parameter explanations, return format, error handling. Every sentence adds value, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 optional params and an output schema, the description covers all necessary context: when to use, pagination, summary_only, return format, error mode, and normal empty result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds extra context for summary_only (payload size) and clarifies default/cap for max_results, exceeding schema details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'List every tag definition in the repository' and distinguishes from sibling tools (e.g., set_tags, merge_tags, other list definitions) by specifying tag definitions and clarifying the namespace.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises using before set_tags/merge_tags to verify tag existence, noting server rejection. Also explains when summary_only is useful and that empty list is normal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_template_definitionsA
List template definitions in the repository.
Use to discover which templates exist before calling assign_template.
Pass template_name to fetch a single template by name (the same
listing, filtered server-side).
Args:
template_name: If set, return only the template with this exact
name. Case-sensitive on most builds.
max_results: Page size (default 25, capped by LF_MAX_RESULTS_CEILING).
skip: 0-indexed offset for pagination.
summary_only: If True, return only {count, names}.
Returns: Server's raw OData listing with value. Each item has
id, name, displayName, description, fieldCount,
and color. This response does NOT enumerate the fields ON the
template — use list_field_definitions to inspect those (they're
the ones with isRequired=true when scoped to the template).
On failure: returns {"mode": "error", "error": <slug>, ...}.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | 0-indexed offset for pagination through large repositories. | |
| max_results | No | Page size (default 25, capped by LF_MAX_RESULTS_CEILING). | |
| summary_only | No | When True, return only {count, names} instead of the full OData listing — useful for 'what's available?' lookups that would otherwise return 30-50 KB of definition payload. | |
| template_name | No | If set, return only the template with this exact name. Case-sensitive on most builds. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It does so by explaining pagination (skip, max_results), the summary_only mode, error format, and that the response does not include field definitions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a brief intro, parameter documentation, and return/failure details. It is detailed but not excessively long, though some redundancy exists (e.g., repeating max_results default).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 parameters, no required ones, and an output schema, the description covers all necessary aspects: purpose, parameter usage, response shape, failure mode, and relationship to other tools like list_field_definitions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline is 3. The description adds value by elaborating on each parameter: template_name's server-side filtering and case-sensitivity, max_results cap, skip offset, and summary_only's use case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List template definitions in the repository' and positions the tool as a discovery step before calling assign_template. It distinguishes from siblings like list_field_definitions by explaining what the tool does not return (fields).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use ('discover which templates exist before calling assign_template') and for each parameter explains its effect. It does not explicitly state when not to use, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_by_nameA
Find entries by file/folder name pattern, optionally scoped to a folder path.
Use when the user is searching by name and the full Laserfiche query
syntax is overkill. This wraps search_entries with a
{LF:Name="..."} (plus optional {LF:LookIn="..."}) clause built
for you.
Args:
name_pattern: A name with optional wildcards — * matches any
sequence, ? matches one character. Examples:
"Onboarding*" (starts-with), "*.pdf" (ends-with),
"Smith,?" (exactly one char after the comma).
in_folder_path: Backslash-delimited Laserfiche path to scope the
search to. Example: "\Imports\2024".
max_results: Page size (default 25, capped by LF_MAX_RESULTS_CEILING).
Returns: same SearchResults shape as search_entries.
On failure: returns {"mode": "error", "error": <slug>, ...}. See
docs/error-contract.md. Note that SimpleSearches is the same fragile
endpoint behind search_entries — fall back to search_natural
if you get repeated server_error results.
| Name | Required | Description | Default |
|---|---|---|---|
| max_results | No | Page size (default 25, capped by LF_MAX_RESULTS_CEILING). | |
| name_pattern | Yes | Name with optional wildcards. `*` matches any sequence (including empty); `?` matches exactly one character. Case-insensitive. No wildcards = exact match. | |
| in_folder_path | No | Optional backslash-delimited folder path to scope the search. Forward slashes are also accepted. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It explicitly states it wraps `search_entries` with LF:Name and LookIn clauses, describes error returns ('mode: error'), and notes endpoint fragility and fallback advice. This is comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with sections (Args, Returns, On failure). Front-loaded with purpose. Each sentence adds value, though slightly verbose for those familiar with the domain. Still, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, all parameters with details, error handling, and fallback advice. Output schema exists but description references return shape. For a search tool with moderate complexity, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds significant value beyond schema: explains wildcard behavior with examples, folder path format, default max_results. This justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it finds entries by name pattern with optional folder scoping. It contrasts with sibling `search_entries` by explaining it wraps that with a specific clause, and mentions fallback to `search_natural`. The verb 'Find' and resource 'entries' are specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Specifies when to use: 'when searching by name and full query syntax is overkill'. Also advises fallback to `search_natural` on repeated errors. Does not explicitly list when not to use, but provides a clear context for appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_entriesA
Run a raw Laserfiche search query and return matching entries.
Use when you already know how to express the search in Laserfiche query
syntax. If the user describes what they want in natural language and you
are unsure how to translate, prefer search_natural (which asks the
server for the available templates and field names first). For a simple
name-pattern lookup, search_by_name is the cheaper option.
Query syntax cheat sheet:
{LF:Name="Onboarding*"}— name pattern (*and?wildcards){[Loan Application]:[Last Name]="Smith"}— field on template{LF:LookIn="\Imports\2024"}— restrict to a folder subtreeCombine with
&(AND) /|(OR), e.g.{LF:Name="*.pdf"} & {[Application]:[Status]="Approved"}
Args:
query: A Laserfiche search expression. Quote string values with
double quotes; escape inner quotes by doubling them.
max_results: Page size (default 25, capped by LF_MAX_RESULTS_CEILING,
typically 200).
Returns: SearchResults with entries (id, name, entry_type,
full_path), total_count, and next_link. Drill in with
get_entry or get_field_values.
On failure: returns {"mode": "error", "error": <slug>, ...} instead
of raising. Slugs you might see here: server_error (most common, the
SimpleSearches endpoint is fragile on some self-hosted builds — see
search_natural for a more resilient path), auth_failed,
rate_limited. Full taxonomy in docs/error-contract.md.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Laserfiche search expression. Each clause wrapped in braces and combined with `&` (AND) or `|` (OR). Quote string values with double quotes; escape inner quotes with `\"`. | |
| max_results | No | Page size. Defaults to LF_MAX_RESULTS_DEFAULT (25). Capped at LF_MAX_RESULTS_CEILING (typically 200). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description bears full burden. It details return format (SearchResults with fields), error handling (returns error object with slugs), and mentions server fragility. Full disclosure of failure modes and their meanings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with usage guidelines first, then cheat sheet, then parameter details. Each sentence adds value, though slightly lengthy. Could be marginally shorter but efficient overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a search tool: describes return format (even without output schema), error handling, and sibling relationships. No notable gaps given the complexity and existing schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds value by providing extra examples, clarifying maximum results cap, and explaining quoting rules in more plain language than schema. Not essential but beneficial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it executes a raw Laserfiche query and returns entries, using specific verb 'run' and resource. It distinguishes from siblings by explicitly contrasting with search_natural and search_by_name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use (knowing query syntax), when-not (natural language or simple name), and provides alternatives with reasoning (search_natural for natural language, search_by_name for cheaper name lookup). Also includes a query syntax cheat sheet.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_naturalA
Two-mode search: guidance first, then execution with automatic repair.
Most Laserfiche servers reject malformed query syntax with a generic HTTP 400. This tool gives the host LLM a structured way to author a working query without trial-and-error against the user.
Mode A — lf_query omitted
Returns mode="guidance" with:
* grammar — the Laserfiche search syntax reference this server
understands, with examples.
* discovered_templates — template names and field names sampled
from folder_path (or the repository root). Use these to
author template-field queries like
{[Personnel]:[Last Name]="Smith"}.
* candidate_queries — up to 3 starter queries built from the
question's keywords. Pick one or refine it, then call again with
lf_query.
* follow_up — the exact follow-up call shape.
Mode B — lf_query provided
Executes the query and returns mode="results" (or
mode="error" with structured detail). On HTTP 400, up to two
automatic repairs are attempted:
1. Escape unescaped ``"`` characters inside ``="..."`` value spans.
2. Wrap ``Name="value"`` values in ``*`` wildcards (only when
``fuzzy=True`` and the value has no wildcard).
Each attempt is recorded in ``attempts`` on the error response.Pagination
max_results is clamped to LF_MAX_PAGE_SIZE (default 100).
Some self-hosted SimpleSearches implementations 400 on larger
$top values, so the cap is lower than the list-folder ceiling.
When next_link is null but the result count hit the effective
cap, pagination_unknown=true is surfaced — there may be more
results, the server just didn't say.
What this tool does NOT do It does not silently fall back to folder traversal. If both repairs still 400, you get a structured error so the user knows search failed and the host LLM can author a fresh query.
On failure
Mode B returns {mode: "error", attempts: [...]} with the full
repair history visible — each attempt records the query, the repair
tag applied, the HTTP status, and the server's error body, enough
context for the LLM to write a different query. Other failures
(auth, rate limit, network) come back via the generic error
contract; see docs/error-contract.md.
| Name | Required | Description | Default |
|---|---|---|---|
| fuzzy | No | When True (default), Mode B attempts a wildcard-wrap repair if the server 400s on a Name=value clause with no wildcards. Set False for exact-match queries that should NOT be relaxed. | |
| lf_query | No | Laserfiche query to execute (Mode B). Omit to get guidance (Mode A): grammar reference, sampled templates, candidate queries to refine. | |
| question | Yes | The user's natural-language search question. Used by Mode A to extract keywords for candidate queries and surfaced in Mode B responses for correlation. | |
| folder_path | No | Backslash-delimited folder path. In Mode A, narrows the template sample to this subtree; in Mode B, the LLM should embed {LF:LookIn="<path>"} in lf_query itself if scoping is wanted. | |
| max_results | No | Page size. Clamped to LF_MAX_PAGE_SIZE (default 100) — some self-hosted SimpleSearches implementations 400 on larger $top. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses all behavioral traits: two-mode operation, automatic repair attempts (two specific strategies), pagination clamping and unknown pagination flag, error handling with structured error response, and reference to generic error contract for auth/rate limit/network failures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear headings (Mode A, Mode B, Pagination, etc.), but it is somewhat verbose. It could be slightly more concise while retaining all necessary details, but the structure aids readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all aspects of the tool's behavior: modes, repairs, pagination, error handling, and limitations. The output schema likely details return structures, but the description already provides complete contextual guidance for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Though schema coverage is 100%, the description adds significant value beyond field descriptions: e.g., lf_query's role in mode selection, folder_path's scoping difference between modes, fuzzy's repair condition, and max_results clamping rationale. This enriches the agent's understanding of parameter behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly defines a two-mode search tool (guidance then execution), contrasting with sibling search tools by emphasizing natural language querying and automatic repair. It specifies the verb ('search') and resource ('Laserfiche entries') and distinguishes from alternatives like 'search_entries'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when to use each mode (Mode A for guidance, Mode B for execution), what to expect, and what the tool does NOT do (no silent fallback). Provides guidance on embedding scope in lf_query and on setting fuzzy=False for exact matches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
task_wait_or_pollA
Check or wait on an async operation. timeout_seconds=0 returns immediately.
Wraps the two underlying tools:
timeout_seconds=0→get_task_status. Returns the current payload without waiting. Right for "is this done yet?" polling loops written by the caller.timeout_seconds>0(default 60) →wait_for_task. Polls atpoll_interval_secondsuntil terminal or until the deadline.
Args:
operation_token: Token from the originating async tool.
timeout_seconds: 0 for single-poll; >0 for blocking wait.
Bounded above by what your MCP client tolerates as a tool
call duration.
poll_interval_seconds: Delay between status checks when waiting.
Bounded below at 0.1s. Ignored when timeout_seconds=0.
Returns: Same payload as get_task_status / wait_for_task.
The wait variant adds timed_out: bool for deadline misses.
On failure: same shapes as the underlying tools.
| Name | Required | Description | Default |
|---|---|---|---|
| operation_token | Yes | Token from the originating async tool (delete_entry, copy_entry, occasionally import_document). | |
| timeout_seconds | No | 0 for single-poll (get_task_status semantics); >0 for blocking wait (wait_for_task semantics). | |
| poll_interval_seconds | No | Delay between status checks when waiting. Bounded below at 0.1s. Ignored when timeout_seconds=0. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavioral details: immediate return vs blocking, poll interval ignored when timeout=0, return value shape including timed_out field on wait variant, and failure shapes same as underlying tools. No annotations present, so description fully covers transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured: brief intro, bullet points for underlying tools, clear Args/Returns/On failure sections. Front-loaded with core behavior. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of async polling/waiting, the description covers all aspects: mode selection, parameter behavior, return values (including timed_out), failure handling, and ties to underlying tools. Output schema exists but description still explains return shape. Complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds significant context beyond schema: operation_token examples (delete_entry, copy_entry, import_document), timeout_seconds bound by MCP client tolerance, poll_interval_seconds bounded below at 0.1s and ignored when timeout=0. Schema coverage is 100% but description enriches with practical details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks or waits on async operations, differentiating two modes via timeout_seconds. It explicitly wraps get_task_status and wait_for_task, distinguishing from sibling tools like get_task_status and wait_for_task themselves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: timeouts=0 for single-poll loops, timeout_seconds>0 for blocking wait. Mentions bounds on timeout and poll interval. Helps caller decide when to use this vs direct underlying tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_taskA
Block until an async operation reaches a terminal state.
Preferred over manual polling with get_task_status. Returns
quickly when the op is fast; otherwise polls at poll_interval_seconds
until Completed, Failed, or Canceled — or until
timeout_seconds is reached, in which case the last observed
status is returned with timed_out=true so the caller can decide
whether to keep waiting.
Args: operation_token: Token from the originating async tool. timeout_seconds: Maximum time to wait (default 60). Set higher for large folder deletes or large copies. poll_interval_seconds: Delay between status checks (default 1.0). Bounded below at 0.1s.
Returns: Same payload as get_task_status, with an added
timed_out boolean indicating whether the wait ended on timeout.
On failure: if a poll call fails mid-wait, returns
{"mode": "error", "error": <slug>, "operation_token": <str>, ...}.
Common slugs: not_found (token invalidated by server restart),
auth_failed.
| Name | Required | Description | Default |
|---|---|---|---|
| operation_token | Yes | Operation token returned by an async tool (delete_entry, copy_entry, occasionally import_document). Server-scoped; tokens from a different server instance won't resolve. | |
| timeout_seconds | No | Maximum time to wait. Set higher for large folder deletes or large copies. Returns the last observed status with timed_out=True if the deadline is reached. | |
| poll_interval_seconds | No | Delay between status checks. Bounded below at 0.1s. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description fully bears the burden. It thoroughly explains blocking, polling, timeout behavior (returns timed_out=true on timeout), terminal states (Completed, Failed, Canceled), and error handling with specific error slugs and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the core action, and well-structured with sections for Args, Returns, and On failure. Every sentence serves a purpose without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations but a known output schema, the description covers return payload similarity to get_task_status plus the added timed_out field, error responses, and common error slugs. It leaves no obvious gaps for this polling tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value beyond the schema by clarifying that operation_token is 'server-scoped' and that timeout_seconds should be increased for large operations, and poll_interval_seconds is bounded below at 0.1s.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific verb-resource statement: 'Block until an async operation reaches a terminal state.' It distinguishes itself from manual polling (get_task_status) and other siblings by explicitly stating it blocks and handles polling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states 'Preferred over manual polling with ``get_task_status``.' and advises setting timeout for large operations. It provides clear usage context but does not explicitly state when NOT to use it (e.g., if you want non-blocking behavior or to poll manually).
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. Dates show when Glama detected each change.
38 tool updates
v2.1.0- First observed
get_audit_reasons - First observed
get_document_edoc - First observed
get_document_text - First observed
get_entry - First observed
get_entry_by_path - First observed
get_field_values - First observed
get_task_status - First observed
get_template_fields - First observed
laserfiche_audit_reason_list - First observed
laserfiche_document_get_edoc - First observed
laserfiche_document_get_text - First observed
laserfiche_entry_get - First observed
laserfiche_entry_get_by_path - First observed
laserfiche_entry_search - First observed
laserfiche_entry_search_by_name - First observed
laserfiche_entry_search_natural - First observed
laserfiche_field_definition_list - First observed
laserfiche_field_values_get - First observed
laserfiche_folder_list - First observed
laserfiche_link_definition_list - First observed
laserfiche_repository_list - First observed
laserfiche_tag_definition_list - First observed
laserfiche_task_get_status - First observed
laserfiche_task_update - First observed
laserfiche_task_wait - First observed
laserfiche_template_definition_list - First observed
laserfiche_template_field_list - First observed
list_field_definitions - First observed
list_folder - First observed
list_link_definitions - First observed
list_repositories - First observed
list_tag_definitions - First observed
list_template_definitions - First observed
search_by_name - First observed
search_entries - First observed
search_natural - First observed
task_wait_or_poll - First observed
wait_for_task
TDQS
Many tools have near-identical duplicates with and without the 'laserfiche_' prefix (e.g., get_document_edoc and laserfiche_document_get_edoc), causing confusion. Additionally, async task tools overlap (get_task_status, wait_for_task, task_wait_or_poll) with unclear boundaries.
Naming is inconsistent, mixing verb_noun (get_entry), noun_verb (field_values_get), and prefixed variants (laserfiche_entry_get). The prefix is applied irregularly, and some tools have both forms with identical descriptions.
At 38 tools, the count is inflated by duplicates; the effective distinct set is about 19. While the domain warrants multiple tools, the duplication makes the surface feel bloated and harder to navigate.
The server covers many read and search operations but lacks critical write tools like create_entry, update_entry, delete_entry, assign_template, or set_links. Async operations are referenced but not exposed, leaving significant gaps for common workflows.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Let AI agents query data and act across all your business apps via MCP.
Unified MCP Server is a remote MCP connector for AI agents and vertical AI products that provides access to 22,000+ authorized SaaS tools across 400+ integrations and 24 categories directly inside LLMs (Claude, GPT, Gemini, Cohere). Tools operate only on explicitly authorized customer connections, enabling agents to safely read and write against live third-party systems.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables AI agents to read documents in Excel, DOCX, PDF, and TXT formats via MCP protocol.123MIT
- FlicenseNot gradedqualityDmaintenanceEnables document conversion and processing through an MCP server interface for AI assistants.-
- AlicenseBqualityDmaintenanceEnables AI assistants to interact with Labradoc's document management, email ingestion, task extraction, and integration features through MCP tools.1716MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to query documents in a Bedrock Knowledge Base through the MCP protocol, with tools for semantic search and agentic retrieval.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/SamuelSHernandez/laserfiche-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server