Skip to main content
Glama
talonicdev

talonic-mcp

Official
by talonicdev

@talonic/mcp

Official Talonic MCP server. Give any AI agent the ability to extract structured, schema-validated data from any document — PDFs, scans, invoices, contracts, forms — via the Model Context Protocol.

talonic-mcp MCP server

Status: stable, listed on the official MCP Registry as io.github.talonicdev/talonic-mcp. Eleven established document tools and two resources are verified end-to-end against production (including the Claude.ai hosted connector); this branch adds five public Agent-stage worklist tools. Runs as a local stdio process for desktop/IDE clients or as the hosted Streamable HTTP server at mcp.talonic.com for Claude.ai connectors.


What you get

One install gives an agent the whole document-extraction workflow:

Tool

What it does

talonic_extract

Extract schema-validated JSON from a document, with per-field confidence scores. The primary tool.

talonic_request_upload

Get a browser upload link for files too large to pass through a hosted connector (e.g. Claude.ai). The robust path for real-world documents.

talonic_to_markdown

OCR a document to clean markdown.

talonic_search

Omnisearch across documents, fields, sources, and schemas.

talonic_filter

Filter documents by extracted field values (eq, gt, between, contains, …).

talonic_get_document

Fetch a document's metadata, processing status, and links.

talonic_list_schemas

List saved schemas (with definitions).

talonic_save_schema

Save a reusable schema to the workspace.

talonic_get_balance

Read credit balance, EUR value, burn rate, and runway for budget-aware behaviour.

talonic_get_pricing

Read the public per-unit credit pricing catalog and multipliers to predict spend before running a job.

talonic_get_usage

Break down credit consumption per function over a trailing window (default 30 days).

talonic_list_fields

List the Field Registry — every canonical concept with a stable id, maturity (core / proven / candidate), synonyms and occurrence counts.

talonic_get_field

Concept card for one field (by id or by NAME): definition, aliases, maturity, occurrence stats, value distribution with examples, schema usage, identity links.

talonic_field_values

One concept's current values across all documents, with provenance (document, source text, resolution band).

talonic_find_data

Resolve a concept in the user's words to the fields, values, documents and passages that carry it — by meaning, not by name.

talonic_list_agent_tools

The platform's agent tool registry (query_data SQL, describe_data, document markdown, …) with schemas and per-credential invocability.

talonic_invoke_agent_tool

Run one platform agent tool directly with your own arguments — no model in the loop.

Plus two resources for clients that browse them (Claude Desktop, Cowork render these in-UI):

  • talonic://schemas — the saved-schemas list.

  • talonic://webhooks/reference — webhook event types, delivery semantics, signature verification, and retry policy.

Every tool description is written for an LLM, with explicit USE WHEN / DO NOT USE WHEN guidance, so agents pick the right tool without extra prompting.

Related MCP server: PostIdentity MCP Server

Why use it

When an agent needs structured data out of a PDF, scan, or messy document, the usual approach is raw OCR plus an LLM call — and the results drift: tables get mangled, dates get misread, totals come out wrong. talonic_extract instead returns schema-validated JSON with per-field confidence scores, a detected document type, and stable IDs for follow-up calls. The full pipeline (upload → OCR → extraction → validation) runs server-side in one request.


Quick start

1. Get an API key (30 seconds)

Each user runs against their own isolated Talonic workspace — your documents and schemas are private to you.

  1. Sign up at app.talonic.com — free tier, 50 extractions/day, no credit card.

  2. Settings → API Keys → Create New Key.

  3. Copy the tlnc_… value into your MCP client config (snippets below).

You don't need an API key for Claude.ai. The hosted connector uses OAuth — Claude.ai handles auth via PKCE and stores its own short-lived tokens. The API key is only needed for local-stdio installs (Claude Desktop, Cursor, Cline, Continue, Cowork) and the API-key URL fallback.

2. Install

Every local client launches the server the same way — a one-line npx invocation with your key in the env block. No clone, no build:

{
  "command": "npx",
  "args": ["-y", "@talonic/mcp@latest"],
  "env": { "TALONIC_API_KEY": "tlnc_..." }
}

Version pinning. @latest is fine for trying things out. For production and CI, pin a version (e.g. @talonic/mcp@0.1.52) so a release can't silently change tool descriptions, validation rules, or response shapes your agent depends on. Bump the pin after reviewing the CHANGELOG.


Client setup

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "talonic": {
      "command": "npx",
      "args": ["-y", "@talonic/mcp@latest"],
      "env": { "TALONIC_API_KEY": "tlnc_your_key_here" }
    }
  }
}

Fully restart Claude Desktop (Cmd+Q on macOS — not just close the window). Talonic appears in the connected-servers list with all sixteen public tools.

Edit ~/.cursor/mcp.json (or Cursor settings → MCP → edit config):

{
  "mcpServers": {
    "talonic": {
      "command": "npx",
      "args": ["-y", "@talonic/mcp@latest"],
      "env": { "TALONIC_API_KEY": "tlnc_your_key_here" }
    }
  }
}

Open the Cline panel → settings (gear) → MCP Servers → Edit. Add the entry above. Save and restart the panel.

Edit ~/.continue/config.json, add to the mcpServers array:

{
  "name": "talonic",
  "command": "npx",
  "args": ["-y", "@talonic/mcp@latest"],
  "env": { "TALONIC_API_KEY": "tlnc_your_key_here" }
}

Open Cowork settings → MCP Servers → Add. Use the same shape as Claude Desktop above.

Claude.ai (hosted connector)

Claude.ai's "Add custom connector" flow uses a remote MCP URL instead of a local process. We host one at mcp.talonic.com. OAuth is the recommended path — no API key in the config.

Recommended — OAuth (no API key):

  1. Open claude.ai/settings/connectorsAdd custom connector.

  2. URL: https://mcp.talonic.com/mcp (no query string, no headers).

  3. Click Connect → you're redirected to Talonic → sign in (Google, Microsoft, or SSO).

  4. Approve the consent screen (scopes: extract:write, documents:read, schemas:read). Pick a workspace if you have multiple.

  5. You're returned to Claude.ai. All twenty-two public tools appear.

The flow uses PKCE (RFC 7636) and dynamic client registration (RFC 7591). Claude.ai stores a 1-hour access token + 30-day refresh token and refreshes automatically. No API key ever touches the connector config or any URL. Revoke by removing the connector or revoking the OAuth client in your Talonic dashboard.

Alternative — API key in URL (firewalled environments, automation, static credential):

https://mcp.talonic.com/mcp?apiKey=tlnc_your_key_here

Trade-off: the key is persisted in Claude.ai's connector store and may appear in Anthropic-side logs. Rotate it if you remove or share the connector.

Uploading files in Claude.ai? Use talonic_request_upload — see the next section. Dragging a real file straight into the chat does not work through hosted connectors (a platform limit, explained below).


File uploads: the browser-handoff flow

This is the most important thing to understand about running Talonic inside a hosted connector (Claude.ai web, ChatGPT).

The constraint

Hosted AI platforms cap the size of a single tool-call argument. On Claude.ai the effective ceiling is ~32 KB of decoded payload (~43 KB of base64) — measured directly against production. A real PDF is hundreds of KB to several MB, so passing it as base64 file_data gets silently truncated: the server receives a clean-but-incomplete prefix, the API registers a stub document, and extraction returns null fields. The agent never sees the truncation. Separately, the agent's sandbox cannot upload the bytes out-of-band either — egress is allowlisted, so a direct PUT to storage is blocked.

These are deliberate, structural properties of hosted/sandboxed agent platforms — not a Talonic bug, and not something we can configure away. The same limits apply to ChatGPT connectors and similar surfaces.

The solution: talonic_request_upload

Route the file transfer onto the user's own browser, which has neither the tool-call cap nor the egress allowlist:

1. Agent calls  talonic_request_upload(filename)
       → { document_id, upload_url: "https://app.talonic.com/u/<token>", expires_at }
2. Agent shows the upload_url to the user.
3. User opens it in a browser tab and drops the file.
4. Agent polls  talonic_get_document(document_id)  until status === "completed".
5. Agent calls  talonic_extract(document_id, schema)  — structured data comes back.

Cost to the user: one click. It's the same pattern as a Slack/Stripe "open in browser" link, and it works on every hosted agent. Verified end-to-end in production Claude.ai.

For the agent: a user saying "done" or "uploaded" only confirms the browser-side upload finished — server-side OCR + processing take another ~10–30 s. Poll talonic_get_document until status is "completed" before calling talonic_extract. Calling early returns errors that look like the file is missing. (The tool descriptions enforce this; you generally don't need to prompt for it.)

When you don't need it

  • Local-stdio installs (Claude Desktop, Cursor, Cline, Continue, Cowork) have no tool-call cap. Drop a file in and the agent passes file_data directly — talonic_request_upload isn't needed.

  • The file is already at a public URL → pass file_url to talonic_extract.

  • The file was already uploaded at app.talonic.com → pass its document_id.


Agent decision guide

Pick the right tool before calling — the wrong one returns the wrong data, costs credits, and slows the conversation.

User has a file

  • Local client (Desktop, Cursor, …), small-to-medium file → talonic_extract with file_data + filename.

  • Hosted connector (Claude.ai) → talonic_request_upload, then poll, then talonic_extract by document_id. (See browser-handoff.)

  • File is at a public URL → talonic_extract with file_url.

  • They want specific fields → pass a schema or schema_id. They want full text → talonic_to_markdown. Both → talonic_extract with include_markdown: true.

User is asking about existing documents

  • Conceptual/fuzzy ("any docs about indemnification") → talonic_search.

  • Value-based ("invoices over 1000 EUR") → talonic_filter.

  • They reference a document_idtalonic_get_document (metadata), talonic_to_markdown (text), or talonic_extract (re-extract with a new schema). Re-using a document_id is cheaper than re-uploading.

Working with schemas

  • One-off → pass the schema inline. Reused across many docs → talonic_save_schema once, then talonic_extract with schema_id. Discover existing → talonic_list_schemas.

Confidence & human review

  • confidence.overall < ~0.7 → tell the user the extraction may be unreliable; surface low-confidence fields; confirm before downstream actions.

  • Per-field confidence < ~0.7 → mark "needs review"; don't use silently in calculations or external calls.

  • Critical fields (amounts, legal terms, names, dates) → confirm with the user even at high confidence.

  • Need to cite sources? Pass include_provenance: true for per-field page/section/source-text.

When not to call Talonic

  • General-knowledge or chat questions — don't pre-emptively extract.

  • The data is already in the conversation from a prior call — reuse it.

  • For cost/balance questions → talonic_get_balance. Per-call cost is on every talonic_extract / talonic_to_markdown response under cost.


How it works

Agent (Claude Desktop / Cursor / Claude.ai / …)
  │  MCP protocol — stdio (local) or Streamable HTTP (hosted)
  ▼
Talonic MCP server (this package)
  │  HTTPS, Bearer auth (API key or OAuth token)
  ▼
api.talonic.com

Each tool call is one HTTP request to the Talonic API. The server handles auth, retries on transient failures (429, 5xx), MIME-type detection, multipart serialisation, and structured error formatting. It is a thin, stateless client — see Privacy.

Configuration

Set via the env block in your MCP client config:

Variable

Required

Description

TALONIC_API_KEY

yes (local installs)

Your Talonic API key. Starts with tlnc_. Not needed for Claude.ai OAuth.

TALONIC_BASE_URL

no

Override the API base URL. Default: https://api.talonic.com.


Troubleshooting

Error: TALONIC_API_KEY environment variable is required. The env block is missing or unread. Check the JSON shape, then fully restart the client (not just the conversation).

Talonic doesn't appear in the connected-servers list. Confirm command is npx and args are exactly ["-y", "@talonic/mcp@latest"]. Sanity check in a terminal: npx -y @talonic/mcp@latest --version should print a version.

talonic_extract returns a validation error with no schema. By design — the call needs to know which fields to pull. The error hands back a ready-to-paste minimal schema (tailored to your instructions) so the retry succeeds immediately. Three ways forward: provide an inline schema (full JSON Schema recommended), pass a schema_id from talonic_list_schemas, or set auto_schema: true for open capture — Talonic discovers the fields and returns a suggested schema you can refine.

Dragging a file into Claude.ai gives empty/null fields. The hosted-connector tool-call cap (~32 KB) truncated file_data. Use talonic_request_upload — the browser-handoff flow is the supported path. Local-stdio installs are unaffected.

talonic_request_upload worked but talonic_extract errors right after. You extracted before processing finished. Poll talonic_get_document until status === "completed", then extract. A user's "done" only means the browser upload landed, not that OCR is done.

talonic_filter returns nothing when you expect data. Two causes: (1) the field isn't extracted/filterable yet — call talonic_search and check filterable: true; (2) schema-typing — numeric operators (gt, gte, lt, lte, between) need the field typed as number. A string field holding numeric content silently returns zero. Gate on field.dataType === "number" (from talonic_search) before constructing numeric filters.

Tool descriptions look stale after an update. Some clients cache tool lists. For Claude.ai, remove and re-add the connector. For local clients, restart.


Known limitations (v0.1)

  • talonic_extract needs the fields specified. Pass a schema (full JSON Schema recommended) or a schema_id — or set auto_schema: true for open capture, which discovers the fields and returns a suggested schema. A call giving none of the three returns a validation error that hands back a ready-to-paste minimal schema. If a flat key-type map ({ vendor_name: "string" }) yields a "no fields" error, use full JSON Schema:

    {
      "type": "object",
      "properties": {
        "vendor_name": { "type": "string", "title": "Vendor Name" },
        "total_amount": { "type": "number", "title": "Total Amount" }
      },
      "required": ["vendor_name", "total_amount"]
    }
  • Hosted-connector tool-call cap (~32 KB). Real files can't pass through file_data on Claude.ai/ChatGPT — use talonic_request_upload. Local installs are unaffected.

  • Filter requires filterable: true fields. Call talonic_search first; only entries with filterable: true are usable on talonic_filter.

  • Numeric filter operators need number-typed fields. Numbers stored as strings (currency symbols, locale formatting) silently return zero. Type schema fields appropriately at design time; gate on dataType at query time.

  • Per-call cost is extract-only. talonic_extract and talonic_to_markdown (file-input path) return a cost block (costCredits, costEur, balanceCredits, cellsResolvedRegistry, cellsResolvedAi) from the API's X-Talonic-Cost-* headers. Read tools don't consume credits and carry no cost; talonic_to_markdown on the document_id path returns cost: null. For balance any time → talonic_get_balance.


Develop

git clone https://github.com/talonicdev/talonic-mcp.git
cd talonic-mcp
npm install
npm run build
npm test
node dist/server.js --version

Contributing to docs or adding a tool? Read AGENTS.md and docs/architecture/docs-pipeline.md first — there are two parallel docs surfaces and it's easy to edit the wrong one.

Privacy

This MCP server is a thin client. It does not collect, store, log, or transmit any data on its own. Every tool call is forwarded directly to api.talonic.com using your credential, and the response is returned verbatim. The server does not persist API keys, inputs, outputs, or document contents beyond a single tool call; sends no analytics or telemetry; and reads/writes files only at the file_path you explicitly pass, only for that call's duration.

What Talonic does with uploaded data is governed by talonic.com/privacy: documents are processed for OCR + extraction, results live in your isolated workspace at app.talonic.com, and workspace data is not shared with third parties. To delete state, remove documents/schemas in the dashboard or revoke the API key. Privacy questions specific to this integration: info@talonic.ai.

License

MIT © Talonic GmbH

Available Tools

22 tools
talonic_claim_agent_taskClaim Agent TaskA

Claim an available Agent-stage task, or reclaim it after its lease expires.

USE WHEN: ready to process a task. Save the returned execution_epoch and lease_expires_at. NOT FOR: merely inspecting work (use talonic_get_agent_task) or extending an active lease (use talonic_heartbeat_agent_task). A conflicting live claim returns HTTP 409. A successful claim returns the task payload.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesAgent task UUID.

TDQS

A5/5.0
Behavior5/5

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

The annotations (readOnlyHint=false, destructiveHint=false) are present and align with the description. The description adds behavioral context beyond annotations, such as lease expiry, conflicting live claim returning 409, and the need to save execution_epoch and lease_expires_at. This makes the tool's behavior transparent and expected.

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

Conciseness5/5

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

The description is concise yet comprehensive, using structured sections 'USE WHEN', 'NOT FOR', and explicit behavioral notes. It avoids redundancy and packs essential information without being overly verbose. The structure enhances readability and preserves information density.

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

Completeness5/5

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

The description covers all critical aspects: the action (claim/reclaim), when to use, what to save from the return, error handling (409 conflict), and the output (task payload). It also differentiates from related tools, ensuring the agent knows exactly when this tool is appropriate. The description is self-sufficient for safe and correct invocation.

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

Parameters5/5

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

The only parameter, task_id, is fully described in the schema with 'Agent task UUID.' The description also hints at the return value containing execution_epoch and lease_expires_at, which provides additional semantic context. Since schema coverage is 100% and the description adds useful detail, parameter semantics are clear.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Claim an available Agent-stage task, or reclaim it after its lease expires.' It specifies the verb 'claim', the resource 'Agent-stage task', and additional nuance about reclaiming. It also distinguishes from sibling tools like talonic_get_agent_task and talonic_heartbeat_agent_task.

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

Usage Guidelines5/5

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

Explicit usage guidance is provided: 'USE WHEN: ready to process a task' and 'NOT FOR: merely inspecting work (use talonic_get_agent_task) or extending an active lease (use talonic_heartbeat_agent_task)'. Behavioral details about conflicting claims (HTTP 409) and successful claims (returns task payload) further clarify when and how to use the tool.

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

talonic_extractExtract Data from DocumentA

Turn ANY document into structured, schema-validated JSON. The default tool whenever you need to get data OUT of an unstructured file: PDF, scan, image, DOCX, email, or photo. Returns the requested fields with per-field confidence scores.

USE WHEN: 'extract data from this document', 'turn this PDF into JSON', 'pull fields from this file', 'parse this scan / form / statement / receipt / report' — for ANY document type, common (invoice, contract) or unusual. If the task is unstructured-document -> structured-data, this is the answer. NOT FOR: full plain text (use talonic_to_markdown) · finding documents (use talonic_search / talonic_filter). BY NAME: if the user names a file, call talonic_search first to get its document_id, then call this. ARGS: define the fields you want with inline schema (JSON Schema, e.g. {type:'object',properties:{vendor_name:{type:'string'}}}) OR a saved schema_id, not both. Don't know the fields yet? Set auto_schema:true to let Talonic discover them (open capture) and return a suggested schema you can refine. Provide EXACTLY ONE document source: document_id (cheapest, a workspace doc), file_url (public URL), or file_data+filename (small local files only). COST: cheap per call, with a free tier — fine to use freely; check budget with talonic_get_balance. RETURNS: data (the JSON), confidence.overall and confidence.fields (treat <0.7 as needs review), document metadata, extraction_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
schemaNoInline schema definition. REQUIRED unless `schema_id` is provided. Recommended: full JSON Schema {type:'object', properties:{...}}. Also accepted: flat key-type map {field_name:'string', amount:'number'}. Mutually exclusive with `schema_id`.
file_urlNoURL to a document file. The Talonic API fetches it server-side. Use this for documents already on the public web.
filenameNoOriginal filename including extension, e.g. 'invoice.pdf'. Used to infer MIME type when uploading via `file_data`. Required when `file_data` is provided.
file_dataNoBase64-encoded file bytes. Recommended path when the agent already has the file in memory (e.g., the user attached a PDF to the conversation). Pair with `filename` so MIME type can be inferred. Works regardless of where the file lives on disk.
file_pathNoLocal path to a document file. Only works if the MCP server has read access to that path. In sandboxed chat clients (Claude Desktop, Cowork) where uploads land in a host-owned directory, use `file_data` instead.
schema_idNoID of a saved schema. REQUIRED unless `schema` is provided. Accepts UUID or SCH-XXXXXXXX short id from talonic_list_schemas. Mutually exclusive with `schema`.
auto_schemaNoOpen capture: when true, extract WITHOUT providing a schema — Talonic discovers the document's fields and returns them plus a suggested schema you can refine and reuse. Use this when you don't yet know the fields. Mutually exclusive with `schema` and `schema_id`.
document_idNoID of a document already in the workspace, to re-extract with a new schema.
instructionsNoNatural-language guidance for the extractor, e.g. 'Focus on the billing section. Amounts are in EUR.'
include_markdownNoInclude OCR-converted markdown in the response alongside structured data.
include_provenanceNoInclude per-field provenance (source_text, section, page) showing where each value was found in the document.

Output Schema

ParametersJSON Schema
NameRequiredDescription
costNoPer-call cost and post-call balance, parsed from the X-Talonic-* response headers. `null` for non-extract calls; not always present on legacy clients.
dataYesThe extracted structured data, shape determined by the schema.
linksNoURLs for self, document, and human-readable dashboard view.
schemaNoSchema metadata: which schema was used and how it can be saved.
statusYesExtraction status (e.g. 'complete').
documentYesMetadata about the ingested document.
markdownNoOCR-converted markdown. Present only when `include_markdown: true`.
confidenceNoExtraction confidence. Treat fields below ~0.7 as needing human review.
processingNoProcessing metadata: duration, pages processed, region.
provenanceNoPer-field source evidence (source_text, section, page). Present only when `include_provenance: true`.
request_idNoServer-assigned request ID for support and debugging.
extraction_idYesStable identifier for this extraction.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already indicate non-read-only and non-destructive behavior. The description adds valuable context like cost ('cheap per call, free tier'), confidence-based review thresholds, and mentions of returned metadata. No contradictions with annotations.

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

Conciseness4/5

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

The description is lengthy but well-structured with clear sections (USE WHEN, NOT FOR, BY NAME, ARGS, COST, RETURNS). It front-loads the core purpose. Every sentence adds value, though some repetition could be trimmed. It earns high marks for organization.

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

Completeness5/5

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

Given 11 parameters (0 required) with complex interdependencies, the description covers all document source options, schema definition methods, auto_schema, instructions, and optional output fields. It also describes the return structure with confidence scores and hints for handling low confidence. Output schema enriches this, but the description provides essential context for a complete picture.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds meaning by explaining mutual exclusivity rules (schema vs schema_id vs auto_schema), recommending usage for each document source, and clarifying optional parameters like instructions and include_markdown. This is a meaningful addition beyond the schema.

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

Purpose5/5

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

The description clearly states the tool's purpose as converting unstructured documents into structured JSON. It specifies the verb ('turn into'), resource ('document'), and explicitly distinguishes it from sibling tools like talonic_to_markdown and talonic_search/talonic_filter by listing use cases and exclusions.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use patterns ('USE WHEN: extract data from this document...'), exclusions ('NOT FOR: full plain text...'), and a prerequisite step ('BY NAME: if the user names a file, call talonic_search first'). This is excellent guidance for an AI agent.

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

talonic_field_valuesRead a field's values across documentsA
Read-onlyIdempotent

Read a field's CURRENT VALUES across documents, with provenance — one row per bound occurrence: document id + filename + type, the value, confidence, the raw name it was captured under, the verbatim source text, and the resolution band that bound it.

USE WHEN: the user asks 'what are all the X across my documents', you need to tabulate or aggregate one concept across the corpus, or you want the evidence (source text + document) behind a value. NOT FOR: multi-field row-shaped queries over documents (talonic_filter) or one document's full field set (talonic_get_document).

ARGS: exactly one of field_id or name; optional document_id (one document), value (case-insensitive contains filter), limit (max 100), cursor. RETURNS: { field_id, canonical_name, concept_ids, data[] of { occurrence_id, document_id, document_filename, value, confidence, provenance{ raw_field_name, source_text, resolved_by, needs_confirmation, via_redirect }, links }, pagination }. Rows are Sources-IAM filtered for the caller.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoField NAME instead of an id — resolved through canonical name, synonyms, merge aliases and the registry's spelling fold, then followed to the live concept. Use the user's wording ('Invoice No', 'Vertragsnummer').
limitNoPage size (default 20, max 100).
valueNoCase-insensitive contains filter on the value text.
cursorNoOpaque cursor from pagination.next_cursor.
field_idNoField UUID (from talonic_list_fields / talonic_search).
document_idNoOnly occurrences on this document.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly and idempotent hints, so this is known to be safe. The description goes well beyond that by disclosing the one-row-per-bound-occurrence model, the provenance structure, the Sources-IAM filtering, and the 'exactly one of field_id or name' constraint. It also exposes the pagination limit and current-value semantics, which are not visible from annotations alone.

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

Conciseness5/5

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

The description is well-structured with labeled sections: a purpose sentence, USE WHEN, NOT FOR, ARGS, and RETURNS. Every sentence carries actionable information, and the most important scoping information is front-loaded. Despite its length, there is no redundancy or filler.

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

Completeness5/5

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

The description is self-sufficient even though there is no output schema. It enumerates the full response shape including pagination and provenance, states the IAM filtering behavior, and covers parameter constraints. Combined with the sibling differentiation and use-case guidance, an agent has everything needed to call this tool correctly.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The tool description adds the crucial constraint that exactly one of field_id or name must be provided, and clarifies that document_id restricts to a single document. It does not need to restate the schema's already-rich parameter descriptions, and the additional constraint meaningfully improves invocation correctness.

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

Purpose5/5

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

The description opens with a specific verb and resource, 'Read a field's CURRENT VALUES across documents, with provenance', and defines the row granularity precisely. It also distinguishes itself from siblings by explicitly naming what it is NOT for: talonic_filter and talonic_get_document, so an agent can disambiguate immediately.

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

Usage Guidelines5/5

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

The description provides an explicit USE WHEN section with concrete triggers ('what are all the X across my documents', tabulating/aggregating a concept, wanting evidence behind a value) and a NOT FOR section naming the exact alternative tools. This is exemplary routing guidance that leaves no ambiguity.

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

talonic_filterFilter Talonic DocumentsA
Read-only

Find documents by their extracted field VALUES using composable conditions (e.g. 'invoices where total > 1000').

USE WHEN: value-based criteria on extracted fields — numeric/date/text comparisons or presence checks. NOT FOR: free-text / concept search (use talonic_search) · a single document by id (use talonic_get_document). ARGS: conditions[] (AND-ed). Each = EXACTLY ONE of field (canonical name) or field_id (UUID), an operator, and usually a value. Operators: eq, neq, gt, gte, lt, lte, between (needs value AND value_to), contains, is_empty / is_not_empty (no value). value/value_to are string|number|boolean matching the field type (ISO YYYY-MM-DD for dates). TEXT FILTERS: for eq/contains/is_not_empty on a text field, just TRY a natural field name ('currency', 'vendor_name') — names resolve server-side and an unresolved field surfaces in warnings[] rather than erroring. Do NOT block on discovering the field first; search-first is only required for numeric operators. NUMERIC GUARD: gt/gte/lt/lte/between only work when the field's dataType is 'number'. Call talonic_search first and check dataType; a numeric op on a string field returns zero matches. If the response has warnings[], surface them to the user — do not silently retry. RETURNS: data[] (matching documents with field values), total, warnings[].

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination.
sortNoOptional sort by a field.
limitNoResults per page. Default 50 server-side.
searchNoOptional free-text search applied alongside the filters.
conditionsYesOne or more filter conditions, AND-ed together.
source_connection_idNoOptionally scope to a specific source connection.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesDocuments matching the filter conditions, with their extracted field values.
pageNoCurrent page number.
totalNoTotal documents matching across all pages.
warningsNoAPI warnings surfaced by the Talonic filter endpoint. Most commonly raised when a numeric operator is applied to a string-typed field, in which case the warning explains the lexicographic-comparison trap and suggests a schema-design change. Agents should surface these to the user rather than silently retrying.
paginationNoCursor-based pagination metadata.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations give readOnlyHint and destructiveHint. Description adds: conditions are AND-ed, operator-specific behaviors (is_empty takes no value), numeric guard (check dataType first), text field name resolution with warnings, and instruction to surface warnings. No contradiction.

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

Conciseness4/5

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

The description is well-structured with clear sections (USE WHEN, NOT FOR, ARGS, TEXT FILTERS, NUMERIC GUARD, RETURNS) and front-loaded. It's somewhat long but each sentence adds value, appropriate for the complexity.

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

Completeness5/5

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

Given the tool's complexity (6 params, nested objects, many operators) and existence of output schema, the description covers all critical aspects: purpose, usage, parameter details, edge cases, warnings, return structure. Nothing missing.

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

Parameters5/5

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

Schema coverage is 100%, but description adds deep semantics: explains field/field_id exclusivity, operator list, value/value_to for between, data types, and text filter resolution. This goes well beyond schema descriptions.

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

Purpose5/5

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

The description clearly states 'Find documents by their extracted field VALUES using composable conditions' and gives an example. It distinguishes from siblings talonic_search and talonic_get_document in the 'NOT FOR' section.

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

Usage Guidelines5/5

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

Explicitly says 'USE WHEN: value-based criteria on extracted fields' and 'NOT FOR: free-text / concept search (use talonic_search); a single document by id (use talonic_get_document).' Also provides guidance on numeric guard and warning handling.

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

talonic_find_dataFind the data behind a conceptA
Read-onlyIdempotent

Locate the REAL data behind a natural-language concept before querying anything: semantic + lexical retrieval that resolves a phrase ('payment volume per transaction', 'counterparty', 'Vertragslaufzeit') to the registry fields, values, documents and text passages that carry it — even when the field is captured under a different name.

USE WHEN: the user asks about a concept and you are not sure which field holds it, when talonic_list_fields / talonic_search came back empty or ambiguous, or when the answer may live in document prose rather than a captured cell. NOT FOR: reading a known field's values (talonic_field_values) or filtering by a known field (talonic_filter).

ARGS: query (the concept, in the user's words), optional top_k (1–25, default 10), document_ids (hard scope). RETURNS: ranked planes — FIELDS (canonical_name, field ids/keys, maturity/tier, occurrence_count, sample values with their documents), VALUES, DOCUMENTS and PASSAGES — every item a ready handle for the next call. Read-only, no LLM cost.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesThe natural-language concept to locate.
top_kNoMax results per plane (default 10).
document_idsNoRestrict to these document ids (hard filter, enforced server-side).

TDQS

A4.9/5.0
Behavior5/5

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

Beyond annotations, the description discloses that the tool is read-only with no LLM cost, performs semantic + lexical retrieval, can resolve concepts even when the field is captured under a different name, and restricts document_ids as a hard server-side scope. It also explains the ranked output structure, adding meaningful behavioral context beyond the safety hints already present.

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

Conciseness5/5

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

The description is long but densely structured with clear USE WHEN, NOT FOR, ARGS, and RETURNS sections. Every section earns its place, and the core purpose is front-loaded. The formatting makes it easy for an agent to scan and extract invocation decisions quickly.

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

Completeness5/5

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

With no output schema, the description thoroughly covers return value shape: ranked FIELDS, VALUES, DOCUMENTS, and PASSAGES planes, including key fields and sample values. It also covers all parameters, usage context, exclusions, and safety behavior, leaving little ambiguity for an agent deciding whether and how to call this tool.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds value by clarifying query should be in the user's own words, stating top_k's default of 10, and emphasizing that document_ids is a hard scope enforced server-side. These details go beyond the schema's type and constraints.

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

Purpose5/5

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

The description states a specific verb and resource: locate the real data behind a natural-language concept using semantic and lexical retrieval, mapping phrases to fields, values, documents, and passages. It clearly distinguishes this discovery tool from siblings by framing it as the pre-query resolution step and by noting it works even when fields are named differently.

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

Usage Guidelines5/5

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

The description provides explicit USE WHEN conditions: uncertainty about which field holds a concept, empty or ambiguous results from talonic_list_fields/talonic_search, or when answers may live in prose. It also gives NOT FOR exclusions naming talonic_field_values and talonic_filter, making alternative selection unambiguous.

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

talonic_get_agent_taskGet Agent TaskA
Read-only

Fetch one Agent-stage task's immutable input snapshot, instructions, and declared output contract. This disclosure is audited.

USE WHEN: inspecting a listed task before deciding whether to process it. NOT FOR: acquiring the task (use talonic_claim_agent_task) or returning results (use talonic_submit_agent_task). ARGS: task_id. RETURNS: metadata, input_snapshot, output_contract, instructions, and timeout_fallthrough.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesAgent task UUID.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety profile is covered. The description adds value by stating the data is immutable and audited, and mentions the timeout_fallthrough return field, which is non-annotated behavioral context. A small deduction because it doesn't elaborate on what timeout_fallthrough means or other edge cases.

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

Conciseness5/5

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

The description is compact, front-loaded with purpose, and uses clear labeled sections (USE WHEN / NOT FOR / ARGS / RETURNS). Every sentence provides actionable information with no repetition or fluff.

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

Completeness4/5

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

For a single-parameter read-based tool with rich annotations and 100% schema coverage, the description covers the purpose, usage, and return fields. The only gap is not explaining the 'timeout_fallthrough' field, but that's an output detail rather than a functional requirment. It doesn't need an output schema since it lists return keys.

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

Parameters3/5

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

Schema covers task_id fully with format and description, so baseline is 3. The description just says 'ARGS: task_id' which adds no new semantics. That's acceptable given the schema's completeness.

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

Purpose5/5

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

The description clearly states the tool fetches an Agent-stage task's immutable input snapshot, instructions, and output contract. It names the specific resource ('Agent-stage task') and distinguishes it from siblings like claim/submit by explicitly naming those alternatives. The verb 'Fetch' is concrete and unambiguous.

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

Usage Guidelines5/5

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

The description provides explicit USE WHEN and NOT FOR guidance, naming tailonic_claim_agent_task and tailonic_submit_agent_task as alternatives. This fully clarifies the tool's position in the workflow and prevents misuse.

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

talonic_get_balanceGet Talonic Credit BalanceA
Read-only

Read the workspace's Talonic credit balance, EUR value, tier, 30-day burn, and projected runway.

USE WHEN: the user asks about credits/budget, or before a large batch when you want to confirm headroom. NOT FOR: the per-call cost of a single extraction (that is on the talonic_extract response). ARGS: none. RETURNS: balance_credits, balance_eur, tier, burn_rate_30d_credits, projected_runway_days (-1 = no recent usage), tier_resets_at.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
tierYesAPI tier of the workspace.
balance_eurYesCurrent balance in EUR (two decimals).
tier_resets_atYesISO 8601 timestamp of the next monthly tier reset.
balance_creditsYesCurrent credit balance.
burn_rate_30d_creditsYesTotal credits consumed in the trailing 30 days.
projected_runway_daysYesProjected days of runway at the current 30-day average burn. `-1` when burn is zero (cannot compute).

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark it read-only. The description adds value by detailing returned fields and noting that projected runway is -1 when no recent usage. No contradiction with annotations.

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

Conciseness5/5

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

Description is concise: a single introductory sentence followed by structured USE WHEN, NOT FOR, ARGS, and RETURNS sections. Every sentence is informative and earns its place.

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

Completeness5/5

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

Given the tool's simplicity (read-only, no parameters, documented output schema), the description covers all necessary context: what is returned, when to use, and what not to use for. No gaps.

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

Parameters4/5

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

Input schema has 0 parameters (100% coverage). Description explicitly states 'ARGS: none.' Baseline for 0 parameters is 4, and the tool meets that standard without needing further parameter documentation.

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

Purpose5/5

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

The description clearly states it reads the workspace's Talonic credit balance, EUR value, tier, 30-day burn, and projected runway. The verb 'Read' and specific resource details make purpose unambiguous. It naturally distinguishes from credit-related queries that would go to talonic_extract.

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

Usage Guidelines5/5

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

Explicit USE WHEN and NOT FOR sections provide clear guidance: use when user asks about credits/budget or before a large batch; not for per-call cost (pointing to talonic_extract). This effectively differentiates from sibling tools.

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

talonic_get_documentGet Talonic DocumentA
Read-only

Fetch a single document's metadata and processing status from the workspace.

USE WHEN: 'tell me about document X', or to poll status after talonic_request_upload until the file is ready. NOT FOR: full text (use talonic_to_markdown) · extracted fields (use talonic_extract). BY NAME: if the user names a file, call talonic_search first to get its document_id, then call this. ARGS: document_id. RETURNS: filename, pages, type_detected, language, and status. Status lifecycle: pending_upload -> uploading -> queued -> extracting -> completed. Wait for completed before calling talonic_extract on a freshly uploaded doc. Terminal failure statuses: ocr_failed, extraction_failed, error — stop polling and report the failure to the user if any of these appear. To read the document's text, call talonic_to_markdown with this id.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_idYesThe Talonic document ID. Get this from a previous talonic_extract or talonic_search response.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
linksNo
pagesNo
sourceNo
statusNo
triageNo
filenameNo
mime_typeNo
created_atNo
size_bytesNo
original_pathNo
type_detectedNo
processing_logNo
extraction_countNo
language_detectedNo
latest_extraction_idNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true. The description adds valuable behavioral details: the status lifecycle, terminal failure statuses, and instructions to stop polling and report failures. No contradiction.

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

Conciseness5/5

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

The description is concise and well-structured with clear sections (USE WHEN, NOT FOR, BY NAME, ARGS, RETURNS). Every sentence adds value, and the formatting aids readability.

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

Completeness5/5

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

Given the tool's simplicity (1 parameter, output schema exists), the description covers purpose, usage, behavior, parameter origin, return values, and status lifecycle. It also integrates with siblings for complete workflow guidance.

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

Parameters3/5

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

Schema coverage is 100% and describes the document_id parameter well. The description adds context about getting the ID from previous responses, but does not provide new semantic meaning beyond what the schema offers. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states 'Fetch a single document's metadata and processing status from the workspace.' It uses a specific verb and resource, and distinguishes itself from sibling tools (talonic_to_markdown, talonic_extract) by stating what it is NOT for.

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

Usage Guidelines5/5

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

Explicit 'USE WHEN' and 'NOT FOR' sections provide clear context. It specifies when to poll after upload, when to use alternatives, and even instructs to call talonic_search first if user names a file.

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

talonic_get_fieldGet a field's concept cardA
Read-onlyIdempotent

Get the CONCEPT CARD for one Field Registry field: what it means (curated description + extraction instruction), its synonyms and aliases, maturity, where it occurs (document/occurrence counts, first/last seen, document-type spread), its value distribution (top values with counts, distinct count, examples), schema usage, and identity links (superseded_by, absorbed concepts).

USE WHEN: you must decide whether a field is the right concept for a question, need example values or the value shape before writing a filter, or hold a field NAME from the user and need the live concept behind it. NOT FOR: listing many fields (talonic_list_fields) or reading every value (talonic_field_values).

ARGS: exactly one of field_id or name. Names are resolved through canonical name → spelling fold → merge aliases → synonyms (then case-insensitive fallbacks) and followed to the live concept; the response says which arm matched. include_history: true appends the curation trail (merges, renames, maturity moves). RETURNS: the card { id, canonical_name, maturity, data_type, definition, identity, occurrence, values, usage, links } plus resolution when a name was given and history when requested.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoField NAME instead of an id — resolved through canonical name, synonyms, merge aliases and the registry's spelling fold, then followed to the live concept. Use the user's wording ('Invoice No', 'Vertragsnummer').
field_idNoField UUID (from talonic_list_fields / talonic_search).
include_historyNoAppend the concept's curation history (tier changes, merges, renames), newest first.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, and non-destructive hints, but the description adds meaningful behavioral detail beyond those: the name resolution order, the fact that the response reports which resolution arm matched, and the effect of include_history. This is context annotations cannot convey.

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

Conciseness5/5

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

The description is structured into clear labeled sections (USE WHEN, NOT FOR, ARGS, RETURNS) and every sentence carries meaningful information. Nothing is redundant with the schema, and the content is front-loaded with the core purpose before usage guidance.

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

Completeness5/5

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

For a tool with no output schema, the description supplies the full response shape, resolution behavior, history behavior, and sibling routing. Combined with 100% schema coverage and strong annotations, an agent has everything needed to select and invoke this tool correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents each parameter in detail. The description adds the crucial exclusivity rule ('exactly one of field_id or name') and clarifies that resolution follows to the live concept, plus the response's resolution field behavior, which goes beyond the schema.

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

Purpose5/5

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

The description states a specific verb and resource ('Get the CONCEPT CARD for one Field Registry field') and enumerates exactly what the card contains. It also explicitly distinguishes itself from siblings by naming talonic_list_fields and talonic_field_values in the NOT FOR clause.

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

Usage Guidelines5/5

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

USE WHEN gives three concrete decision triggers, and NOT FOR names the two sibling tools to use instead. This leaves no ambiguity about when to select this tool over alternatives.

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

talonic_get_pricingGet Talonic PricingA
Read-only

Read Talonic's machine-readable credit pricing catalog: fixed per-unit rates so you can predict spend BEFORE running anything.

USE WHEN: estimating the cost of a planned extraction/structuring/matching job, or answering a pricing question. Public — works without spending credits. NOT FOR: the workspace's current balance (use talonic_get_balance) or what it has already spent (use talonic_get_usage). ARGS: none. RETURNS: currency, credits_per_eur, multipliers (e.g. batch 0.5x), and units[] — each { unit, label, credits, eur, free }.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
unitsYesThe per-unit pricing catalog.
currencyYesBilling currency (always EUR).
multipliersYesProcessing-mode multipliers applied on top of per-unit cost (e.g. { realtime: 1, batch: 0.5 }).
credits_per_eurYesCredits per EUR (e.g. 1000 = €1).

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds value by stating it is public and does not spend credits, which is consistent with the annotations. 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.

Conciseness5/5

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

The description is concise and well-structured with clear headings (USE WHEN, NOT FOR, ARGS, RETURNS). Every sentence is informative and earns its place. No wasted words.

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

Completeness5/5

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

Given zero parameters and an output schema (though not shown), the description fully covers what the agent needs: purpose, usage, and return format. The annotations provide safety context, making it complete.

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

Parameters4/5

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

With zero parameters and 100% schema coverage, baseline is 4. The description mentions 'ARGS: none' and explains the return structure (currency, credits_per_eur, etc.), which adds meaning beyond the empty schema.

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

Purpose5/5

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

The description uses a specific verb 'Read' and identifies the resource 'Talonic's machine-readable credit pricing catalog'. It clearly distinguishes from sibling tools like talonic_get_balance and talonic_get_usage by stating its purpose is for estimating costs.

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

Usage Guidelines5/5

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

Explicitly provides use cases ('USE WHEN: estimating cost'), non-use cases ('NOT FOR: balance/usage'), and names alternative tools. This leaves no ambiguity about when to invoke this tool.

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

talonic_get_usageGet Talonic UsageA
Read-only

Read the workspace's per-function credit consumption over a trailing window: where the credits actually went.

USE WHEN: the user asks what they have spent credits on, or you want to see which function (extraction, structuring, intelligence ops) dominates spend. NOT FOR: the remaining balance (use talonic_get_balance) or per-unit rates (use talonic_get_pricing). ARGS: days (optional, default 30, clamped 1-365). RETURNS: period_days, total_credits, and by_function[] — each { operation_type, operations, credits }, highest spend first.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoTrailing window in days (default 30).

Output Schema

ParametersJSON Schema
NameRequiredDescription
by_functionYesPer-function breakdown, highest spend first.
period_daysYesLength of the reporting window in days.
total_creditsYesTotal credits consumed across all functions in the window.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds value by detailing the return structure (period_days, total_credits, by_function) and the days parameter clamping. This extra context goes beyond what annotations provide.

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

Conciseness5/5

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

The description is concise, well-structured with clear sections (lead sentence, USE WHEN, NOT FOR, ARGS, RETURNS). Every sentence is purposeful and front-loaded with key information.

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

Completeness5/5

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

Given the tool's simplicity (one optional parameter, read-only operation with annotations and output schema implied by the return description), the description fully covers when, why, and what to expect. It is complete for effective use.

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

Parameters3/5

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

Schema coverage is 100%, so baseline 3. The description repeats the parameter's default and clamping, adding slight value over the schema description. However, no additional meaning beyond what the schema already conveys.

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

Purpose5/5

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

The description clearly states 'Read the workspace's per-function credit consumption' using a specific verb and resource. It distinguishes from siblings by explicitly stating it is for seeing where credits went, not for balance or pricing.

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

Usage Guidelines5/5

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

The description includes explicit 'USE WHEN' and 'NOT FOR' sections, directing the agent when to use this tool and providing alternatives (talonic_get_balance, talonic_get_pricing). This makes the usage context crystal clear.

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

talonic_heartbeat_agent_taskHeartbeat Agent TaskA

Extend the lease on a claimed Agent-stage task.

USE WHEN: processing may continue past lease_expires_at; heartbeat before expiry using the epoch from claim. NOT FOR: acquiring a task (use talonic_claim_agent_task) or submitting finished outputs (use talonic_submit_agent_task). ARGS: task_id and execution_epoch. Stale or foreign claims return HTTP 409.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesAgent task UUID.
execution_epochYesExecution epoch returned by the successful claim. Stale epochs are rejected.

TDQS

A4.6/5.0
Behavior4/5

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

It discloses the important behavioral outcome that stale or foreign claims return HTTP 409, which is useful beyond the annotations. The lease-extension mutation is consistent with readOnlyHint=false, though the description does not mention success response details or other 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.

Conciseness5/5

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

The description is compact, well-structured, and front-loaded with the core purpose. USE WHEN, NOT FOR, and ARGS/ failure behavior sections each add value without redundant filler.

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

Completeness4/5

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

For a low-complexity two-parameter tool, the description covers purpose, usage conditions, alternatives, and failure behavior. It stops just short of perfect completeness by not stating what a successful heartbeat returns, but this is not essential for choosing or invoking the operation.

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

Parameters4/5

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

The input schema already provides a 100% covered description, so the baseline is a solid 3. The tool description raises that by explaining the execution_epoch comes from the claim, that heartbeats must happen before expiry, and that foreign claims are rejected.

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

Purpose5/5

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

The description uses a specific verb ('Extend the lease') with a specific resource ('a claimed Agent-stage task'), making the operation immediately clear. It also distinguishes this tool from the sibling claim and submit tools.

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

Usage Guidelines5/5

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

The description gives explicit USE WHEN and NOT FOR guidance, including concrete sibling alternatives: talonic_claim_agent_task and talonic_submit_agent_task. This tells the agent exactly when the tool is appropriate and when it is not.

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

talonic_invoke_agent_toolInvoke a platform agent toolA
Read-only

Invoke ONE named tool from the platform's agent tool registry directly, with no model in the loop — you choose the arguments. This is how an external agent uses Talonic's retrieval and provenance while driving control flow itself (e.g. query_data for a read-only SQL SELECT over the extracted data, describe_data for the queryable field list, get_document_markdown to read a document's text).

USE WHEN: talonic_list_agent_tools showed a tool with can_invoke: true that does what you need. Pass exactly the args its input_schema declares. NOT FOR: anything a dedicated talonic_* tool already does (prefer those — they are shaped for you).

ARGS: name (tool name), args (object matching the tool's input_schema), optional document_ids (hard scope for scope-aware tools). RETURNS: { tool, result (the tool's parsed output), citations?, artifacts?, cards? }. Denied capabilities come back as an error naming the capability required; the platform re-checks every call.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoArguments matching the tool's input_schema.
nameYesTool name from talonic_list_agent_tools, e.g. `query_data`.
document_idsNoRestrict to these document ids (hard filter, enforced server-side).

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint and destructiveHint annotations, the description reveals important runtime behavior: calls are direct with no model in the loop, denied capabilities return errors naming the required capability, and the platform re-checks every call. It also documents the return envelope and optional hard-scoping behavior, adding substantial transparency without contradicting annotations.

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

Conciseness5/5

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

The description is well-structured with USE WHEN, NOT FOR, ARGS, and RETURNS sections. Every section earns its place, and the front-loaded purpose sentence immediately conveys the core behavior. Despite covering a generic dispatch tool, it avoids unnecessary fluff.

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

Completeness5/5

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

For a generic invoke tool with no output schema, the description is remarkably complete: it explains how to discover invokable tools, how to construct arguments, what the return shape is, and how errors are surfaced. The combination of description, schema, and annotations gives an agent everything it needs to select and call this tool correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents all three parameters. The description adds value by clarifying that args must exactly match the target tool's input_schema, that name comes from talonic_list_agent_tools, and that document_ids acts as a hard scope for scope-aware tools—useful semantic context beyond the raw schema.

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

Purpose5/5

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

The description uses a specific verb and resource: "Invoke ONE named tool from the platform's agent tool registry directly." It also differentiates from dedicated tools via the explicit "NOT FOR" clause and presents concrete examples like query_data and describe_data, making the tool's role unmistakable.

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

Usage Guidelines5/5

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

The description explicitly states when to use the tool (when talonic_list_agent_tools shows can_invoke: true) and when not to use it (when a dedicated talonic_* tool exists). It also tells the agent to pass args exactly as the target tool's input_schema declares, which is actionable routing guidance.

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

talonic_list_agent_tasksList Agent TasksA
Read-only

List Agent-stage tasks visible to this Talonic workspace credential.

USE WHEN: looking for external-agent work to process; begin with status 'available'. NOT FOR: reading the immutable task payload (use talonic_get_agent_task) or taking a lease (use talonic_claim_agent_task). ARGS: optional status, limit, and cursor. RETURNS: metadata only plus pagination.next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size (default 50).
cursorNoOpaque cursor from pagination.next_cursor.
statusNoOptional task-status filter.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only nature is known. The description adds that it 'RETURNS: metadata only plus pagination.next_cursor,' clarifying the scope of results and the absence of payload data, which goes beyond the annotation. This additional context is valuable.

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

Conciseness5/5

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

The description is compact and well-structured: it starts with a clear purpose, then uses labeled sections (USE WHEN, NOT FOR, ARGS, RETURNS) to convey key information without redundancy. Every sentence earns its place.

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

Completeness5/5

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

With no output schema, the description explicitly states the return value ('metadata only plus pagination.next_cursor'), filling that gap. It also covers scope, filters, pagination, and alternatives, making the tool behavior fully understandable for an agent. The tool is simple, and the description addresses all necessary aspects.

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

Parameters3/5

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

Schema coverage is 100%, with each parameter (limit, cursor, status) already described in the schema. The description's mention of 'optional status, limit, and cursor' adds no new meaning, though it does reference pagination.next_cursor which ties to the cursor parameter. Since the schema does the heavy lifting, a baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states 'List Agent-stage tasks visible to this Talonic workspace credential,' specifying the exact action (list), the resource (agent tasks), and the scope (visible to workspace credential). It also distinguishes itself from siblings by noting NOT for reading payload or taking a lease, making it unambiguous.

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

Usage Guidelines5/5

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

Explicit USE WHEN guidance is provided: 'looking for external-agent work to process; begin with status available.' NOT FOR exclusions mention specific alternatives (talonic_get_agent_task and talonic_claim_agent_task), giving clear when-to-use vs when-not-to-use instructions.

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

talonic_list_agent_toolsList the platform agent toolsA
Read-onlyIdempotent

List the platform's agent tool registry — every retrieval, provenance and analysis primitive the in-product Talonic agent runs on (find_data, describe_data, query_data for read-only SQL over the extracted data, get_document_markdown, workspace_overview, …) with its input schema and whether THIS credential may invoke it.

USE WHEN: you want a capability talonic_* tools do not cover directly (e.g. SQL over the structured data, a workspace overview, cohort discovery) — list here, then call talonic_invoke_agent_tool with the tool name and its args. NOT FOR: discovering fields (talonic_list_fields / talonic_find_data) or documents (talonic_search) — those are shaped for you.

ARGS: only_invocable (default true — hide tools this key cannot run), include_schemas (default true — include each tool's JSON input schema). RETURNS: { tools[] of { name, description, impact, capability, can_invoke, input_schema? }, invocable_count, totalCount }.

ParametersJSON Schema
NameRequiredDescriptionDefault
only_invocableNoHide tools this credential cannot invoke. Default true.
include_schemasNoInclude each tool's JSON input schema. Default true.

TDQS

A4.6/5.0
Behavior5/5

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

The annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety profile is covered. The description goes beyond this by revealing the return shape, the per-credential can_invoke field, that schemas may be included conditionally, and that this is the discovery entrypoint for capabilities not covered by direct talonic_* tools.

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

Conciseness4/5

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

The description is well-structured with clear USE WHEN, NOT FOR, ARGS, and RETURNS sections, making it easy to scan. It is slightly longer than strictly necessary because ARGS duplicates the input schema, but the structure and routing guidance justify most of the length.

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

Completeness5/5

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

With no output schema, the description compensates by explicitly specifying the return contract including tools array fields, invocable_count, and totalCount. It also explains the credential-aware behavior, default parameter values, and when to use/avoid the tool, so an agent has everything needed to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, with both parameters documented in the input schema. The ARGS section mostly restates the schema information, adding only the default-value emphasis and a slightly clearer phrasing of each flag's effect, which is marginal value.

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

Purpose5/5

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

The description uses a specific verb and resource: 'List the platform's agent tool registry', with concrete examples of what is included and that each entry carries its input schema and invocation eligibility. It clearly distinguishes itself from sibling tools like talonic_list_fields and talonic_search by stating it returns registry-level metadata rather than field/document data.

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

Usage Guidelines5/5

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

The description explicitly provides 'USE WHEN' and 'NOT FOR' sections, naming exact alternative siblings and the conditions that route to them. It even tells the agent the next step after listing: call talonic_invoke_agent_tool with the tool name and args.

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

talonic_list_fieldsList registry fieldsA
Read-onlyIdempotent

List the workspace's Field Registry — the canonical concepts Talonic has discovered across every ingested document, each with a stable id, maturity level, data type, synonyms and occurrence count.

USE WHEN: you need to know WHAT data exists before querying it, want to pick the right concept for a question, or need the exact field id for talonic_get_field / talonic_field_values. NOT FOR: locating a specific document (talonic_search) or filtering documents by a value (talonic_filter).

ARGS: search (case-insensitive contains on name), maturity (core | proven | candidate — prefer core/proven for anything you will build on), include_superseded (default false: rows merged into another concept are hidden so you never see two ids for one concept), limit, cursor. RETURNS: data[] of { id, canonical_name, display_name, data_type, maturity, tier, synonyms, description, occurrence_count, superseded_by, links } plus cursor pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size (default 20, max 100).
cursorNoOpaque cursor from pagination.next_cursor.
searchNoCase-insensitive contains match on canonical_name / display_name.
maturityNoFilter by maturity: `core` (universal, fully trusted — safe to build on), `proven` (recurring, stable id), `candidate` (newly discovered, may still be merged or renamed).
include_supersededNoInclude rows merged into a survivor (they carry `superseded_by`). Default false.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already establish readOnly/idempotent/destructive safety; the description adds genuinely useful behavior: merged/superseded rows are hidden by default, maturity semantics for stable vs candidate concepts, and cursor pagination with a return-shape listing. It could also mention auth requirements or rate limits, but those are not necessary for this 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.

Conciseness5/5

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

The description is front-loaded with purpose, then structured into USE WHEN, NOT FOR, ARGS, and RETURNS. Every section earns its place, and the ARGS section is a compact summary rather than a full schema dump.

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

Completeness5/5

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

With no output schema, the RETURNS field list is essential and present. The description also covers pagination, default behavior for superseded rows, when to use the tool, and how it relates to sibling tools; no significant calling context is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description adds guidance beyond the schema by explaining why to prefer core/proven maturities and what include_superseded=false means semantically ('you never see two ids for one concept'). This is useful parameter-level context without needing to restate schema details.

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

Purpose5/5

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

The description uses a specific verb ('List') with an explicit resource ('the workspace's Field Registry') and defines what those concepts are. It also distinguishes itself from siblings by stating it is not for locating documents (talonic_search) or filtering by value (talonic_filter), so an agent can select it correctly.

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

Usage Guidelines5/5

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

The USE WHEN block gives concrete triggers ('need to know WHAT data exists... need the exact field id for talonic_get_field / talonic_field_values') and the NOT FOR block names the sibling alternatives. This is explicit routing guidance rather than implied usage.

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

talonic_list_schemasList Talonic SchemasA
Read-only

List the saved schemas in the workspace as compact summaries (id, short_id, name, description, version, field_count).

USE WHEN: 'what schemas do I have', or to find a reusable schema before extracting. NOT FOR: a one-off extraction with an inline schema (call talonic_extract directly). ARGS: none. RETURNS: data[] of schema summaries. Full field definitions are omitted here — read the talonic://schemas resource for those. Pass a schema's id/short_id to talonic_extract as schema_id.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesSaved schemas in the workspace.
paginationNoCursor-based pagination metadata.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds value by stating it returns data[] of schema summaries, that full field definitions are omitted, and that there are no arguments. This provides behavioral detail beyond the annotations.

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

Conciseness5/5

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

The description is concise with three clear sections: purpose, usage guidance, and returns/args. No unnecessary information. Every sentence serves a purpose.

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

Completeness5/5

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

For a simple listing tool with no parameters and minimal complexity, the description covers all necessary information: what it returns, how to use it, and where to find additional details (resource). Output schema exists but the description adequately summarizes the return.

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

Parameters4/5

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

There are no parameters, and the description confirms 'ARGS: none.' The schema coverage is effectively 100%. With 0 parameters, the baseline is 4, and the description meets that.

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

Purpose5/5

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

The description starts with a specific verb ('List') and resource ('saved schemas'), and details the output fields (id, short_id, name, description, version, field_count). It distinguishes from sibling tools by noting that full field definitions are omitted and directing users to the talonic://schemas resource for those.

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

Usage Guidelines5/5

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

Explicitly states when to use ('what schemas do I have', find a reusable schema before extracting) and when not to (one-off extraction with inline schema, directing to talonic_extract). This provides clear alternatives and context.

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

talonic_request_uploadRequest File UploadA

Get a browser upload link the user opens to add a file to their workspace. Returns the link plus a pre-allocated document_id.

USE WHEN: the user wants to upload a document and you cannot pass it directly — hosted/sandboxed clients (ChatGPT, Claude.ai) or files too large for tool-call arguments. NOT FOR: a document already in the workspace (use its document_id) · a file already on a public URL (use file_url on talonic_extract). ARGS: filename (with extension). RETURNS: upload_url, document_id, expires_at. After the user uploads, poll talonic_get_document on that document_id until status is 'completed', then call talonic_extract. If status becomes ocr_failed, extraction_failed, or error, stop polling and report the failure to the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
filenameYesThe name of the file being uploaded, including extension (e.g. 'invoice.pdf'). Used to pre-allocate the document and infer MIME type.

Output Schema

ParametersJSON Schema
NameRequiredDescription
expires_atYesISO 8601 timestamp when the upload link expires.
upload_urlYesURL the user should open in their browser to drop the file.
document_idYesThe pre-allocated document ID. Use with talonic_get_document to poll status, and with talonic_extract once uploaded.

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses full workflow: returns upload_url, document_id, expires_at; after user uploads, poll talonic_get_document until status 'completed', then call talonic_extract; handles failure statuses. Annotations (readOnlyHint=false) are not contradicted and are supplemented by this detailed behavioral context.

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

Conciseness5/5

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

The description is well-structured with sections: main description, USE WHEN, NOT FOR, ARGS, RETURNS. It is front-loaded with key information, and every sentence adds value. No unnecessary words or repetitions.

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

Completeness5/5

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

Given the tool's complexity (one parameter, no enums, output schema exists), the description completely covers the input, output, and subsequent steps. It provides a workflow for polling and error handling, which is essential for an agent to use the tool correctly. Sibling tools are listed for context.

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

Parameters4/5

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

The schema already describes filename with minLength and a brief description. The description adds that filename should include extension and is used to pre-allocate and infer MIME type, providing extra meaning beyond the schema. With 100% schema coverage, baseline is 3; added value justifies 4.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Get a browser upload link the user opens to add a file to their workspace' and specifies it returns both the link and a pre-allocated document_id. It uses specific verbs and resources, and the context distinguishes this from sibling tools like talonic_extract.

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

Usage Guidelines5/5

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

Explicit 'USE WHEN' and 'NOT FOR' sections provide clear guidance on when to use this tool versus alternatives (e.g., 'hosted/sandboxed clients' or 'files too large'), and when not to (e.g., document already in workspace or file on public URL). The description also directs the agent to talonic_extract for public URLs.

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

talonic_save_schemaSave Talonic SchemaA

Save a reusable schema to the workspace for use across future extractions.

USE WHEN: the user confirms a schema/template they want to reuse across documents. NOT FOR: a single one-off extraction (pass the schema inline to talonic_extract instead). ARGS: name; definition — a JSON Schema ({type:'object',properties:{...}}) or a flat {field:'type'} map. RETURNS: the saved schema with id and short_id. Pass either to talonic_extract as schema_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name for the schema, e.g. 'Standard Invoice'.
definitionYesSchema definition. Most reliable: full JSON Schema {type:'object', properties:{...}}. Also accepted: a flat key-type map {field_name:'string', amount:'number'} which the API normalises.
descriptionNoOptional description of what this schema extracts and when to use it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesUUID of the newly saved schema.
nameYes
linksNo
versionNoSchema version (1 for new schemas; increments on update).
short_idNoHuman-readable short id (SCH-XXXXXXXX).
created_atNo
definitionNoFinal schema definition as stored, normalised by the API.
updated_atNo
descriptionNoSchema description, or null when the schema was saved without one. The API explicitly maps the absent case to null (see SchemaResponse in openapi.yaml).
field_countNo

TDQS

A4.7/5.0
Behavior4/5

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

Annotations indicate destructiveHint=false, which aligns with saving non-destructive. Description adds that it saves to workspace and returns id/short_id. Could mention if same name overwrites, but overall sufficient.

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

Conciseness5/5

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

Extremely concise: one sentence purpose, then usage, then args, then returns. No wasted words.

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

Completeness5/5

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

All necessary context provided given schema coverage and output description. Parameter count, required fields, and return value all addressed.

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

Parameters4/5

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

Input schema has 100% coverage. Description adds value by explaining definition accepts JSON Schema or flat map, and that return includes id and short_id for later use.

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

Purpose5/5

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

Clear verb 'Save' with specific resource 'a reusable schema to the workspace'. Distinguishes from sibling talonic_extract by stating it's for reuse across documents, not one-off extractions.

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

Usage Guidelines5/5

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

Explicitly states 'USE WHEN' and 'NOT FOR' with direct alternative (talonic_extract). Provides clear context for when to choose this tool.

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

talonic_submit_agent_taskSubmit Agent TaskA

Submit declared output fields for a claimed Agent-stage task and resume the parked document.

USE WHEN: processing is complete and every required output in output_contract is ready. NOT FOR: undeclared fields or partial lease maintenance (use talonic_heartbeat_agent_task). ARGS: task_id, execution_epoch, outputs keyed exactly by declared field key, and optional summary. The platform validates all fields and types transactionally before writing anything.

ParametersJSON Schema
NameRequiredDescriptionDefault
outputsYesOutput field key to { value, confidence?, reasoning? }. Use only declared fields.
summaryNoOptional result summary, up to 4,000 characters.
task_idYesAgent task UUID.
execution_epochYesExecution epoch returned by the successful claim. Stale epochs are rejected.

TDQS

A4.6/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the annotations: outputs are validated transactionally before anything is written, the execution epoch must come from a successful claim, stale epochs are rejected, and the document is resumed. This is strong for a write tool even though the annotations do not signal danger or contradiction.

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

Conciseness5/5

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

The description is compact, front-loaded with the core purpose, and organized with 'USE WHEN', 'NOT FOR', and 'ARGS' sections. Every sentence contributes actionable guidance with no wasted words.

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

Completeness4/5

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

For a tool with no output schema, the description covers the core workflow context: eligibility, arguments, validation behavior, contract enforcement, and resume semantics. It stops short of describing the response or potential failure modes after submission, but the key operational context is present.

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

Parameters4/5

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

The input schema already documents all four parameters, so the baseline is 3. The description adds semantically valuable guidance by clarifying that outputs must be keyed exactly by the declared field key, that the optional summary is allowed, and that execution_epoch comes from a successful claim, which enriches the schema-only understanding.

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

Purpose5/5

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

The description clearly states a specific verb ('Submit') and resource ('declared output fields for a claimed Agent-stage task') and explains the resulting effect ('resume the parked document'). It also explicitly distinguishes itself from the sibling tool talonic_heartbeat_agent_task via the 'NOT FOR' clause.

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

Usage Guidelines5/5

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

The description provides explicit 'USE WHEN' and 'NOT FOR' guidance, stating this tool is appropriate when processing is complete and every required output is ready, and inappropriate for undeclared fields or partial maintenance. It even names the alternative tool, making the boundaries unambiguous.

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

talonic_to_markdownDocument to MarkdownA

Get the OCR-converted markdown text of a document.

USE WHEN: the user wants the full text — 'what does it say', summarise, or translate a document. NOT FOR: specific structured fields (use talonic_extract with a schema). BY NAME: if the user names a file, call talonic_search first to get its document_id, then call this. ARGS: prefer document_id (a workspace doc — one cheap call). Otherwise file_url, or file_data+filename for small local files — provide exactly one. A file input ingests the document first and consumes credits; document_id does not. RETURNS: document_id and markdown (the full text).

ParametersJSON Schema
NameRequiredDescriptionDefault
file_urlNoURL to a document file. The Talonic API fetches it server-side.
filenameNoOriginal filename including extension, e.g. 'invoice.pdf'. Used to infer MIME type when uploading via `file_data`. Required when `file_data` is provided.
file_dataNoBase64-encoded file bytes. Recommended path when the agent already has the file in memory (e.g., the user attached a PDF to the conversation). Pair with `filename` so MIME type can be inferred.
file_pathNoLocal path to a document file. Only works if the MCP server has read access to that path. In sandboxed chat clients (Claude Desktop, Cowork) use `file_data` instead.
document_idNoThe Talonic document id whose markdown you want. Get this from a previous talonic_extract or talonic_search response.

Output Schema

ParametersJSON Schema
NameRequiredDescription
costNoPer-call cost and post-call balance from the underlying extract step, parsed from the X-Talonic-* response headers. `null` when the document was already ingested (document_id path) and no extract call ran. Not always present on legacy clients.
markdownYesOCR-converted markdown text content of the document.
document_idYesID of the document the markdown was extracted from.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=true), description adds that file inputs ingest and consume credits while document_id does not, and different input methods have different costs.

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

Conciseness5/5

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

Well-structured with sections, front-loaded with main purpose. Every sentence adds value. No redundancy.

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

Completeness5/5

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

Given output schema exists, description covers return values (document_id and markdown). Addresses complex input choices and usage scenarios. Complete for tool complexity.

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

Parameters4/5

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

Schema coverage is 100% with good descriptions. Description adds hierarchy: prefer document_id, then file_url, then file_data+filename for small local files. Provides selection guidance beyond schema.

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

Purpose5/5

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

Description clearly states it gets OCR-converted markdown text of a document. Uses verb 'Get' and specifies resource. Distinguishes from sibling talonic_extract for structured fields.

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

Usage Guidelines5/5

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

Explicit sections: USE WHEN for full text/summarize/translate, NOT FOR structured fields, BY NAME instructs to first call talonic_search. Provides clear decision rules.

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

Tool Schema Changelog

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

  1. 6 tool updatesv0.1.76
    • Addedtalonic_field_values
    • Addedtalonic_find_data
    • Addedtalonic_get_field
    • Addedtalonic_invoke_agent_tool
    • Addedtalonic_list_agent_tools
    • Addedtalonic_list_fields
  2. 5 tool updatesv0.1.75
    • Addedtalonic_claim_agent_task
    • Addedtalonic_get_agent_task
    • Addedtalonic_heartbeat_agent_task
    • Addedtalonic_list_agent_tasks
    • Addedtalonic_submit_agent_task
  3. 2 tool updatesv0.1.70
    • Addedtalonic_get_pricing
    • Addedtalonic_get_usage
  4. 1 tool updatev0.1.67
    • Changedtalonic_extract1 field changed
      • addedInput schema / properties / auto_schema
        Added value: +{
        +  "description": "Open capture: when true, extract WITHOUT providing a schema — Talonic discovers the document's fields and returns them plus a suggested schema you can refine and reuse. Use this when you don't yet know the fields. Mutually exclusive with `schema` and `schema_id`.",
        +  "type": "boolean"
        +}
  5. 3 tool updatesv0.1.66
    • Changedtalonic_filter6 fields changed
      • changedInput schema / properties / conditions / items / properties / field / description
        Previous value: -"Canonical field name (e.g. 'vendor.name', 'policy.0_coverage_type'). The Talonic API resolves names to ids server-side. Mutually exclusive with `field_id`."New value: +"Canonical field name (e.g. 'vendor.name', 'policy.0_coverage_type'). Provide EXACTLY ONE of `field` or `field_id` per condition — not both, not neither. The Talonic API resolves names to ids server-side."
      • changedInput schema / properties / conditions / items / properties / field_id / description
        Previous value: -"Talonic field UUID. Mutually exclusive with `field`."New value: +"Talonic field UUID. Provide EXACTLY ONE of `field` or `field_id` per condition — not both, not neither."
      • addedInput schema / properties / conditions / items / properties / value / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  }
        +]
      • changedInput schema / properties / conditions / items / properties / value / description
        Previous value: -"Value to compare against."New value: +"Comparison value, typed to match the field (number for numeric fields, string for text and ISO 'YYYY-MM-DD' dates, boolean for flags). REQUIRED for every operator EXCEPT `is_empty` / `is_not_empty` (which take no value). For `between`, this is the lower bound — pair it with `value_to`."
      • addedInput schema / properties / conditions / items / properties / value_to / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  }
        +]
      • changedInput schema / properties / conditions / items / properties / value_to / description
        Previous value: -"Upper bound for `between` operator; ignored otherwise."New value: +"Upper bound. REQUIRED only for the `between` operator (paired with `value`); same type as `value`. Omit for all other operators."
    • Changedtalonic_get_document8 fields changed
      • addedOutput schema / properties / extraction_count / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / extraction_count / type
        Removed value: -"number"
      • addedOutput schema / properties / filename / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / filename / type
        Removed value: -"string"
      • addedOutput schema / properties / pages / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / pages / type
        Removed value: -"number"
      • addedOutput schema / properties / size_bytes / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / size_bytes / type
        Removed value: -"number"
    • Changedtalonic_search2 fields changed
      • changedInput schema / properties / query / description
        Previous value: -"Natural-language search query, e.g. 'indemnification clauses' or 'Acme invoices Q4'."New value: +"ONE short, SINGULAR keyword or an exact filename — 'invoice', 'insurance certificate', 'sample-invoice.pdf'. Matching is literal: sentences and plurals return empty."
      • addedOutput schema / properties / hint
        Added value: +{
        +  "description": "Present only when nothing matched: actionable guidance to retry with a shorter singular keyword.",
        +  "type": "string"
        +}
  6. 1 tool updatev0.1.49
    • Changedtalonic_get_document8 fields changed
      • removedOutput schema / properties / source / additionalProperties
        Removed value: -false
      • addedOutput schema / properties / source / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "type": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / source / properties
        Removed value: -{
        -  "id": {
        -    "type": "string"
        -  },
        -  "type": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / properties / source / type
        Removed value: -"object"
      • removedOutput schema / properties / triage / additionalProperties
        Removed value: -false
      • addedOutput schema / properties / triage / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "confidentiality_marking": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "department": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "jurisdiction": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "pii_categories": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "pii_detected": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "regulated_data": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "sensitivity": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / triage / properties
        Removed value: -{
        -  "confidentiality_marking": {
        -    "anyOf": [
        -      {
        -        "type": "string"
        -      },
        -      {
        -        "type": "null"
        -      }
        -    ]
        -  },
        -  "department": {
        -    "type": "string"
        -  },
        -  "jurisdiction": {
        -    "anyOf": [
        -      {
        -        "type": "string"
        -      },
        -      {
        -        "type": "null"
        -      }
        -    ]
        -  },
        -  "pii_categories": {
        -    "anyOf": [
        -      {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      {
        -        "type": "null"
        -      }
        -    ]
        -  },
        -  "pii_detected": {
        -    "type": "boolean"
        -  },
        -  "regulated_data": {
        -    "type": "boolean"
        -  },
        -  "sensitivity": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / properties / triage / type
        Removed value: -"object"
  7. 2 tool updatesv0.1.45
    • Addedtalonic_request_upload
    • Changedtalonic_search2 fields changed
      • addedOutput schema / properties / fieldMatches / items / properties / dataType
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Field's declared data type (e.g. `string`, `number`, `array`). Use this to guard numeric operators in `talonic_filter` (`gt`/`gte`/`lt`/`lte`/`between`) — they only resolve correctly when `dataType === 'number'`. `null` on non-materialized informational entries."
        +}
      • addedOutput schema / properties / fields / items / properties / dataType
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Field's declared data type (e.g. `string`, `number`, `array`). Use this to guard numeric operators in `talonic_filter` (`gt`/`gte`/`lt`/`lte`/`between`) — they only resolve correctly when `dataType === 'number'`."
        +}
  8. 2 tool updatesv0.1.38
    • Changedtalonic_filter2 fields changed
      • changedInput schema / properties / conditions / items / properties / operator / enum
        Previous value: -[
        -  "eq",
        -  "neq",
        -  "gt",
        -  "gte",
        -  "lt",
        -  "lte",
        -  "between",
        -  "contains",
        -  "is_empty"
        -]New value: +[
        +  "eq",
        +  "neq",
        +  "gt",
        +  "gte",
        +  "lt",
        +  "lte",
        +  "between",
        +  "contains",
        +  "is_empty",
        +  "is_not_empty"
        +]
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "API warnings surfaced by the Talonic filter endpoint. Most commonly raised when a numeric operator is applied to a string-typed field, in which case the warning explains the lexicographic-comparison trap and suggests a schema-design change. Agents should surface these to the user rather than silently retrying.",
        +  "items": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "code": {
        +        "description": "Machine-readable warning code.",
        +        "type": "string"
        +      },
        +      "field": {
        +        "description": "Canonical name of the field this warning applies to.",
        +        "type": "string"
        +      },
        +      "field_id": {
        +        "description": "UUID of the field this warning applies to.",
        +        "type": "string"
        +      },
        +      "message": {
        +        "description": "Human-readable warning message.",
        +        "type": "string"
        +      },
        +      "suggestion": {
        +        "description": "Suggested mitigation, e.g. a recommended `data_type` change to make the query resolve correctly.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changedtalonic_search4 fields changed
      • addedOutput schema / properties / fieldMatches / items / properties / documentCount / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / fieldMatches / items / properties / documentCount / type
        Removed value: -"number"
      • addedOutput schema / properties / fields / items / properties / documentCount / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / fields / items / properties / documentCount / type
        Removed value: -"number"
  9. 8 tool updatesv0.1.25
    • Changedtalonic_extract1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "confidence": {
        +      "additionalProperties": false,
        +      "description": "Extraction confidence. Treat fields below ~0.7 as needing human review.",
        +      "properties": {
        +        "fields": {
        +          "additionalProperties": {
        +            "type": "number"
        +          },
        +          "description": "Per-field confidence map (0..1).",
        +          "propertyNames": {
        +            "type": "string"
        +          },
        +          "type": "object"
        +        },
        +        "overall": {
        +          "description": "0..1 confidence for the extraction as a whole.",
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "overall",
        +        "fields"
        +      ],
        +      "type": "object"
        +    },
        +    "cost": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "balanceCredits": {
        +              "description": "Workspace credit balance after this call settled.",
        +              "type": "number"
        +            },
        +            "cellsResolvedAi": {
        +              "description": "Cells resolved by AI extraction (priced path).",
        +              "type": "number"
        +            },
        +            "cellsResolvedRegistry": {
        +              "description": "Cells resolved from the materialized field-registry (cheap path).",
        +              "type": "number"
        +            },
        +            "costCredits": {
        +              "description": "Credits consumed by this call.",
        +              "type": "number"
        +            },
        +            "costEur": {
        +              "description": "Approximate EUR cost of this call.",
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "costCredits",
        +            "costEur",
        +            "balanceCredits",
        +            "cellsResolvedRegistry",
        +            "cellsResolvedAi"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Per-call cost and post-call balance, parsed from the X-Talonic-* response headers. `null` for non-extract calls; not always present on legacy clients."
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "description": "The extracted structured data, shape determined by the schema.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "document": {
        +      "additionalProperties": false,
        +      "description": "Metadata about the ingested document.",
        +      "properties": {
        +        "filename": {
        +          "type": "string"
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "language_detected": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "mime_type": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "pages": {
        +          "type": "number"
        +        },
        +        "size_bytes": {
        +          "type": "number"
        +        },
        +        "type_detected": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "filename"
        +      ],
        +      "type": "object"
        +    },
        +    "extraction_id": {
        +      "description": "Stable identifier for this extraction.",
        +      "type": "string"
        +    },
        +    "links": {
        +      "additionalProperties": false,
        +      "description": "URLs for self, document, and human-readable dashboard view.",
        +      "properties": {
        +        "dashboard": {
        +          "type": "string"
        +        },
        +        "document": {
        +          "type": "string"
        +        },
        +        "self": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "markdown": {
        +      "description": "OCR-converted markdown. Present only when `include_markdown: true`.",
        +      "type": "string"
        +    },
        +    "processing": {
        +      "additionalProperties": false,
        +      "description": "Processing metadata: duration, pages processed, region.",
        +      "properties": {
        +        "duration_ms": {
        +          "type": "number"
        +        },
        +        "pages_processed": {
        +          "type": "number"
        +        },
        +        "region": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "provenance": {
        +      "additionalProperties": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "page": {
        +            "type": "number"
        +          },
        +          "section": {
        +            "type": "string"
        +          },
        +          "source_text": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "description": "Per-field source evidence (source_text, section, page). Present only when `include_provenance: true`.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "request_id": {
        +      "description": "Server-assigned request ID for support and debugging.",
        +      "type": "string"
        +    },
        +    "schema": {
        +      "additionalProperties": false,
        +      "description": "Schema metadata: which schema was used and how it can be saved.",
        +      "properties": {
        +        "definition": {
        +          "additionalProperties": {},
        +          "propertyNames": {
        +            "type": "string"
        +          },
        +          "type": "object"
        +        },
        +        "id": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "save_url": {
        +          "type": "string"
        +        },
        +        "source": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "status": {
        +      "description": "Extraction status (e.g. 'complete').",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "extraction_id",
        +    "status",
        +    "document",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedtalonic_filter1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "description": "Documents matching the filter conditions, with their extracted field values.",
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "document_id": {
        +            "type": "string"
        +          },
        +          "fields": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "filename": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page": {
        +      "description": "Current page number.",
        +      "type": "number"
        +    },
        +    "pagination": {
        +      "additionalProperties": false,
        +      "description": "Cursor-based pagination metadata.",
        +      "properties": {
        +        "has_more": {
        +          "type": "boolean"
        +        },
        +        "limit": {
        +          "type": "number"
        +        },
        +        "next_cursor": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "total": {
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "total": {
        +      "description": "Total documents matching across all pages.",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Addedtalonic_get_balance
    • Changedtalonic_get_document1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "created_at": {
        +      "type": "string"
        +    },
        +    "extraction_count": {
        +      "type": "number"
        +    },
        +    "filename": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "language_detected": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "latest_extraction_id": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "links": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "dashboard": {
        +          "type": "string"
        +        },
        +        "extractions": {
        +          "type": "string"
        +        },
        +        "self": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "mime_type": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "original_path": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "pages": {
        +      "type": "number"
        +    },
        +    "processing_log": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "completed_at": {
        +            "type": "string"
        +          },
        +          "detail": {
        +            "type": "string"
        +          },
        +          "duration_ms": {
        +            "type": "number"
        +          },
        +          "started_at": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "type": "string"
        +          },
        +          "step": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "size_bytes": {
        +      "type": "number"
        +    },
        +    "source": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "id": {
        +          "type": "string"
        +        },
        +        "type": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "triage": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "confidentiality_marking": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "department": {
        +          "type": "string"
        +        },
        +        "jurisdiction": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "pii_categories": {
        +          "anyOf": [
        +            {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "pii_detected": {
        +          "type": "boolean"
        +        },
        +        "regulated_data": {
        +          "type": "boolean"
        +        },
        +        "sensitivity": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type_detected": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "required": [
        +    "id"
        +  ],
        +  "type": "object"
        +}
    • Changedtalonic_list_schemas1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "description": "Saved schemas in the workspace.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "created_at": {
        +            "type": "string"
        +          },
        +          "definition": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "description": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "description": "Schema description, or null when the schema was created without one. The API explicitly maps the absent case to null (see SchemaResponse in openapi.yaml), so the output schema must accept null in addition to undefined."
        +          },
        +          "field_count": {
        +            "type": "number"
        +          },
        +          "id": {
        +            "description": "UUID of the schema.",
        +            "type": "string"
        +          },
        +          "links": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "dashboard": {
        +                "type": "string"
        +              },
        +              "extractions": {
        +                "type": "string"
        +              },
        +              "self": {
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "short_id": {
        +            "description": "Human-readable short id (SCH-XXXXXXXX).",
        +            "type": "string"
        +          },
        +          "updated_at": {
        +            "type": "string"
        +          },
        +          "version": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "pagination": {
        +      "additionalProperties": false,
        +      "description": "Cursor-based pagination metadata.",
        +      "properties": {
        +        "has_more": {
        +          "type": "boolean"
        +        },
        +        "limit": {
        +          "type": "number"
        +        },
        +        "next_cursor": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "total": {
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedtalonic_save_schema1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "created_at": {
        +      "type": "string"
        +    },
        +    "definition": {
        +      "additionalProperties": {},
        +      "description": "Final schema definition as stored, normalised by the API.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "description": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Schema description, or null when the schema was saved without one. The API explicitly maps the absent case to null (see SchemaResponse in openapi.yaml)."
        +    },
        +    "field_count": {
        +      "type": "number"
        +    },
        +    "id": {
        +      "description": "UUID of the newly saved schema.",
        +      "type": "string"
        +    },
        +    "links": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "dashboard": {
        +          "type": "string"
        +        },
        +        "extractions": {
        +          "type": "string"
        +        },
        +        "self": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "short_id": {
        +      "description": "Human-readable short id (SCH-XXXXXXXX).",
        +      "type": "string"
        +    },
        +    "updated_at": {
        +      "type": "string"
        +    },
        +    "version": {
        +      "description": "Schema version (1 for new schemas; increments on update).",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "name"
        +  ],
        +  "type": "object"
        +}
    • Changedtalonic_search1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "documents": {
        +      "description": "Documents matching the query.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "sourceId": {
        +            "type": "string"
        +          },
        +          "sourceName": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "fieldMatches": {
        +      "description": "Field-level matches with a filterable flag indicating whether the entry can drive talonic_filter.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "displayName": {
        +            "type": "string"
        +          },
        +          "documentCount": {
        +            "type": "number"
        +          },
        +          "filterable": {
        +            "description": "Only filterable: true entries can be used with talonic_filter.",
        +            "type": "boolean"
        +          },
        +          "matchedValue": {
        +            "type": "string"
        +          },
        +          "resolvedFieldId": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          }
        +        },
        +        "required": [
        +          "resolvedFieldId",
        +          "filterable"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "fields": {
        +      "description": "Field-registry entries matching the query. filterable: true entries are usable with talonic_filter.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "canonicalName": {
        +            "type": "string"
        +          },
        +          "displayName": {
        +            "type": "string"
        +          },
        +          "documentCount": {
        +            "type": "number"
        +          },
        +          "filterable": {
        +            "type": "boolean"
        +          },
        +          "id": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "description": "Field UUID for materialized field-registry entries; `null` for schema-only fields that are declared in a schema but have no extracted values yet. Always non-null when `filterable: true`."
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "schemas": {
        +      "description": "Saved schemas matching the query.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "sources": {
        +      "description": "Source connections matching the query.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "documents",
        +    "fieldMatches",
        +    "sources",
        +    "schemas",
        +    "fields"
        +  ],
        +  "type": "object"
        +}
    • Changedtalonic_to_markdown1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "cost": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "balanceCredits": {
        +              "type": "number"
        +            },
        +            "cellsResolvedAi": {
        +              "type": "number"
        +            },
        +            "cellsResolvedRegistry": {
        +              "type": "number"
        +            },
        +            "costCredits": {
        +              "type": "number"
        +            },
        +            "costEur": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "costCredits",
        +            "costEur",
        +            "balanceCredits",
        +            "cellsResolvedRegistry",
        +            "cellsResolvedAi"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Per-call cost and post-call balance from the underlying extract step, parsed from the X-Talonic-* response headers. `null` when the document was already ingested (document_id path) and no extract call ran. Not always present on legacy clients."
        +    },
        +    "document_id": {
        +      "description": "ID of the document the markdown was extracted from.",
        +      "type": "string"
        +    },
        +    "markdown": {
        +      "description": "OCR-converted markdown text content of the document.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "document_id",
        +    "markdown"
        +  ],
        +  "type": "object"
        +}
  10. 2 tool updatesv0.1.16
    • Changedtalonic_extract3 fields changed
      • addedInput schema / properties / include_provenance
        Added value: +{
        +  "description": "Include per-field provenance (source_text, section, page) showing where each value was found in the document.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / schema / description
        Previous value: -"Inline schema definition. Most reliable: full JSON Schema {type:'object', properties:{...}}. Also accepted: a flat key-type map {field_name:'string', amount:'number'} which the API normalises. Mutually exclusive with `schema_id`."New value: +"Inline schema definition. REQUIRED unless `schema_id` is provided. Recommended: full JSON Schema {type:'object', properties:{...}}. Also accepted: flat key-type map {field_name:'string', amount:'number'}. Mutually exclusive with `schema_id`."
      • changedInput schema / properties / schema_id / description
        Previous value: -"ID of a saved schema. Accepts UUID or SCH-XXXXXXXX short id. Mutually exclusive with `schema`."New value: +"ID of a saved schema. REQUIRED unless `schema` is provided. Accepts UUID or SCH-XXXXXXXX short id from talonic_list_schemas. Mutually exclusive with `schema`."
    • Changedtalonic_filter1 field changed
      • changedInput schema / properties / conditions / items / properties / operator / enum
        Previous value: -[
        -  "eq",
        -  "neq",
        -  "gt",
        -  "gte",
        -  "lt",
        -  "lte",
        -  "between",
        -  "contains",
        -  "is_empty",
        -  "is_not_empty"
        -]New value: +[
        +  "eq",
        +  "neq",
        +  "gt",
        +  "gte",
        +  "lt",
        +  "lte",
        +  "between",
        +  "contains",
        +  "is_empty"
        +]
  11. 7 tool updates
    • First observedtalonic_extract
    • First observedtalonic_filter
    • First observedtalonic_get_document
    • First observedtalonic_list_schemas
    • First observedtalonic_save_schema
    • First observedtalonic_search
    • First observedtalonic_to_markdown

TDQS

A4.4/5.0

Scored across 22 tools

Disambiguation5/5

Every tool targets a distinct resource-and-action pair, and potentially overlapping tools (get_document vs to_markdown vs extract, search vs find_data vs filter, balance vs usage vs pricing) are explicitly separated with USE WHEN and NOT FOR guidance. No two tools appear to do the same thing.

Naming Consistency4/5

All tools share the talonic_ prefix and mostly follow a verb_noun pattern like save_schema, get_pricing, list_fields, and claim_agent_task. Minor deviations such as talonic_field_values, talonic_to_markdown, and bare talonic_search/filter/extract are easy to predict and do not create confusion.

Tool Count3/5

At 22 tools, this is on the heavy side and beyond the typical 3-15 well-scoped range. The count is somewhat justified by distinct functional clusters (documents, field registry, schemas, agent tasks, billing, and agent-tool bridge), but it still feels borderline large.

Completeness4/5

The core lifecycle is well covered: document upload/status/extraction, schema save/list/reuse, field discovery and value retrieval, agent task list/claim/heartbeat/submit, and credit pricing/balance/usage. Notable minor gaps include no schema update/delete and no document delete/retry tool, but agents can work around these.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    unofficial MCP (Model Context Protocol) server for Reclaim.ai calendar integration - manage tasks, habits, and smart scheduling through AI assistants like Claude.
    32
    4
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Official MCP server for PostIdentity - Generate AI-powered social media posts, threads, and replies from any MCP-compatible AI assistant with identity management and refinement capabilities.
    31 npm
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Official MCP server for interacting with Saudi market data (Sahmk) via natural language queries, enabling stock quotes, company info, and market summaries inside AI agents like Cursor and Claude Desktop.
    15
    42 PyPI
    12
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Official MCP server for Shipmail, enabling agents to manage domains, mailboxes, messages, threads, webhooks, and suppressions via natural language.
    100
    241 npm
    1
    MIT