DocImprint Document Intelligence
OfficialProvides 10 CrewAI tools for document processing, including research, extraction, Q&A, verification, and notarization, enabling multi-agent workflows with provenance tracking.
Table of contents
Related MCP server: boltwork-mcp
At a glance
DocImprint turns any PDF or URL into a tamper-evident evidence bundle — structured data, AI-cited answers, and a cryptographic proof your agents can verify independently.
Input | PDF or URL |
Output |
|
Verify |
|
Choose your integration
Path | Best for | Start here |
TypeScript SDK | Node agents, typed apps | |
Python SDK | CrewAI, scripts | |
MCP server | Claude, Cursor | |
x402 USDC | Autonomous agents, no account |
See what you get
Every response includes a verifiable bundle ID, manifest hash, and cited answers tied to exact source quotes.
{
"bundle_id": "ev_01jqv8k3m2x",
"manifest_sha256": "a3f2c1d8e9b0476f8a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f",
"signature": {
"signature": "0x8f4e2a1b9c3d5e7f0a2b4c6d8e0f1a3b5c7d9e1f3a5b7c9d1e3f5a7b9c1d3e5f71c",
"signer_address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0EbE",
"algorithm": "secp256k1-eip191"
},
"answer_cited": {
"value": "Section 4.2 does not permit unilateral termination without 90 days written notice.",
"citations": [
{
"quote": "Neither party may terminate this Agreement unilaterally except upon ninety (90) days prior written notice to the other party.",
"paragraphs": [42],
"page": 4,
"confidence": "high"
}
]
},
"artifacts": {
"markdown": { "sha256": "b4e5f6a79876543210fedcba9876543210fedcba9876543210fedcba9876543210ab" },
"manifest": { "sha256": "a3f2c1d8e9b0476f8a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f" }
}
}How it works
flowchart LR
source[PDF or URL] --> extract[extract / qa / checkClaims]
extract --> bundle[Evidence bundle ev_...]
bundle --> artifacts[Artifacts + manifest SHA-256]
bundle --> citations[Cited answers with quotes]
artifacts --> verify[verify - free]
verify --> notarize[notarize on Base L2 - optional]Why not plain OCR or RAG?
Plain OCR | Vector RAG | DocImprint | |
Exact source quotes | No | Approximate | Yes, with paragraph refs |
Tamper evidence | No | No | SHA-256 manifest + EIP-191 sig |
Independent verify | No | No |
|
On-chain attestation | No | No | EAS on Base L2 |
Agent audit trail | No | No | Provenance + handoff (Python) |
Use cases
Scenario | Method | Result |
Contract Q&A |
| Cited answer with confidence score |
Claim verification |
| Per-claim verdict: |
Invoice intake |
| Structured merchant, line items, totals — all cited |
Compliance archive |
| Immutable on-chain record, deletion blocked |
Install
npm install docimprint # TypeScript / Node.jspip install docimprint # Python REST client
pip install "docimprint[crewai]" # + 10 CrewAI tools & ProvenanceTrackerPython source lives in python/. PyPI: docimprint.
Quick start
Get an API key at docimprint.com — free tier available, no credit card required.
TypeScript
import { DocImprintClient } from 'docimprint'
const client = new DocImprintClient({ apiKey: 'dr_live_...' })
const result = await client.extract({
source: 'https://example.com/contract.pdf',
include: ['markdown', 'summary'],
})
console.log(result.bundle_id) // ev_01j...
console.log(result.summary) // AI-generated summary
console.log(result.manifest_sha256) // tamper-evident hash
console.log(result.key_points_cited[0].citations[0].quote)Python
from docimprint import DocImprintClient
client = DocImprintClient(api_key="dr_live_...")
result = client.extract(
url="https://example.com/contract.pdf",
include=["markdown", "summary"],
)
print(result["bundle_id"]) # ev_01j...
print(result["summary"]) # AI-generated summary
print(result["manifest_sha256"]) # tamper-evident hashREST API (cURL)
curl -X POST https://api.docimprint.com/v1/extract \
-H "Authorization: Bearer dr_live_..." \
-H "Content-Type: application/json" \
-d '{"source": "https://example.com/contract.pdf", "include": ["markdown", "summary"]}'Examples
Runnable demos that show the full proof story — claim-check with citations, a stored evidence bundle, and a signed action receipt:
# Python
cd examples/python
pip install -e .
cp .env.example .env # set DOCIMPRINT_API_KEY
python -m docimprint_examples.prove_what_agent_read
# TypeScript
cd examples/typescript
npm install
cp .env.example .env # set DOCIMPRINT_API_KEY
npm run proveSee examples/README.md for both languages and what each artifact proves.
Features
Capability | Method / Mode | Description |
Extract |
| Full evidence bundle — markdown, summary, cited key points, artifacts, manifest SHA-256 |
Invoice parsing |
| Structured |
Document comparison |
| Diff two documents; supply |
Structured extraction |
| Extract typed fields using a caller-defined JSON Schema |
Summarize |
| Prose summary + key points, each with cited paragraph references |
Q&A |
| Single-question answer with inline citations and confidence score |
Claim-check |
| Per-claim verdict: |
Translate |
| Source-cited translation to any language |
Describe |
| AI description of image or PDF page contents |
Collections |
| Semantic search + cross-document RAG Q&A across multiple bundles |
Verify |
| Cryptographic integrity check — manifest hash, EIP-191 signature, artifact hashes. Free, no auth |
Notarize |
| Write manifest SHA-256 to Base L2 via EAS — permanent, immutable attestation |
MCP server | 20 tools · 2 prompts | Native MCP for Claude, Cursor, and any MCP-compatible client |
x402 | REST | Pay per call in USDC — no account required |
Why DocImprint?
🔏 Cryptographic provenance — every bundle is EIP-191 signed at creation; optionally notarized on Base L2 via EAS for an immutable on-chain audit trail
🤖 Agent-native by design — async jobs, webhooks, idempotency keys, and legal hold built into every request, not bolted on
📎 Beyond OCR — citations carry exact quotes, paragraph indices, and confidence scores (
high/medium/low), not just raw text🛠️ 10 CrewAI tools out of the box —
research_tools(),legal_tools(),collection_tools()pre-grouped for common agent workflows⚖️ Compliance-ready —
legal_hold, provenance logging, multi-agent handoff tracking, and on-chain notarization designed for legal and regulated industries💳 Flexible payment — monthly credit plans or pay-per-call USDC via x402, no account required
Agent-native features
DocImprint is designed for autonomous agent workflows, not just synchronous API calls.
// Fire-and-forget async extraction — returns job_id immediately
const job = await client.extract({
source: 'https://example.com/large-report.pdf',
async: true,
webhook: 'https://your-agent.io/callback',
idempotency_key: 'report-2025-q4',
legal_hold: true,
})
const status = await client.getJob(job.job_id)
// { status: 'complete', bundle_id: 'ev_...', progress_pct: 100 }
// Monitor a URL for changes — get notified on diff
await client.extract({
source: 'https://example.com/terms.html',
monitor: { webhook: 'https://your-agent.io/changes', mode: 'diff' },
})Python: provenance & multi-agent handoff tracking
client.log_provenance(bundle_id="ev_...", agent_id="agent-research", action="extracted")
client.handoff(bundle_id="ev_...", from_agent="agent-research", to_agent="agent-legal", note="ready for claim check")CrewAI integration
10 purpose-built tools for CrewAI agents, organized into preset groups.
from docimprint.crewai import DocImprintToolkit
toolkit = DocImprintToolkit(
api_key="dr_live_...",
collection_id="col_...", # required for collection tools
)
toolkit.research_tools() # extract, summarize, qa, check_claims
toolkit.legal_tools() # check_claims, verify, notarize
toolkit.collection_tools() # search, ask, add_to_collection
toolkit.all_tools() # all 10 toolsTool | What it does |
| Full evidence bundle with citations and manifest hash |
| Key points with cited paragraph references |
| Cited answer with confidence score |
| Per-claim verdict: supported / contradicted / not_found |
| Source-cited translation |
| Cryptographic integrity check — manifest, hash, signature |
| On-chain EAS attestation on Base L2 |
| Semantic vector search across document collection |
| Cross-document RAG Q&A with cited sources |
| Add bundle to collection and trigger async indexing |
ProvenanceTracker wraps all tools to automatically log agent actions and bundle handoffs.
from docimprint.crewai import DocImprintToolkit, ProvenanceTracker
tracker = ProvenanceTracker(client=toolkit.client)
trackable = toolkit.trackable_tools()DocImprintKnowledgeSource integrates with CrewAI's knowledge system for retrieval-augmented agents.
MCP server
DocImprint exposes a native MCP server for use with Claude, Cursor, and any MCP-compatible client.
Install via Smithery (one command):
npx @smithery/cli install docimprint --client claudeManual config:
{
"mcpServers": {
"docimprint": {
"type": "streamable-http",
"url": "https://api.docimprint.com/mcp",
"headers": {
"Authorization": "Bearer dr_live_..."
}
}
}
}Transport: streamable-http · Auth: Bearer token · Listed on Smithery · Listed on Glama
MCP tools
URL tools — lean mode, no bundle stored:
Tool | Description |
| Fetch URL → text + metadata |
| Fetch URL → prose summary + key points |
| Fetch URL → cited answer to a specific question |
| Fetch URL → translated content |
Document tools — accepts base64 PDF or image:
Tool | Description |
| OCR plain text from PDF / image |
| OCR tables as Markdown from PDF / image |
| Structured invoice fields: merchant, line items, totals + citations |
| Prose summary + cited key points |
| Per-claim verdict with evidence quotes |
| Extract typed fields using a caller-defined schema |
Bundle & collections:
Tool | Description |
| Cryptographic integrity check (returns signed action receipt) |
| Bundle metadata and notarization status (returns receipt) |
| On-chain EAS attestation on Base L2 (returns receipt) |
| List signed action receipts for a bundle |
| Verify a receipt signature + manifest binding |
| Create a named document collection |
| List your collections |
| Add bundle + trigger async indexing (returns receipt) |
| Semantic vector search |
| Cross-document RAG Q&A |
| Poll async job (extract, indexing, batch) |
| Check credit balance and plan status |
Guided prompts: claim_check_workflow · invoice_intake
Resource: bundle://{bundle_id} — read bundle metadata directly
API reference
Full typed reference: docimprint.com/docs · OpenAPI
Category | Methods |
Core |
|
Focused |
|
Extract modes |
|
Collections |
|
Jobs |
|
Error handling
import { DocImprintClient, DocImprintError } from 'docimprint'
try {
const result = await client.extract({ source: 'https://example.com/doc.pdf' })
} catch (err) {
if (err instanceof DocImprintError) {
console.error(err.message) // human-readable error
console.error(err.status) // HTTP status code
console.error(err.requestId) // x-request-id for support
}
}Authentication
API key
Monthly credits via Stripe — sign up at docimprint.com, free tier available:
const client = new DocImprintClient({ apiKey: 'dr_live_...' })x402 USDC payments
DocImprint supports the x402 open standard — pay per call in USDC on Base, straight from any EVM wallet. No account. No sign-up. No API key. Your agent can call the API autonomously without any human-managed credentials.
The API is x402-native: it returns a standard 402 Payment Required response with on-chain payment details, your client settles in USDC, and the request completes automatically. From $0.01 / call.
With @x402/fetch (automatic payment handling):
import { wrapFetchWithPayment } from '@x402/fetch'
import { createWalletClient, http } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'
import { base } from 'viem/chains'
const account = privateKeyToAccount('0x...')
const wallet = createWalletClient({ account, chain: base, transport: http() })
const fetchWithPayment = wrapFetchWithPayment(fetch, wallet)
const res = await fetchWithPayment('https://api.docimprint.com/v1/summarize', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ source: 'https://example.com/report.pdf' }),
})
const data = await res.json()Identity on owner routes: For GET/DELETE operations that require ownership (e.g. fetching your bundle), pass the payment-signature header from a prior payment response so the API can verify your wallet address without a separate login.
TypeScript
All request and response types are exported:
import type {
ExtractRequest,
ExtractResponse,
Citation,
CitedField,
InvoiceResult,
Job,
Collection,
SearchResult,
} from 'docimprint'Pricing
Free tier available — no credit card required. Monthly credit plans via Stripe, or pay per call in USDC via x402. See pricing →
Community
Questions, integrations, and announcements: GitHub Discussions.
Links
Python examples — prove what an agent read
TypeScript examples — same demo in Node/TS
Available Tools
22 toolsaccount.quotaGet QuotaARead-onlyIdempotent
Get current credit balance and plan details for your API key. Free — no credits consumed. Check this before running credit-consuming operations (extract, summarize, etc.) to avoid QUOTA_EXCEEDED errors. Returns plan tier, billing period, and usage breakdown. Returns: { plan_id, billing_period (YYYY-MM), credits_used, credits_limit, credits_remaining, status: "active"|"suspended" } Example prompts:
"How many credits do I have left this month?"
"Check my current quota and plan status."
"Am I going to hit my credit limit soon?"
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| plan_id | Yes | |
| credits_used | Yes | |
| credits_limit | Yes | |
| billing_period | Yes | |
| credits_remaining | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. The description adds valuable behavioral context: 'Free — no credits consumed' clarifies that the operation itself has no cost, which is critical for a quota tool. It also discloses the response structure precisely, including the status field with possible values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: it opens with the core purpose, then adds the no-credits detail and usage timing, followed by a clear return block and example prompts. Every section earns its place, and the length is appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters) and the presence of formal annotations plus a detailed return schema in the description, the description covers all essential context: purpose, usage scenario, return payload, and example queries. It is complete for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter semantics to explain. The description correctly omits parameter details; the empty schema makes this self-evident. Baseline of 4 applies due to 0 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb and resource: 'Get current credit balance and plan details for your API key.' It distinguishes from sibling tools by focusing on account/quota status, and specifies the return contents (plan tier, billing period, usage breakdown).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs when to use the tool: 'Check this before running credit-consuming operations (extract, summarize, etc.) to avoid QUOTA_EXCEEDED errors.' This provides clear contextual guidance, and the example prompts reinforce typical usage. It does not need alternatives since no competing tool exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bundle.getGet Evidence BundleARead-onlyIdempotent
Retrieve metadata for an evidence bundle (ev_...) owned by your API key. Free — no credits consumed. Use for quick status/metadata lookups such as checking if a bundle is complete, finding its notarization status, or viewing retention/legal hold info. For deep cryptographic integrity verification (hash + signature + artifact checks), use bundle.verify instead. Also returns a signed action receipt (rcpt_...) binding this lookup to the bundle manifest — list with receipt.list, verify with receipt.verify. Returns: { bundle_id, source_url, mode, status: "pending"|"complete"|"failed", manifest_sha256, manifest_signature, signer_address, attestation_tx, attestation_at, eas_uid, parent_bundle_id, superseded_by, legal_hold: boolean, retention_until, created_at, receipt: ActionReceipt|null } Example prompts:
"Show me the metadata for bundle ev_550e8400."
"Check the status and notarization info of my evidence bundle."
"Get me the details of bundle [ev_id] — is it complete?"
| Name | Required | Description | Default |
|---|---|---|---|
| bundle_id | Yes | Evidence bundle ID (ev_...) returned by extract or bundle.notarize. Example: "ev_550e8400-e29b-41d4-a716-446655440000" |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| status | Yes | |
| eas_uid | Yes | |
| receipt | Yes | |
| bundle_id | Yes | |
| created_at | Yes | |
| legal_hold | Yes | |
| source_url | Yes | |
| superseded_by | Yes | |
| attestation_at | Yes | |
| attestation_tx | Yes | |
| signer_address | Yes | |
| manifest_sha256 | Yes | |
| retention_until | Yes | |
| parent_bundle_id | Yes | |
| manifest_signature | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint and idempotentHint, but the description adds meaningful behavior beyond that: it is free ('no credits consumed'), scoped to bundles owned by the API key, and returns a signed action receipt binding the lookup to the manifest. This gives the agent crucial context about side effects and constraints that annotations alone do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then usage guidance, alternatives, return fields, and examples. While the return-field list duplicates the output schema, it is presented compactly and every sentence contributes actionable information. It is a bit long but not bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one parameter, an output schema, and strong annotations, the description still adds substantial value: cost, ownership, alternatives, receipt behavior, and example prompts. It fully equips the agent to decide when to invoke and what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully documents the only parameter (bundle_id) with a clear description and example, so the schema carries the weight. The description repeats this via example prompts but does not add new semantic details beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Retrieve metadata for an evidence bundle (ev_...)' and clearly distinguishes this from bundle.verify by stating it is for quick status/metadata lookups while verification is for deep cryptographic integrity checks. This unambiguously defines the tool's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly enumerates use cases ('checking if a bundle is complete, finding its notarization status, or viewing retention/legal hold info') and names an alternative for a different job ('use bundle.verify instead'). It also references companion tools (receipt.list, receipt.verify) for further actions, giving clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bundle.notarizeNotarize Bundle On-ChainAIdempotent
Notarize an evidence bundle on-chain by writing its manifest SHA-256 to the blockchain (Base/EVM). Creates a permanent, tamper-evident on-chain record of the document fingerprint. If the bundle is already notarized, returns the existing attestation immediately (idempotent). Use when you need an immutable on-chain timestamp proving a document existed at a point in time. For quick integrity checks without on-chain cost, use bundle.verify instead. Also returns a signed action receipt (rcpt_...) binding this notarize call to the bundle manifest — list with receipt.list, verify with receipt.verify. PREREQUISITE: Bundle status must be "complete". Check status with bundle.get first. NOTE: Costs gas (ETH). The on-chain record is permanent and cannot be deleted even if the bundle is later purged. Returns: { bundle_id, attestation: { tx_hash, network, attested_at, key_id, eas_uid?, schema_uid? }, receipt: ActionReceipt|null } Example prompts:
"Notarize bundle ev_550e8400 on-chain so I have a permanent record."
"Put the fingerprint of my evidence bundle on the blockchain."
"Create an on-chain timestamp for this document bundle."
| Name | Required | Description | Default |
|---|---|---|---|
| bundle_id | Yes | Evidence bundle ID (ev_...) to notarize. Bundle must have status "complete". Example: "ev_550e8400-e29b-41d4-a716-446655440000" |
Output Schema
| Name | Required | Description |
|---|---|---|
| receipt | Yes | |
| bundle_id | Yes | |
| attestation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: idempotency (returns existing attestation if already notarized), gas costs, permanence of the on-chain record even if the bundle is purged, and the signed action receipt returned. No contradictions with annotations; idempotentHint is consistent with the stated idempotent behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though detailed, the description is well-structured with clear sections (PREREQUISITE, NOTE, Returns, Example prompts). Every sentence conveys necessary information for a high-stakes, gas-costly blockchain operation, and it is front-loaded with the core purpose. The length is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool involves an on-chain write with financial cost and permanent records, the description covers all essential context: when to use, prerequisites, cost implications, permanence, output structure, and example prompts. The output schema is also present, so the explicit return field listing is a bonus. This description is fully complete for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes the bundle_id parameter with 100% coverage, including format, example, and status requirement. The description reinforces this by embedding the prerequisite ('Bundle status must be complete') and using the example in prompt suggestions, adding marginal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: notarizing an evidence bundle on-chain by writing its SHA-256 manifest to the blockchain. It also differentiates from sibling tools like bundle.verify by emphasizing the on-chain, permanent timestamping use case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool ('when you need an immutable on-chain timestamp') and when not to ('For quick integrity checks without on-chain cost, use bundle.verify instead'). It also specifies a prerequisite (bundle must be 'complete', check with bundle.get), giving clear operational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bundle.verifyVerify Evidence BundleARead-onlyIdempotent
Verify the cryptographic integrity of an evidence bundle (ev_...) owned by your API key. Checks manifest hash, EIP-191 signature, and R2 artifact hashes. Free — no credits consumed. Use when you need to confirm a bundle has not been tampered with. For quick metadata lookups (without full crypto verification), use bundle.get instead. Also returns a signed action receipt (rcpt_...) binding this verify call to the bundle manifest — list with receipt.list, verify with receipt.verify. Returns: { valid: boolean, bundle_id, manifest_sha256, checks: { status, manifest_hash, signature, artifacts: [{ name, ok }] }, tampered: string[], signer_address: string|null, attestation_tx: string|null, url: string, captured_at: string, receipt: ActionReceipt|null } Example prompts:
"Verify the cryptographic integrity of bundle ev_550e8400."
"Is this evidence bundle still valid and untampered?"
"Deep-check the manifest hash and signature of my bundle."
| Name | Required | Description | Default |
|---|---|---|---|
| bundle_id | Yes | Evidence bundle ID (ev_...) returned by extract or notarize. Example: "ev_550e8400-e29b-41d4-a716-446655440000" |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| valid | Yes | |
| checks | Yes | |
| receipt | Yes | |
| tampered | Yes | |
| bundle_id | Yes | |
| captured_at | No | |
| attestation_tx | No | |
| signer_address | No | |
| manifest_sha256 | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds significant behavioral context: it is free (no credits consumed), checks the bundle is owned by the API key, enumerates specific integrity checks, and discloses that it returns a signed action receipt. This goes well beyond the annotation hints and adds useful operational details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with purpose, usage, return value, and examples. It is longer than minimal but each section earns its place. The Returns block may be redundant with the existing output schema, but it still aids quick comprehension without being overly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers when to use, alternatives, cost, ownership, what is verified, and receipt handling. Combined with rich annotations and an output schema, it leaves no major operational gaps for an agent to correctly select and invoke this tool. The context signals indicate high schema and annotation richness, and the description completes the picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage for the single parameter bundle_id is 100%, including type, description, and an example. The description does not add parameter-specific semantics beyond the schema, so the baseline score of 3 is appropriate. The schema already carries the full burden for parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies a clear verb and resource: 'Verify the cryptographic integrity of an evidence bundle', and enumerates exact checks (manifest hash, EIP-191 signature, R2 artifact hashes). It also distinguishes itself from sibling bundle.get, which is for quick metadata lookups without full verification, making differentiation explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Use when you need to confirm a bundle has not been tampered with' and contrasts it with 'For quick metadata lookups (without full crypto verification), use bundle.get instead.' It also gives concrete example prompts that demonstrate when and how to invoke the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
collection.add_documentAdd Document to CollectionAIdempotent
Add an evidence bundle to a collection and trigger async vector indexing. Use after collection.create to populate a collection with documents. Once indexed, documents become searchable via collection.search and collection.ask. Indexing is async — poll job.status with the returned job_id until status is "complete". Also returns a signed action receipt (rcpt_...) binding this add call to the bundle manifest — list with receipt.list, verify with receipt.verify. PREREQUISITE: Bundle must have status "complete" (check with bundle.get). Collection must be owned by your API key. Returns: { collection_id, bundle_id, job_id (poll for indexing completion), receipt: ActionReceipt|null } Example prompts:
"Add my contract bundle ev_550e8400 to the Q4 Contracts collection."
"Put this evidence bundle into my Due Diligence Docs collection for search."
"Add document [bundle_id] to collection [col_id] with a title."
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Optional display title for the document in this collection. Example: "Q4 2025 Financial Report" | |
| bundle_id | Yes | Evidence bundle ID (ev_...) to add. Bundle must have status "complete". Example: "ev_550e8400-e29b-41d4-a716-446655440000" | |
| collection_id | Yes | Collection ID (col_...) returned by collection.create. Example: "col_550e8400-e29b-41d4-a716-446655440000" |
Output Schema
| Name | Required | Description |
|---|---|---|
| job_id | Yes | |
| receipt | Yes | |
| bundle_id | Yes | |
| collection_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that indexing is async, returns a job_id to poll, and provides a signed action receipt. It also mentions the requirement for bundle status and ownership. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening, usage note, return contract, and examples. It is longer than minimal but every section adds value—prerequisites, async behavior, receipt handling, and invocation examples. Not all sentences are essential, hence a 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's async nature and return of job_id/receipt, the description covers the full workflow: how to invoke, what to do after (poll), prerequisites, and return structure. It also aligns with sibling tools (job.status, receipt.verify, collection.search) and provides example prompts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline applies. The description reinforces parameter usage through examples and prerequisites but does not add substantial meaning beyond the schema descriptions, which already include examples and constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: 'Add an evidence bundle to a collection and trigger async vector indexing.' It clearly distinguishes from siblings like collection.create (create collection), collection.search/ask (query), and bundle.get/receipt.verify.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it ('Use after collection.create'), what happens after indexing (searchable via collection.search and collection.ask), and gives prerequisites (bundle complete, collection owned). It also tells the agent to poll job.status, providing a clear workflow with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
collection.askAsk CollectionARead-onlyIdempotent
Answer a question using RAG over a document collection. Retrieves relevant chunks then synthesizes a cited answer with source attribution. Use when you need a direct answer grounded in your collection documents. For raw matching chunks (without synthesis), use collection.search instead. For single-document Q&A, use url.qa instead. PREREQUISITE: Collection must be populated via collection.add_document and indexed before results appear. Returns: { answer: string, sources: [{ bundle_id, chunk_id }], retrieval: [{ bundle_id, chunk_id, text, score }] } Example prompts:
"What are the key terms of the service agreement in my collection?"
"Based on my due diligence docs, what are the main risks?"
"Answer this question using all documents in the Q4 Contracts collection."
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes | Natural language question to answer from collection documents. Example: "What are the key terms of the service agreement?" | |
| max_chunks | No | Max chunks to retrieve for context (default 8). Increase for broad questions, decrease for precision. Example: 12 | |
| collection_id | Yes | Collection ID (col_...) returned by collection.create. Example: "col_550e8400-e29b-41d4-a716-446655440000" |
Output Schema
| Name | Required | Description |
|---|---|---|
| answer | Yes | |
| sources | Yes | |
| retrieval | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description's added context (synthesis process, citation behavior, return structure) is valuable. It also warns that collection must be populated first. It doesn't cover failure modes or rate limits, but for a read-only retrieval tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately long but well-structured: main purpose, usage guidance, prerequisite, return type, and examples. It is front-loaded with the core verb and resource. Some redundancy between the first sentence and the 'Use when' clause, but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is highly complete for a RAG tool. It covers what it does, when to use it, how it differs from alternatives, prerequisites, and the exact return structure. The output schema already exists, so return values are documented, and the description reinforces them with an example structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter (question, max_chunks, collection_id) having a clear description and example. The description text does not add new parameter-level semantics beyond the schema, but the example prompts illustrate question phrasing. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs RAG over a document collection to answer questions with source-attributed synthesis. It explicitly distinguishes itself from collection.search (raw chunks) and url.qa (single-document Q&A), making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance ('Use when you need a direct answer grounded in your collection documents') and names specific alternatives with different use cases. It also includes a prerequisite about populating and indexing the collection, which is essential for correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
collection.createCreate CollectionA
Create a named document collection for cross-document semantic search and RAG-based Q&A. Free — no credits consumed. Use when you want to group related evidence bundles for unified search (collection.search) or question answering (collection.ask). NOTE: Collections start empty. Add evidence bundles with collection.add_document. Indexing is async — once complete, use collection.search or collection.ask. Returns: { collection_id: string (col_...), name: string } Example prompts:
"Create a collection called Q4 Contracts for my quarterly reports."
"Set up a new document group named Due Diligence Docs."
"Make a collection to organize my vendor agreements."
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable collection name. Example: "Q4 Contracts" or "Due Diligence Docs" |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| collection_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover readOnly/idempotent/destructive, but the description adds valuable behavioral details not in annotations: it's free (no credits), collections start empty, indexing is async, and it returns a specific object shape with collection_id. This goes beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening, a note about async indexing, return format, and example prompts. While longer than the minimal example, each section adds practical value and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple creation tool, the description covers purpose, usage, workflow, return schema, and examples. It mentions related sibling tools appropriately and leaves no major operational gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully describes the 'name' parameter with an example. The description reinforces it with prompt examples and mentions 'named' but doesn't add new technical constraints. Given 100% schema coverage, the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Create a named document collection' and defines its purpose for cross-document semantic search and RAG-based Q&A. This clearly distinguishes it from sibling operations like collection.search, collection.ask, and collection.add_document.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use: 'Use when you want to group related evidence bundles for unified search or question answering.' It also clarifies the workflow by noting collections start empty and that documents must be added via collection.add_document, with indexing async. This gives clear context, though it doesn't enumerate exclusions like when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
collection.listList CollectionsARead-onlyIdempotent
List all document collections owned by your API key. Free — no credits consumed. Use before collection.search or collection.ask when you need the collection ID. Supports pagination with limit and offset. Returns: { collections: [{ id, name, created_at }] } Example prompts:
"List all my document collections."
"Show me the collections I have created."
"What collections do I own? List them."
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max collections to return (default 50, max 100). Example: 20 | |
| offset | No | Pagination offset (default 0). Example: 0 |
Output Schema
| Name | Required | Description |
|---|---|---|
| collections | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds valuable context: it is free and consumes no credits, returns a specific structure, and supports pagination. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core purpose, but the three example prompts are somewhat redundant and could be trimmed for tighter conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all important aspects: what is listed, ownership scope, cost, usage context, pagination, and return format. It is self-contained and sufficient for an agent to decide when and how to invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema describes both parameters (limit and offset) with examples, so schema description coverage is 100%. The description only mentions 'Supports pagination with limit and offset,' which adds minimal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List all document collections owned by your API key' using a specific verb and resource, and it distinguishes itself from sibling tools like collection.search and collection.ask by emphasizing listing all collections rather than searching or asking.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use before collection.search or collection.ask when you need the collection ID,' which provides clear context for when to use this tool and names alternatives. It also mentions free usage and pagination support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
collection.searchSearch CollectionARead-onlyIdempotent
Semantic (vector) search across documents in a collection. Returns ranked text chunks with relevance scores. Free — no credits consumed. Use when you need raw matching chunks from a collection. For a synthesized cited answer from the same context, use collection.ask instead. PREREQUISITE: Collection must be populated via collection.add_document and async indexing must complete (poll job.status) before results appear. Returns: { results: [{ bundle_id, chunk_id, text, score: number (0–1), title? }] } Example prompts:
"Search my Q4 Contracts collection for mentions of liability cap."
"Find the clause about data retention in my due diligence docs."
"Search for revenue numbers across my quarterly reports."
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max chunks to return (default 10, max 50). Example: 5 | |
| query | Yes | Natural language search query. Example: "What were the revenue numbers for Q4?" | |
| collection_id | Yes | Collection ID (col_...) returned by collection.create. Example: "col_550e8400-e29b-41d4-a716-446655440000" |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description adds value by disclosing that the operation is 'Free — no credits consumed' and that async indexing must complete before results appear. This clarifies real-world behavior beyond the safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections: purpose, usage guidance, prerequisite, return format, and example prompts. It is front-loaded with the main purpose and includes no filler. Every sentence contributes to understanding the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all necessary context: purpose, usage, prerequisites, return format, cost, and examples. Given the tool's moderate complexity and the presence of an output schema, this is fully self-contained and leaves no major gaps for an agent to misuse.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all parameters (collection_id, query, limit) are already documented with descriptions and examples. The description adds example prompts that illustrate query phrasing but does not change the fundamental meaning of any parameter. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Semantic (vector) search across documents in a collection' with a specific verb (search) and resource (documents in a collection). It also distinguishes itself from sibling tool collection.ask, which provides synthesized answers rather than raw chunks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Use when you need raw matching chunks from a collection.' Directly names the alternative: 'For a synthesized cited answer from the same context, use collection.ask instead.' Also provides a prerequisite about indexing completion and polling job.status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document.check_claimsCheck ClaimsARead-onlyIdempotent
Verify a list of factual claims against document text. Uses a quality AI model with citation-level evidence. Use after document.extract_text or url.extract when you need to validate specific factual assertions. For open-ended questions about a document, use url.qa instead. For multi-document investigation, use collection.ask. Typical workflow: document.extract_text/url.extract → document.check_claims. Returns: { claims: [{ claim, status: "supported"|"contradicted"|"not_found", evidence: { quote, paragraphs[] }, confidence: "high"|"medium"|"low" }], truncated: boolean } Example prompts:
"Check whether this contract mentions a liability cap of $1M."
"Verify these claims against the document: [claims list]."
"Does the report actually say revenue grew 23%?"
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Document text to check claims against. Obtain via document.extract_text or url.extract. Example: "ACME Corp was founded in 2010. Revenue exceeded $1M in 2024." | |
| claims | Yes | Factual statements to verify. Each claim is checked independently against the text. Example: ["Founded in 2010", "Revenue exceeded $1M"] | |
| max_tokens | No | Input length cap (1 token ≈ 4 chars). Default ~3000 tokens. Truncates input text, not the output. Example: 4000 |
Output Schema
| Name | Required | Description |
|---|---|---|
| claims | Yes | |
| truncated | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds substantial behavioral context: AI model quality, citation-level evidence, return structure with statuses and confidence, and the `truncated` flag. It also clarifies that max_tokens truncates input (in schema) but adds the return-level `truncated` indicator. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: a clear purpose sentence, usage alternatives, workflow, return shape, and example prompts. Every section adds value without redundancy. It is longer than a minimal description but all content is used.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 3 parameters and a structured output, the description covers all necessary context: when to use, how to use, what it returns, and examples. The return schema is shown in the description, so the agent fully understands behavior before invoking the tool. Given the existing output schema, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter (text, claims, max_tokens) already described in detail. The description does not add new parameter semantics beyond the schema, only example prompts that illustrate usage rather than parameter meaning. Baseline of 3 is appropriate because the schema carries the full load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: 'Verify a list of factual claims against document text.' It also distinguishes from siblings by mentioning 'citation-level evidence' and explicitly comparing to url.qa and collection.ask for different use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (validate specific assertions after extraction), when not to use (open-ended questions → url.qa; multi-document → collection.ask), and gives a typical workflow from extraction to checking claims. This is clear guidance with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document.extract_structuredExtract Structured DataARead-onlyIdempotent
Extract typed fields from document text using a caller-defined schema. Uses a quality AI model with retry logic. Use when you need specific data points from a document rather than full text. For invoices with known fields, document.parse_invoice (prebuilt schema) may be simpler. For general summarization, use document.summarize instead. Schema format: { "field_name": "type hint or description" } — e.g. { "contract_date": "ISO date", "party_a": "string", "penalty_usd": "number" }. Returns: { data: { : value }, data_cited: { : { value, confidence: "high"|"medium"|"low", citations: [{ quote, paragraphs[] }] } } } Example prompts:
"Extract the contract date, parties, and penalty amount from this agreement."
"Pull the vendor name, PO number, and total from this document."
"Get me all named fields from this form using my custom schema."
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Document text to extract from. Obtain via document.extract_text or url.extract. Example: "This Service Agreement is entered into on 2025-03-15 between ACME Corp and Beta Inc..." | |
| schema | Yes | Field map: describe each field you want extracted with a type hint. Example: { "total_usd": "number", "vendor": "string", "invoice_date": "ISO date YYYY-MM-DD" } | |
| max_tokens | No | Input length cap (1 token ≈ 4 chars). Default ~2500 tokens. Truncates input, not output. Example: 3000 |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| data_cited | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description doesn't need to restate them. It adds useful context about using a 'quality AI model with retry logic' and details the return structure with confidence levels and citations, which goes beyond annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately long but well-structured, with clear sections for purpose, usage, schema format, output, and examples. Every section earns its place given the tool's complexity, though it could be tightened slightly without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers usage context, alternatives, parameter examples, and explicitly describes the return object. For a complex tool with an output schema, this is comprehensive enough for an agent to select and invoke it correctly, though it doesn't address potential errors or edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description provides a concrete schema format example and example prompts, but the schema descriptions already explain the parameters well. The added value is marginal—mainly illustrative rather than clarifying new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool extracts typed fields from document text using a caller-defined schema. It distinguishes itself from sibling tools by mentioning schema-driven extraction and explicitly contrasts with document.parse_invoice and document.summarize.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: 'Use when you need specific data points from a document rather than full text,' and alternatives are named: 'For invoices with known fields, document.parse_invoice may be simpler. For general summarization, use document.summarize instead.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document.extract_tablesExtract TablesARead-onlyIdempotent
Extract tables and forms as Markdown from a PDF or image (base64-encoded). Use when the document contains structured tabular data such as financial statements, data sheets, or forms. For plain prose documents, use document.extract_text instead. Returns: { pages: number, text: string } — text contains Markdown-formatted tables. Example prompts:
"Extract the tables from this financial statement."
"Pull the data table from this PDF into Markdown format."
"Get the tabular data from this form document."
| Name | Required | Description | Default |
|---|---|---|---|
| mime_type | Yes | MIME type of the document. Example: "application/pdf" for PDF bank statements, "image/jpeg" for photo of a form. | |
| document_base64 | Yes | Base64-encoded PDF or image bytes (max ~15 MB). Example: "JVBERi0xLjcNJeLjz9MNCj..." (truncated PDF base64) |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | Yes | |
| pages | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is known. The description adds value by disclosing the return format ({ pages, text } with Markdown tables) and input base64 encoding requirement, which is useful behavioral context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core description is concise and front-loaded, but the inclusion of three example prompts adds length. While these examples are useful, they could be trimmed without losing essential information. Overall, it remains efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool with clear input schema and output schema (signal indicates has output schema: true), the description is complete. It explains when to use, what to expect in the output, and provides examples, covering all necessary context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters fully. The description does not add significant parameter semantics beyond what the schema provides, such as reiterating base64 encoding but without new detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool extracts tables and forms as Markdown from PDFs or images, using a specific verb and resource. It also distinguishes from sibling tool document.extract_text by noting it's for plain prose documents, providing clear differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly specifies when to use the tool: 'Use when the document contains structured tabular data such as financial statements, data sheets, or forms.' It also names the alternative tool (document.extract_text) for prose documents, giving clear usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document.extract_textExtract TextARead-onlyIdempotent
Extract plain text from a PDF or image (base64-encoded). Use when you need raw text for downstream AI analysis (summarization, claim checking, structured extraction). For documents at a public URL, use url.extract instead (no base64 encoding needed). Returns: { pages: number, text: string } Example prompts:
"Extract the text from this scanned contract so I can search it."
"Give me the raw text from this PDF document."
"OCR this image and return the text content."
| Name | Required | Description | Default |
|---|---|---|---|
| mime_type | Yes | MIME type of the document. Example: "application/pdf" for PDFs, "image/png" for PNG screenshots. | |
| document_base64 | Yes | Base64-encoded PDF or image bytes (max ~15 MB). Example: "JVBERi0xLjcNJeLjz9MNCj..." (truncated PDF base64) |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | Yes | |
| pages | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description adds value by specifying the return shape ('Returns: { pages: number, text: string }') and indicating OCR capability for images. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, starting with the core action, followed by usage context, an alternative, the return format, and example prompts. The example prompts are slightly redundant but aid understanding. It is not overly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with 2 parameters and full schema coverage, the description covers purpose, usage, output shape, and an alternative tool. It does not mention error handling or size limits, but the schema includes the size limit, making the overall guidance adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage with descriptions and examples for both parameters. The description does not add significant parameter details beyond what the schema already states, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb+resource: 'Extract plain text from a PDF or image (base64-encoded).' It also distinguishes itself from the sibling tool url.extract by explicitly noting that URL-based documents should use that alternative, which avoids ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'Use when you need raw text for downstream AI analysis (summarization, claim checking, structured extraction).' It also names a concrete alternative for public URLs, fulfilling the when-not-to-use condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document.parse_invoiceParse InvoiceARead-onlyIdempotent
Parse a receipt or invoice document into structured fields. Uses a quality AI model for accuracy. Use when you need to extract line items, totals, and merchant info from financial documents. For general document text, use document.extract_text instead. Returns: { invoice: { merchant, date (YYYY-MM-DD), line_items[], subtotal, tax, total }, cited: { : { value, confidence: "high"|"medium"|"low", citations: [{ quote, paragraphs[] }] } } } Example prompts:
"Parse this invoice and give me the line items and total."
"Extract the merchant, date, and amounts from this receipt."
"Read this scanned invoice and return structured data."
| Name | Required | Description | Default |
|---|---|---|---|
| mime_type | Yes | MIME type of the document. Example: "application/pdf" for scanned invoice PDF, "image/jpeg" for a receipt photo. | |
| document_base64 | Yes | Base64-encoded PDF or image of the receipt/invoice (max ~15 MB). Example: "JVBERi0xLjcNJeLjz9MNCj..." (base64-encoded invoice PDF) |
Output Schema
| Name | Required | Description |
|---|---|---|
| cited | Yes | |
| invoice | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint and idempotentHint annotations, the description adds meaningful behavioral detail: it uses a quality AI model, returns confidence levels and citations, and shows the exact return structure. This goes well beyond the annotation-only baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized: purpose, usage guidance, return format, and example prompts. Every section adds value, and it remains concise despite the rich content, earning a top score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description fully covers purpose, usage, output schema (via the return structure), and examples. Combined with complete parameter schema and annotations, nothing is left ambiguous for the AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage with detailed descriptions and examples for both parameters. The description does not add param-specific semantics, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it parses receipts/invoices into structured fields, specifies the extracted data (line items, totals, merchant info), and distinguishes itself from document.extract_text. The verb and resource are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use when you need to extract line items, totals, and merchant info from financial documents' and directs users to document.extract_text for general text. Example prompts further clarify appropriate usage scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document.summarizeSummarize DocumentARead-onlyIdempotent
Summarize document text into a prose summary and key points with citations. Use after document.extract_text or url.extract when you need a condensed understanding of a long document. For single-sentence Q&A, use url.qa instead. For extracting specific fields, use document.extract_structured. Typical workflow: document.extract_text/url.extract → document.summarize. Returns: { summary: string, key_points: string[], summary_cited: { value, confidence, citations[] }, key_points_cited: [{ text, citations[] }], truncated: boolean, strategy: "full"|"truncated"|"chunked" } Example prompts:
"Summarize this financial report and give me the key points."
"What are the main takeaways from this document?"
"Give me a concise summary of this 50-page report."
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Document text to summarize. Obtain via document.extract_text or url.extract. Example: "The Q4 2025 financial report shows revenue growth of 23% year-over-year..." | |
| max_tokens | No | Input length cap (1 token ≈ 4 chars). Default ~3000 tokens. Truncates input, not output. Example: 4000 |
Output Schema
| Name | Required | Description |
|---|---|---|
| summary | Yes | |
| strategy | Yes | |
| truncated | Yes | |
| key_points | Yes | |
| summary_cited | Yes | |
| key_points_cited | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, lowering the bar. The description adds useful behavioral context beyond annotations: 'max_tokens' truncates input not output, and the return format includes 'truncated' and 'strategy' fields, describing how the tool handles long documents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and usage guidance. It is somewhat long due to the return structure and example prompts, but every section adds value. It remains well-organized and avoids unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for this tool: it provides workflow, alternatives, return structure, and example prompts. The presence of an output schema and annotations fills remaining gaps, so the description needs no additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The tool description repeats the schema's parameter descriptions but does not add significant new meaning; example prompts and return format are helpful for overall usage but not parameter-level semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Summarize document text into a prose summary and key points with citations.' It clearly distinguishes from siblings by noting 'For single-sentence Q&A, use url.qa instead' and 'For extracting specific fields, use document.extract_structured.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance is provided: 'Use after document.extract_text or url.extract when you need a condensed understanding of a long document.' It also states alternatives and a typical workflow, making the usage context unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job.statusGet Job StatusARead-onlyIdempotent
Poll the status of an async job (extract, indexing, batch). Free — no credits consumed. Use after collection.add_document or async extract to check when processing completes. Poll this endpoint in a loop until status is "complete" or "failed". Completed jobs include the bundle_id or result_json in the response. Jobs are created when you POST /v1/extract with a webhook, or when collection.add_document triggers async indexing. Returns: { id, type: "extract"|"extract_batch"|"index_collection", status: "queued"|"processing"|"complete"|"failed"|"cancelled", progress_pct: number (0–100), progress_message, bundle_id (when complete), result_json (when complete), error (when failed), created_at, completed_at } Example prompts:
"Check the status of my indexing job job_550e8400."
"Is my async extract job done yet?"
"Poll job [job_id] — what is the current progress?"
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Job ID (job_...) returned by async extract or collection.add_document. Example: "job_550e8400-e29b-41d4-a716-446655440000" |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| type | Yes | |
| error | Yes | |
| status | Yes | |
| bundle_id | Yes | |
| created_at | Yes | |
| result_json | Yes | |
| completed_at | Yes | |
| progress_pct | Yes | |
| collection_id | Yes | |
| progress_message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description adds meaningful behavioral context: it is a polling endpoint, free with no credits consumed, completed jobs include bundle_id or result_json, and it details status values and progress fields. This provides a full picture of how the tool behaves at runtime.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately sized but well-structured, with a clear explanation, a return format block, and example prompts. Minor redundancy exists (bundle_id mentioned twice), but overall it is organized and each section serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the description is thorough: it covers usage context, polling behavior, cost, return structure, and state transitions. The output schema is present, but the description independently explains the fields and statuses, making the tool fully understandable without external references.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers the single parameter (job_id) with a description and example. The description does not add additional parameter-specific semantics beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool polls the status of an async job, listing specific job types (extract, indexing, batch). It distinguishes itself from sibling tools by focusing on job status rather than data extraction or collection management, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use the tool: after collection.add_document or async extract, and to poll in a loop until complete or failed. It also mentions when jobs are created (POST /v1/extract with webhook, or add_document), and provides example prompts, giving clear usage context and no misleading alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipt.listList Action ReceiptsARead-onlyIdempotent
List signed action receipts (rcpt_...) for an evidence bundle owned by your API key. Free — no credits consumed. Use after bundle.get, bundle.verify, bundle.notarize, or collection.add_document to audit which agent actions were bound to which manifest hash. Pass a receipt_id from the results to receipt.verify for independent signature + manifest-binding verification. Returns: { bundle_id, receipts: [{ receipt_id, bundle_id, agent_id, action, manifest_sha256, signed_at, signature, signer_address, key_id, algorithm }], limit, offset } Example prompts:
"List all signed action receipts for bundle ev_550e8400."
"What agent actions have been recorded against this evidence bundle?"
"Show me the receipts for [bundle_id] so I can verify one."
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max receipts to return (default 50, max 200). Example: 50 | |
| offset | No | Pagination offset (default 0). Example: 0 | |
| bundle_id | Yes | Evidence bundle ID (ev_...) to list receipts for. Example: "ev_550e8400-e29b-41d4-a716-446655440000" |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| offset | Yes | |
| receipts | Yes | |
| bundle_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and idempotent, and the description adds 'Free — no credits consumed' which is a cost behavior not captured by annotations. It also clarifies that receipts are scoped to the caller's API key ('owned by'), an access control detail. This goes beyond the structured fields, though it stops short of discussing error conditions or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly written: a one-sentence purpose, a one-sentence usage context, a compact return structure, and three example prompts. Every sentence earns its place, and the structure front-loads the core purpose before adding workflow details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a read-only, idempotent annotation profile, a full parameter schema, and an output structure explicitly described in the text. The description covers purpose, when to use it, behavioral quirks (free, owned by API key), and the return format. For this simple list operation, the context is complete enough for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters (bundle_id, limit, offset) are already described in the input schema with examples, so the schema covers 100% of the parameter semantics. The description doesn't add any parameter-specific syntax or format details, but it does provide example prompts that reference bundle_id. Given the high schema coverage, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List signed action receipts...' which clearly states the verb and resource, scoped to 'an evidence bundle owned by your API key.' It distinguishes from sibling receipt.verify by noting that this tool lists receipts while verification is a separate step. This is a specific, well-differentiated purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use after bundle.get, bundle.verify, bundle.notarize, or collection.add_document' to audit which agent actions were bound to which manifest hash, providing clear when-to-use guidance. It also directs the user to pass a receipt_id to receipt.verify for independent verification, effectively naming the alternative for the next step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipt.verifyVerify Action ReceiptARead-onlyIdempotent
Independently verify a signed action receipt (rcpt_...) returned by bundle.get, bundle.verify, bundle.notarize, collection.add_document, or listed via receipt.list. Free — no credits consumed. Proves both that the receipt signature is authentic AND that the manifest_sha256 it was bound to still matches the bundle's current manifest — i.e. that the action was not performed against a stale or since-superseded document. Use for third-party audit of an agent's prior actions. Returns: { receipt_id, valid: boolean, signature_valid: boolean, manifest_matches_current: boolean, bundle_id, agent_id, action, manifest_sha256, signer_address, signed_at, tampered: string[] } Example prompts:
"Verify action receipt rcpt_550e8400 is authentic and still current."
"Was this receipt signed against the real document, or a stale copy?"
| Name | Required | Description | Default |
|---|---|---|---|
| receipt_id | Yes | Action receipt ID (rcpt_...) returned in the receipt field of another tool's response. Example: "rcpt_550e8400-e29b-41d4-a716-446655440000" |
Output Schema
| Name | Required | Description |
|---|---|---|
| valid | Yes | |
| action | Yes | |
| agent_id | Yes | |
| tampered | Yes | |
| bundle_id | Yes | |
| signed_at | Yes | |
| receipt_id | Yes | |
| signer_address | Yes | |
| manifest_sha256 | Yes | |
| signature_valid | Yes | |
| manifest_matches_current | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is known. The description adds valuable context: it is free, it checks two distinct conditions (signature validity and manifest currency), and the output includes a 'tampered' string array that flags any altered fields. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: it opens with the core purpose, then explains the verification logic, lists the return fields in a compact JSON shape, and ends with two example prompts. While a bit lengthy, every sentence carries useful information and the structure aids quick comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description effectively includes an output schema through the Returns block, covers the input parameter and its origin, explains the verification semantics, and provides example user prompts. Given the tool's moderate complexity and the presence of an output schema, the description is complete and leaves no major gaps for an agent to successfully invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% coverage with a description and example for receipt_id. The description further enriches meaning by explaining that the receipt ID is returned by specific sibling tools and appears in the format rcpt_..., which helps the agent map the parameter to real-world usage beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'verify' and identifies the exact resource ('signed action receipt') with the rcpt_ prefix. It distinguishes this tool from siblings by explaining that it proves both signature authenticity and current manifest match, which clearly differentiates receipt.verify from bundle.verify and other verification-like tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('Use for third-party audit of an agent's prior actions'), names all tools that produce the receipts (bundle.get, bundle.verify, etc.), and adds a cost-related guideline ('Free — no credits consumed'). This gives clear, actionable context for when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
url.extractExtract Text from URLARead-only
Fetch a public HTTPS URL and return extracted text and page metadata. Lean mode — no evidence bundle stored, no bundle_id returned. Use for raw text extraction from web pages and online documents. Use url.summarize for summaries, url.qa for Q&A, url.translate for translation, document.extract_text for base64 file uploads. Returns: { url, title, word_count, text, final_url (after redirects) } Example prompts:
"Extract the text from https://example.com/report.pdf for me."
"Get me the raw content of this web page: [URL]."
"Pull the text from this online article so I can analyze it."
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public HTTPS URL to fetch and extract. Example: "https://example.com/report.pdf" or "https://blog.example.com/article" |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| text | Yes | |
| title | No | |
| final_url | No | |
| word_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds behavioral nuance: lean mode, no evidence bundle stored, no bundle_id returned, and final_url after redirects. It also restricts to public HTTPS URLs, which is useful context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core function, then provides alternatives, return structure, and example prompts. It is well-structured, with each section earning its place and no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read-only tool, the description covers purpose, usage boundaries, return format, and example prompts. With output schema and annotations present, nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers the single url parameter with a description and example (100% coverage). The description reinforces the HTTPS requirement and provides example prompts, but adds little else beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb+resource: 'Fetch a public HTTPS URL and return extracted text and page metadata.' It distinguishes from sibling tools by naming alternatives for summaries, Q&A, translation, and file uploads, making the tool's unique role explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly directs when to use this tool vs alternatives: 'Use url.summarize for summaries, url.qa for Q&A, url.translate for translation, document.extract_text for base64 file uploads.' It also notes the lean mode with no bundle storage, implying a lightweight use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
url.qaAsk a Question About a URLARead-only
Fetch a public HTTPS URL and answer a specific question about its content. Lean mode — no bundle stored. Use when you have a precise question about a web page. For a broad summary, use url.summarize. For multi-document Q&A, use collection.ask instead. Returns: { url, answer, answer_cited: { value, confidence, citations[] }, confidence: "high"|"medium"|"low", truncated } Example prompts:
"What is the refund policy at https://docs.example.com/policy?"
"Look at [URL] and tell me what the delivery terms are."
"Answer this question based on the content of [URL]: [question]."
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public HTTPS URL to fetch and question. Example: "https://docs.example.com/policy" | |
| question | Yes | Specific question to answer from the page content. Example: "What is the refund policy?" | |
| max_tokens | No | Input length cap (1 token ≈ 4 chars). Truncates fetched page content, not the answer. Example: 4000 |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| answer | No | |
| truncated | Yes | |
| confidence | No | |
| answer_cited | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=true, while the description adds behavioral details such as 'Lean mode — no bundle stored' and the 'truncated' field in the return value, indicating potential truncation. This goes beyond annotations, though it omits failure modes or rate limits, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear action statement, usage guidance, return format, and example prompts. It is front-loaded with the core purpose and every sentence adds value. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward fetch-and-answer tool, the description covers: what it does, when to use it, alternatives, return value structure, and example invocations. Output schema exists, but the description still explains the return fields. No significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add parameter-level details beyond the schema, but it includes example prompts that illustrate parameter usage. The schema already explains max_tokens truncation behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Fetch a public HTTPS URL and answer a specific question about its content.' It differentiates from siblings by explicitly naming url.summarize and collection.ask as alternatives, and adds 'Lean mode — no bundle stored' to set it apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: 'Use when you have a precise question about a web page.' It also gives clear exclusions and alternatives: 'For a broad summary, use url.summarize. For multi-document Q&A, use collection.ask instead.' This is high-quality differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
url.summarizeSummarize URLARead-only
Fetch a public HTTPS URL and return a prose summary with key points. Lean mode — no bundle stored. Use when you need a condensed understanding of a web page. For raw text, use url.extract. For asking a specific question about a page, use url.qa. Returns: { url, summary, key_points: string[], truncated: boolean, word_count } Example prompts:
"Summarize https://en.wikipedia.org/wiki/Artificial_intelligence for me."
"Give me the key points from this blog post: [URL]."
"What is this article about? Summarize [URL]."
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public HTTPS URL to fetch and summarize. Example: "https://en.wikipedia.org/wiki/Artificial_intelligence" | |
| max_tokens | No | Input length cap (1 token ≈ 4 chars). Truncates fetched page content, not the output summary. Example: 4000 |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| summary | No | |
| truncated | Yes | |
| key_points | No | |
| word_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds useful context: 'Lean mode — no bundle stored' clarifies lack of persistent side effects, and the return shape is described. It doesn't mention rate limits or error handling, but these are less critical for a read-only fetch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized: first sentence states the core function, then usage guidance, return format, and example prompts. Every sentence earns its place with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given two parameters fully explained in the schema, annotations covering read-only and open-world, and an output schema, the description provides sufficient context: it explains when to use it, what it returns, and how to formulate prompts. It is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both 'url' and 'max_tokens' well-documented. The description provides example prompts that illustrate usage but adds no new parameter semantics beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific action ('Fetch a public HTTPS URL') and output ('prose summary with key points'), clearly distinguishing it from sibling tools url.extract and url.qa. It also mentions the return structure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool ('Use when you need a condensed understanding of a web page') and provides direct alternatives: 'For raw text, use url.extract. For asking a specific question about a page, use url.qa.' This is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
url.translateTranslate URLARead-only
Fetch a public HTTPS URL and return its content translated into a target language. Lean mode — no bundle stored. Use when you need to understand web content in a different language. For extracting raw untranslated text, use url.extract instead. Returns: { url, translated_text, target_lang, truncated } Example prompts:
"Translate https://example.de/artikel into English for me."
"Translate this German article into Spanish: [URL]."
"Fetch [URL] and give me the French translation."
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public HTTPS URL to fetch and translate. Example: "https://example.de/artikel" | |
| max_tokens | No | Input length cap (1 token ≈ 4 chars). Truncates fetched page content before translation. Example: 4000 | |
| target_lang | Yes | ISO 639-1 language code for the target language. Example: "es" for Spanish, "fr" for French, "de" for German, "ja" for Japanese, "zh" for Chinese |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| truncated | Yes | |
| target_lang | Yes | |
| translated_text | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and openWorldHint=true. The description adds meaningful behavioral context beyond that: 'Lean mode — no bundle stored' (clarifies side effects), 'public HTTPS URL' (constrains input), and the return shape including 'truncated' (indicates possible content truncation). This goes beyond simply restating the annotations, though it does not cover every possible behavior like rate limits or auth, which is acceptable given the read-only nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and reasonably sized: core function in the first sentence, followed by behavior, usage guidance, return shape, and examples. Every sentence contributes value, and the examples are useful for an agent. It is slightly longer than the minimal two-sentence example, but the extra content (alternatives, return structure, examples) is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 parameters, output schema present, annotations present), the description is quite complete. It covers what the tool does, when to use it, an alternative, key behavioral traits, and return structure. The only minor omission is explicit mention of max_tokens, but the schema fully documents that, so the overall completeness is high.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with all three parameters (url, max_tokens, target_lang) documented with types, descriptions, and examples. The description itself does not add additional parameter semantics beyond what the schema already provides, so the baseline of 3 applies. The example prompts indirectly illustrate how to use url and target_lang, but this is marginal additional value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Fetch a public HTTPS URL and return its content translated into a target language.' It uses a specific verb ('fetch', 'return') and resource ('content translated'), and distinguishes itself from the sibling url.extract by explicitly noting it provides raw untranslated text. This makes the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance: 'Use when you need to understand web content in a different language' and provides a concrete alternative for a different need: 'For extracting raw untranslated text, use url.extract instead.' This satisfies the when/when-not/alternatives criterion fully.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
22 tool updates
v0.2.1- First observed
account.quota - First observed
bundle.get - First observed
bundle.notarize - First observed
bundle.verify - First observed
collection.add_document - First observed
collection.ask - First observed
collection.create - First observed
collection.list - First observed
collection.search - First observed
document.check_claims - First observed
document.extract_structured - First observed
document.extract_tables - First observed
document.extract_text - First observed
document.parse_invoice - First observed
document.summarize - First observed
job.status - First observed
receipt.list - First observed
receipt.verify - First observed
url.extract - First observed
url.qa - First observed
url.summarize - First observed
url.translate
TDQS
Each tool has a clearly distinct purpose, with specific resource-action pairs (bundle, document, collection, url, receipt, job, account). Overlapping tools like document.extract_text and url.extract are explicitly differentiated by input type (base64 vs URL), and cross-references guide selection. No two tools appear to do the same thing.
All tools follow a consistent `resource.action` pattern with lowercase and dots, and multi-word actions use snake_case (e.g., `extract_text`, `add_document`). The naming is uniform and predictable across all resources, making it easy to infer the function of an unfamiliar tool.
With 22 tools, the set is slightly above the typical 3-15 range, but each tool earns its place given the multi-faceted domain (document extraction, URL analysis, bundle management, collections, receipts, jobs, account). No redundant tools exist; the count feels justified rather than bloated.
The tool surface covers core document intelligence workflows (extract, parse, summarize, check claims, structured extraction), URL operations, bundle verification and notarization, collection management with RAG Q&A, receipt audit, async job monitoring, and account quota. Minor gaps include lack of explicit bundle creation/deletion and collection deletion, but these are likely handled outside this server or are intentionally omitted.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
AI document intelligence: extract, summarize, claim-check, notarize, and signed action receipts.
Pay-per-call (x402/USDC-Base) web + crypto data tools for AI agents: audit, extract, crypto, DeFi.
Verified extraction: source-backed JSON from PDFs/URLs; honest null + signed receipt.
Web search and URL-to-markdown for agents. Pay per call in USDC on Base, no signup.
Related MCP Servers
- FlicenseBqualityNot gradedmaintenanceHeadless document processing for AI agents. Invoice extraction, contract analysis, and Dutch business verification. Pay-per-use via X402 on Solana. No API keys needed.101-
- AlicenseAqualityCmaintenanceGive your AI agent PDF summarization, code review, translation, web extraction, document comparison, and persistent memory — all paid autonomously via Bitcoin Lightning.20MIT
- FlicenseNot gradedqualityAmaintenanceVerifiable document intelligence for AI agents. Extract, summarize, claim-check, and notarize PDFs & URLs with cryptographic proofs, cross-document search, and on-chain attestation via Base L2.-
- AlicenseNot gradedqualityCmaintenanceProvides AI agents with comprehensive document parsing capabilities including PDF text extraction, OCR, HTML-to-markdown conversion, table extraction, and summarization, optimized for agent workflows.65MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sawftware-apps/docimprint-sdk'
If you have feedback or need assistance with the MCP directory API, please join our Discord server