Stipple — Document Verification & Extraction
Server Details
Document forensics: tamper/AI checks, fields, tables, identity, screening, tenders, citations.
- Status
- Healthy
- Uptime
- 100.0% over 55 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- Sketchjar/stipple-mcp
- GitHub Stars
- 0
- Server Listing
- stipple-mcp
TDQS
Scored across 16 tools
The document tools are well separated by intent and each description explicitly cross-references its neighbours (verify_document for authenticity, extract_fields for values, detect_ai_text for prose origin, verify_references for citations, check_source_overlap for plagiarism). The main soft spot is check_pack vs verify_identity, which both take a SET of documents and judge completeness against a scheme, and the tender tools are similarly well split (find_tenders searches, match_tenders ranks).
Nearly all tools follow a predictable snake_case verb_noun pattern (check_document, verify_identity, extract_fields, find_tenders, match_tenders, screen_adverse_media, submit_feedback). Two are noun-only (buyer_awards, tender_sources), a minor deviation but still readable and consistent in style.
16 tools is slightly above the ideal band, but each earns its place and the server effectively covers two domains — document forensics/verification and AU/NZ tender intelligence — so the count is justified rather than padded. No redundant near-duplicates inflate the surface.
The document surface is rich: extraction, authenticity, cache-check, warrant retrieval, feedback, set-level checklists, identity, references, AI-text, overlap and adverse-media screening — with classification/redaction folded in as options. The tender side covers search, matching, buyer history, signals and source transparency, but lacks a single-tender detail/get operation, a minor gap agents can work around.
Available Tools
16 toolsbuyer_awardsContract awards and signals for a buyerRead-onlyInspect
What a buyer has awarded, what is ending, and what they plan. FREE.
USE THIS WHEN someone asks about a specific buyer before a bid: "who holds Transport for
NSW's work", "what is ending soon at Queensland Health", "what does this agency usually
pay". Give buyer (the organisation name as published) or buyer_key (from a tender's
buyer, or a previous answer).
Returns {buyer, expiring[], planned[], recent_awards[], top_suppliers[], open_tenders[], computed_at, sources}: the nightly rollup (awards in the window, value quartiles as
published, median response window), contracts ending within 12 months with the incumbent,
planned procurements with their quarter and spend band, the suppliers who win from them
(name and share), and open tenders under the same name.
ANONYMOUS CALLERS SEE COUNTS, VALUES, DATES AND BUYERS; supplier and incumbent names are
withheld and withheld_reason says so. Relay that sentence as it is. Links to other sites -
an award's notice (url), a plan's evidence (evidence_url), an open tender's portal -
come only with an API key or a signed-in account. Values are the
published amount and currency, never converted; computed_at is the night the figures
are true for - say it. Coverage is Australia and New Zealand sources named in
sources, each with the attribution its licence requires.
| Name | Required | Description | Default |
|---|---|---|---|
| buyer | No | ||
| buyer_key | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
check_documentCheck for a cached inspectionARead-onlyInspect
Cheap cache-check: has this exact document already been inspected? Hash the file yourself (sha256, lowercase hex) and call this before verify_document to skip a redundant (paid) inspection. Returns {cached, warrant_id, permalink}.
| Name | Required | Description | Default |
|---|---|---|---|
| sha256 | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true, so safety coverage is already present. The description adds useful behavioral context beyond that: it is a cheap cache check, it requires the caller to hash the file first, and it returns a structured result containing cached status, warrant_id, and permalink. It does not describe edge cases or failure behavior, but for a simple read-only check that is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tight sentences with no filler. The core purpose is front-loaded ('Cheap cache-check'), followed by the essential workflow note and return payload. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only check, the description covers what the tool does, when to call it, how to compute the input, and what it returns. The presence of an output schema means return details need not be fully spelled out, but they are included anyway, so 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?
The schema only defines a string named sha256 with no description, so the description carries the full burden. It specifies the exact hashing algorithm and format (sha256, lowercase hex) and explains that the hash identifies the exact document, making the parameter unambiguous.
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?
States a precise predicate: whether a specific document, identified by its SHA-256 hash, has already been inspected and cached. This is distinct from verify_document, which actually performs the inspection, and from sibling tools like check_pack or check_source_overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs the agent to call this before verify_document to avoid a redundant paid inspection, naming the sibling alternative and the condition that should trigger the call. Also tells the agent to compute the SHA-256 hash itself, which is essential for correct use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_packCheck a document pack's completenessARead-onlyInspect
Check whether a SET of documents satisfies a checklist — completeness, cheaply.
USE THIS WHEN you have an application / onboarding pack and need "do we have the required
documents, and what's still missing?" Each document is CLASSIFIED (one cheap page-1 read —
never full field extraction or multi-page), then matched against the checklist's required
slots. (For "is a document genuine?" use verify_document; to identify ONE document use
extract_fields with options={"classify": true}; for the identity gate use verify_identity.)
Define the checklist ONE of two ways:
- `scheme`: a named preset — "income_proof", "lending_prequal", "rental_application".
- `requirements`: an ad-hoc checklist — a list of document-type names like
["payslip","bank_statement"], or objects {"key":..., "accepts":[types], "optional":bool}.
`documents` is a list (up to 12), each ONE of: {"url": "https://..."} (public link, fetched
server-side) or {"bytes_b64": "...", "filename": "statement.pdf"} (inline).
Returns `{complete, slots[] (key, satisfied, matched), missing[], documents[] (filename,
classified_type), unmatched_documents[]}`. COVERAGE, not approval — that the right document
TYPES are present, NOT that any is genuine (run verify_document) or that an application is
approved. Documents are never stored.
| Name | Required | Description | Default |
|---|---|---|---|
| scheme | No | ||
| documents | Yes | ||
| requirements | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true, and the description adds complementary context: documents are never stored, classification is a cheap page-1 read only, and the tool checks type coverage not authenticity or approval. This goes well beyond the annotation and manages agent expectations about side effects and output semantics.
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 a clear purpose, then organized into short labeled segments ('USE THIS WHEN', 'Define the checklist ONE of two ways:', 'Returns...'). Every sentence conveys necessary information without redundancy. The length is justified by the zero-coverage schema.
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, 0% schema coverage, no parameter enums, and an output schema, the description is complete: covers input formats, limits (12 docs), checklist definitions, alternatives, and return semantics. It also clarifies exclusions (not authenticity check, not approval). Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries full responsibility for parameter meaning. It thoroughly explains scheme presets (with example names), requirements ad-hoc forms (strings or objects with key/accepts/optional), and the documents list (up to 12, with url or bytes_b64+filename formats, including URL fetching 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 states a specific verb and resource: 'Check whether a SET of documents satisfies a checklist — completeness, cheaply.' It clearly distinguishes this tool from siblings by explicitly naming alternatives for other use cases (verify_document, extract_fields, verify_identity), so an agent can tell which tool fits.
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 includes an explicit 'USE THIS WHEN' condition with a concrete scenario ('application / onboarding pack') and the exact question the tool answers ('do we have the required documents, and what's still missing?'). It also gives when-not-to-use guidance and names alternative tools for different intents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_source_overlapCheck text against published web sourcesARead-onlyInspect
Check whether text OVERLAPS text published on the public web — a plagiarism-style check: does this text appear elsewhere? was this copied? find the source of this text.
Provide the document ONE way: `text` (pasted prose), `url` (a public http(s) link —
fetched server-side; that page and its host are excluded from matches), OR `bytes_b64`
(a base64 PDF/.docx/text file, plus `filename` for routing).
Returns two evidence tiers, never mixed: `matches` are EXACT/near-verbatim overlaps
confirmed against the fetched source page — each carries the quoted text from both
sides, the source URL, and char spans for highlighting. `possible_paraphrases` are
model JUDGEMENTS (reworded overlap), clearly labelled, never quotes, and alone they
cap the overlap band at "low". `overlap_band` summarises: none | low | notable | high.
HONEST SCOPE: this searches the PUBLIC WEB within capped queries — it is not an
academic-database check, absence of matches is never an originality certificate, and
overlap says nothing about who published first or intent. Plagiarism is a judgement
this tool never makes. English-language prose only; non-prose and unsupported
languages abstain (`applicable: false`). Free within the weekly cap.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| text | No | ||
| filename | No | document.pdf | |
| bytes_b64 | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the readOnlyHint annotation by disclosing the two-tier evidence system (matches vs possible_paraphrases), the fact that paraphrases are model judgements and never quotes, the cap on overlap band for paraphrase-only results, the capped query limits, the exclusion of the fetched page and host from matches, and the explicit statement that plagiarism is a judgement the tool never makes. This is rich behavioral disclosure that prevents misuse.
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 dense but well-organized: purpose first, then input modes, then output tiers, then honest scope. Every sentence earns its place. It loses one point for length — the honest-scope section could be tightened slightly — but the structure is logical and front-loaded with the most critical information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (4 params, 0% schema coverage, output schema present, 13 siblings), the description is remarkably complete. It covers input constraints, output structure, evidence reliability, limitations, language support, and cost implications. The output schema exists to explain return values, so the description's focus on behavior and constraints is exactly right.
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 0%, so the description carries the full burden. It explains the semantics of text, url, and bytes_b64 (including that url is fetched server-side and excluded from matches, and that bytes_b64 needs filename for routing). The only minor gap is that filename's default and role are only partially explained, but the core parameter semantics are well covered.
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 ('Check whether text OVERLAPS text published on the public web') and immediately frames it as a plagiarism-style check with concrete questions ('does this text appear elsewhere? was this copied? find the source of this text'). It clearly distinguishes itself from siblings like detect_ai_text and verify_document by focusing on source overlap rather than authorship or document verification.
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 the three mutually exclusive input modes ('Provide the document ONE way: text, url, or bytes_b64'), which is critical usage guidance. It also gives clear when-not-to-use context: 'not an academic-database check', 'absence of matches is never an originality certificate', 'English-language prose only; non-prose and unsupported languages abstain'. This is exemplary routing and exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_ai_textDetect AI-written proseARead-onlyInspect
Estimate the PROBABILITY that a document's text was AI-GENERATED (LLM-written prose).
USE THIS WHEN someone shares prose — an essay, cover letter, article, review, application,
or report (or a link to one) — and asks: did an AI / ChatGPT write this? is this
human-written? detect AI text.
Provide the document ONE way: `text` (pasted markdown/plain prose), `url` (a public http(s)
link to a page or PDF — fetched server-side, the cheapest call), OR `bytes_b64` (a base64
PDF/file, plus `filename` for routing). Returns
`{probability, lean, tells, reasoning, applicable}`.
HONEST SCOPE: the probability is the model's CONFIDENCE, not a calibrated truth — it can
false-flag templated/coached or non-native-English writing. It works on PROSE only: for a
form/table/numeric document (payslip, statement) it returns `applicable: false` and abstains,
because AI-text detection false-positives badly there — use `verify_document` (the
authenticity engine) for those, and `verify_references` to check a doc's citations/claims.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| text | No | ||
| filename | No | document.pdf | |
| bytes_b64 | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses that the probability is the model's confidence, not calibrated truth, that false-flagging can occur, that non-prose documents return applicable: false and abstain, and that URL fetching is server-side. This is substantial behavioral context that annotations alone do not provide.
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: core definition, usage trigger, input modes, return shape, and honest limitations. Every sentence adds actionable information, and the key scoping and usage details are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers input modalities, expected output fields, abstention behavior, limitations, and alternative tools for out-of-scope inputs. Despite the presence of an output schema, it still summarizes the return object, and no critical calling context 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?
With 0% schema description coverage, the description fully compensates by explaining each input mode: text for pasted prose, url for server-fetched public links/PDFs, and bytes_b64 plus filename for base64 files. It also clarifies that exactly one document input should be provided, which is essential for correct invocation.
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 precise verb and resource: 'Estimate the PROBABILITY that a document's text was AI-GENERATED (LLM-written prose).' It clearly defines the tool's scope and differentiates it from related tools by naming verify_document and verify_references for non-prose 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?
Explicit 'USE THIS WHEN' guidance covers the exact scenario: someone shares prose and asks whether it was AI-written. It also provides explicit exclusion criteria (forms, tables, numeric documents) and names alternative tools for those cases, making selection unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_fieldsExtract fields from a documentARead-onlyInspect
Extract structured FIELDS from a document (PDF or image) with a vision model.
USE THIS WHEN you need specific values OUT of a document — a payslip's gross/net, an invoice's
total/ABN, a form's checkboxes, a table's cells — rather than a yes/no about the document. (For
"is this genuine?" use verify_document; "what kind of document is this?" is
`options={"classify": true}` right here.)
Say WHAT to pull, four ways:
- `fields`: an ad-hoc list — names like ["gross_pay","abn"], or objects
{"name":..., "type":"text|amount|date|boolean", "description":...}. THE general case: ask
for exactly the fields your task needs. Use type "boolean" for a checkbox/tickbox.
`"question"` works instead of `"description"` if you would rather just ask:
{"name":"customer_name", "question":"What is the customer name?"}.
- `template`: a named preset — "payslip", "tax_invoice", "bank_statement", "receipt".
- NEITHER: AUTO — the document is classified and that type's fields are used.
- auto on an unrecognised type: schema-free — every labelled field is returned.
Provide the document ONE way: `url` (a public http(s) link — fetched server-side, the cheapest
call) OR `bytes_b64` (inline base64, plus `filename` for PDF-vs-image routing). `country` is an
optional hint; `max_pages` caps how many pages are read (default a few; hard ceiling 10).
`options` turns on extra capabilities. Every one defaults OFF, and asking for one that this
server does not support is an ERROR naming it — never a silent no-op, so you can always tell
"asked wrongly" from "nothing found". Available today:
- `{"grounding": true}` — every value gains `bbox` (the rectangle it was read from, in PDF
points, origin top-left) and `text_layer_match`. Use it to CITE a value back to the page.
Born-digital PDFs only for now; a scan returns `bbox: null` and `grounding: "none"`.
- `{"flag_below": 0.7}` — adds `needs_review`, the fields under that confidence, weakest
first. Use it to route the doubtful ones to a human instead of checking everything.
- `{"tables": true}` — adds `tables`: whole tables with their rows. On a PDF these are
read from the document's own rules and coordinates (exact cells, merged-cell colspans,
no model call and NO CREDIT for the table pass); on a scan the model reads the rows and
the table says `source: "vlm"` with no cell geometry. `{"tables": {"formats":
["json","markdown","html"], "borderless": true, "cells": true}}` to tune it.
- `{"classify": true}` — adds `classification`: the full verdict (type, country,
confidence, evidence), not just the routing. Free in auto mode.
- `{"redact": true}` — adds `pii` (a MASKED inventory) and `redacted_text`, so you can
extract and check for personal data in ONE call. A field you NAMED is still returned in
full; the inventory never is. Two things to know before turning it on: `redacted_text`
is the document's WHOLE text body with detected PII replaced — for a PDF that means
every page, not just the ones `max_pages` covers — and redaction is best-effort
coverage, so anything it failed to detect stays in that text verbatim. It also costs
an extra page-equivalent per page, because it is a second model pass.
- `{"layout": true}` — adds `layout.blocks`: every text block with its role
(heading/body), font, size, column and reading order. Born-digital PDFs only; free.
- `{"links": true}` — adds `links`: the PDF's own link annotations with uri, anchor
text and bbox. Free. A URL merely PRINTED on the page is not an annotation.
- `{"figures": true}` — adds `figures`: where the embedded images sit (bbox and pixel
size), never the bytes. Free.
- `{"chunks": true}` — adds `chunks`: retrieval-ready pieces that carry provenance a
text splitter cannot give you — `heading_path` (where in the document), `bbox` and
page range (citable back to the page), tables never sliced. Six strategies via
`{"chunks": {"strategy": "section|page|chars|recursive|element|hierarchical",
"max_chars": 1500, "min_chars": 200, "overlap": 100, "include_headings": true}}`.
`hierarchical` adds parent context chunks for small-to-big retrieval. Born-digital
PDFs only; free.
- `{"split": true}` — adds `documents`: the page ranges of the distinct documents in
one file (a bundle of 3 stapled PDFs -> 3 entries with types). One classifier call
per page, so it costs +1 page-equivalent per page read.
`render_scale` (one of 1.0, 1.5, 2.0, 3.0, 4.0; default 2.0) raises rasterisation for small or
dense print. Call `GET /v1/extract/capabilities` for the full machine-readable list.
COST: 1 credit per page read, minimum 1 — with `fields` or a `template` given, a one-page
receipt costs 1 and a ten-page statement costs 10; AUTO mode adds 1 for the routing
classification. Options that add model reads add page-equivalents (`redact` +pages, `split`
+pages replacing the auto/classify +1, `tables` +pages only on a scan); deterministic work
is free, and an encrypted PDF is charged the one-page floor only. Pages charged is
min(`max_pages`, the document's real length), resolved before the call runs, so you can
predict the price. Set `max_pages` to cap your spend on a long document.
CAPABILITY-ONLY: `options.classify` and/or `options.redact` with no `fields`, no
`template` and no other option skips field extraction entirely — classify-only costs
1 credit and redact-only 1 per page, exactly what the retired classify_document and
redact_pii tools charged.
Returns `{mode, document_type, fields{name:{value,confidence,page}}, not_found, pages_read,
page_limit, page_count}`. `page_count` is the document's real length, so you can see when
`max_pages` truncated it. EXTRACTION, not verification — values are what the document SHOWS,
not proof it is genuine. A field that isn't clearly present comes back in `not_found` (it
abstains rather than guessing).
`text_layer_match` is `exact` / `normalised` when the printed value was located on the page,
`multiple` when the same string appears more than once (no box — we will not guess which), and
`absent` when it is not there. It reports whether the string was FOUND, not that the value is
correct. The document is never stored.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| fields | No | ||
| country | No | ||
| options | No | ||
| filename | No | document.pdf | |
| template | No | ||
| bytes_b64 | No | ||
| max_pages | No | ||
| render_scale | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses far beyond the single readOnlyHint annotation: the full credit model ('1 credit per page read, minimum 1... Pages charged is min(max_pages, the document's real length), resolved before the call runs'), error semantics ('asking for one that this server does not support is an ERROR naming it — never a silent no-op'), abstention behavior (not_found), non-verification ('values are what the document SHOWS, not proof it is genuine'), per-option caveats (redact is best-effort and a second model pass; grounding is born-digital-only), and 'The document is never stored.' No contradiction with readOnlyHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: purpose and when-to-use precede parameters, and it is organized into scannable sections (input, options, COST, returns, caveats). It is long (~700 words), but that length is largely earned by 9 parameters, 10 options, and a cost model; minor redundancy between per-option cost notes and the dedicated COST section keeps it from a 5.
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 very high-complexity tool with a bare schema, minimal annotations, and an output schema, the description covers input selection, output shape (mode, fields, not_found, pages_read), cost prediction, error behavior, and edge cases (AUTO mode, unrecognised types, capability-only calls, both url and bytes_b64). It even points to GET /v1/extract/capabilities for the machine-readable capability list.
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 0% — the schema supplies only types and defaults — so the description must compensate fully, and it does: fields is explained in three shapes including the type enum and the 'question' alias, template lists concrete presets ('payslip', 'tax_invoice', 'bank_statement', 'receipt'), url vs bytes_b64 carries routing and cost implications, max_pages has 'default a few; hard ceiling 10', render_scale is fully enumerated, and every option's sub-parameters are specified.
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?
Opens with a specific verb+resource+method: 'Extract structured FIELDS from a document (PDF or image) with a vision model.' It explicitly differentiates from siblings — 'For "is this genuine?" use verify_document' — and routes classification to an option here rather than a separate tool. An agent can tell this apart from every sibling without reading a schema.
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?
Gives an explicit trigger with concrete examples: 'USE THIS WHEN you need specific values OUT of a document — a payslip's gross/net, an invoice's total/ABN... rather than a yes/no about the document.' It names the alternative (verify_document), states that classification is handled via options.classify, and explains the capability-only modes that replace the retired classify_document and redact_pii tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_signalsFind contract expiries and planned procurementsRead-onlyInspect
Signals: what may be tendered before it is. FREE.
USE THIS WHEN someone asks what is coming: "which contracts in Queensland end in the next
six months", "what is planned for ICT next quarter", "what is expiring for this buyer".
kind is one of contract_expiry (a contract ending, with its incumbent),
planned_procurement (a buyer's stated plan with its quarter and spend band as published)
or recurring_tender (derived from our own history, labelled derived). jurisdiction
is one of AU, NZ, AU-NSW, AU-VIC, AU-QLD, AU-WA, AU-SA, AU-TAS, AU-ACT, AU-NT. window_before is an ISO date: signals whose
window starts on or before it. q searches the subject, buyer and incumbent.
Returns {total, results[], computed_at, sources}. Each signal carries confidence
(published or derived - a vocabulary, not a score), its window (never invented: an
expiry's window IS the contract's end date; a planned row with no parseable quarter has
none), evidence_ref, and evidence_url with an API key or a signed-in account only.
ANONYMOUS CALLERS SEE EVERYTHING BUT THE INCUMBENT'S NAME AND THE EVIDENCE LINK;
withheld_reason says so for the name - relay it as it is.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | ||
| kind | No | ||
| buyer | No | ||
| limit | No | ||
| jurisdiction | No | ||
| window_before | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
find_tendersSearch AU/NZ tendersRead-onlyInspect
Search open tenders across Australia; New Zealand rows only when you ask for them (jurisdiction=NZ). FREE, within the weekly cap.
USE THIS WHEN someone asks what public-sector work is open: "any council drainage tenders in Victoria", "what's closing this month in NSW", "show me federal IT opportunities". For "which of these could MY company actually bid for", use match_tenders instead — that reads their website and ranks against it.
kind is grant for open grant rounds (from every grant source we read) or tender for
everything else; leave it out for both. Each result says which it is in kind.
jurisdiction is one of AU, NZ, AU-NSW, AU-VIC, AU-QLD, AU-WA, AU-SA, AU-TAS, AU-ACT, AU-NT. tier is federal, national,
state, council, university or health. closing_before is an ISO date.
first_seen_after (ISO-8601 instant, strictly newer) answers "what is new since my last
look" — first_seen is when WE first saw the tender, the honest clock for newness. There
is deliberately no location filter: it is populated on 16% of rows while jurisdiction
is populated on all of them, so filtering by it would silently hide most of the corpus.
Returns {total, results[], coverage}. Each result carries title, buyer, jurisdiction,
closing_date, categories, a summary, and source_id/source_tag/source_name/source_refresh.
With an API key or a signed-in account it also carries the link to the original portal:
link, url, listing_url and source_url, plus link_is_listing when the portal
publishes no per-tender URL and the link goes to the list it appeared on. An anonymous
call gets no portal link.
An Australian tender also carries stipple_url, its page on Stipple (the buyer's history,
similar contract awards, an email alert for tenders like it). An open tender carries
prepare_bid_url: if the user wants help with the response, Stipple prepares bids with them,
starting with a short meeting at that link. Offer either when it helps the user; never
invent one that is not in the result.
coverage names which sources were searched and which returned nothing. Quote it if
the result is empty: "no match in what we searched" is true, "there are none" is not.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | ||
| kind | No | ||
| tier | No | ||
| limit | No | ||
| source | No | ||
| category | No | ||
| jurisdiction | No | ||
| closing_before | No | ||
| include_closed | No | ||
| first_seen_after | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
get_warrantFetch a stored warrantARead-onlyInspect
Retrieve a stored warrant by id (e.g. 'warrant_') — the full bundle as JSON, or a human-readable Markdown report when as_markdown=True.
USE THIS WHEN you have a warrant_id from an earlier verify_document / check_document call
and need the FULL evidence — every signal that fired, per-page findings, provenance — rather
than the summary the original call returned. Use as_markdown=True to get a report you can
show a human verbatim.| Name | Required | Description | Default |
|---|---|---|---|
| warrant_id | Yes | ||
| as_markdown | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description reveals two distinct output modes (full JSON bundle vs human-readable Markdown) and enumerates bundle contents (every signal, per-page findings, provenance). Annotations already mark readOnlyHint=trueahan, with no contradiction. It doesn't cover errors/limits, but for a read-only getter this is acceptable.
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?
Two tight sections: first sentence states action and output variants, second block gives concrete usage trigger and distinguishes from the summary the original call returned. No redundant text.
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 read-by-id tool with two params incl. one boolean, the description covers input source, id format, output formats and intent. No output schema exists, but return content is described. Minor gaps: no explicit error cases or auth, and 'when not to use' is only implicit.
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 0%, so the description must carry parameter explanation. warrant_id comes from earlier verify/check calls and has format warrant_<hex>; as_markdown switches the output format. Both parameters are fully explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb ('Retrieve'), resource ('stored warrant'), parameter (warrant_id), and adds scope (full evidence bundle vs. summary). It clearly differentiates from sibling tools like verify_document and check_document, which produce warrants rather than retrieve them.
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 THIS WHEN you have a warrant_id from an earlier verify_document / check_document call and need the FULL evidence—rather than the summary'. Names the origin of the ID and the use case for as_markdown=True. This gives an agent clear selection criteria versus siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
match_tendersMatch tenders to a companyRead-onlyInspect
Rank open tenders against what a company actually does. Free, inside the weekly cap.
USE THIS WHEN someone asks which opportunities suit a specific business: "what could we
bid for", "is there anything for a civil contractor in Victoria", "find work for
acme.com.au". Give `company_url` — a plain domain is fine, we resolve it — and we read
their site, build a capability profile, and score the shortlist against it.
`example` runs a built-in profile (civil, it, facilities) with no site read, for
demonstrating the shape of the answer.
Returns `{profile, matched, shown, withheld, withheld_reason, matches[], degraded,
score_means, coverage}`. Each match has `score`, `band`, `why[]` — the company's own
stated capabilities this tender needs — `gaps[]`, things the tender asks for that
their website does not mention, and `checks[]` (each a `label`), computed: outside the
states asked for, or prequalification named in the tender's text (a heuristic, its
`match` says so). `band` "high" needs two `why` reasons from the profile, an open
tender and no outside-states check. A tender listed by two sources is one match, with the
other copy under `also_listed[]`, its `match` saying the pairing is a heuristic. An
anonymous call shows the strongest few and says how many were withheld; relay
`withheld_reason` as it is.
TELL THE USER WHAT THE SCORE IS: relative fit within these results, against what their
website says. NOT a probability of winning. And `gaps` is what to check before bidding,
not a list of everything the tender requires — that is in the tender documents.
When `degraded` is true, scoring was unavailable and the order is keyword relevance
only, with no `why`/`gaps`. Say so rather than presenting it as a judged ranking.
| Name | Required | Description | Default |
|---|---|---|---|
| example | No | ||
| company_url | No | ||
| jurisdiction | No | ||
| closing_before | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
screen_adverse_mediaScreen for adverse media and sanctionsARead-onlyInspect
Screen a person or organisation for ADVERSE MEDIA and SANCTIONS exposure (KYC/AML).
PEP lists are not screened: sanctions.flags.pep is always false and sanctions.note says so.
USE THIS WHEN onboarding or due-diligence asks: does this subject appear in negative news
(fraud, money laundering, bribery, sanctions, trafficking, enforcement action), or on a
sanctions list? Pairs naturally after verify_identity.
Identify the subject ONE of two ways: pass `name` (plus any of `dob` as YYYY-MM-DD, `country`,
`aliases`, `employer`, `role` — these sharpen matching and cut same-name false positives), OR
pass an identity document via `url`/`bytes_b64` (+`filename`) and the subject is read from it.
Returns `{subject, sanctions{...}, adverse_media{...}, risk_flag, headline, limitations}`:
sanctions candidates are corroboration-gated (a name-only hit is `possible`, NEVER confirmed —
one common name matches several different people); media hits are entity-disambiguated and
classified, with same-name articles surfaced under `excluded`. This is screening COVERAGE, not a
determination — a hit means "review this", not "guilty"; "nothing found" is not a clean record.
Stateless — nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| dob | No | ||
| url | No | ||
| name | No | ||
| role | No | ||
| aliases | No | ||
| country | No | ||
| employer | No | ||
| filename | No | document.pdf | |
| bytes_b64 | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses key behavioral traits: statelessness ('Stateless — nothing is stored'), corroboration-gating for sanctions hits ('a name-only hit is `possible`, NEVER confirmed'), entity disambiguation for media, and the interpretive caveat that a hit means 'review this', not 'guilty'. This is rich, non-obvious context that materially affects how an agent should use the results.
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 longer than average, but it is organized into clear functional sections: purpose, when to use, identification methods, and result interpretation. Every sentence carries substantive guidance or a caveat; nothing is 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?
Despite having an output schema, the description adds valuable interpretation of the return shape and its limitations, such as corroboration-gating, `excluded` same-name articles, and the non-determinative nature of screening. For a tool with 9 optional parameters and dual identification modes, the description covers the key decision points an agent needs.
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 0%, so the description carries the full burden. It explains all 9 parameters: the name-based identification path with 'dob', 'country', 'aliases', 'employer', and 'role' as matching sharpeners, and the document-based path via 'url'/'bytes_b64' plus 'filename'. It also adds format guidance ('dob as YYYY-MM-DD') and explains the matching benefits.
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 verb ('Screen') and a clear resource (person or organisation) for 'ADVERSE MEDIA and SANCTIONS exposure (KYC/AML)'. It also explicitly states what is NOT included (PEP lists), distinguishing the tool's scope from a generic screening tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit trigger conditions: 'USE THIS WHEN onboarding or due-diligence asks: does this subject appear in negative news... or on a sanctions list?' and notes it 'Pairs naturally after verify_identity'. It does not explicitly name alternatives or say when not to use it, but the context is clear enough for correct routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_feedbackRate a warrantAIdempotentInspect
Record thumbs up/down on a warrant's rating (the engine's precision-flywheel label source). verdict must be 'up' or 'down'; note is optional free text.
USE THIS WHEN the ground truth became known after a verify_document call — e.g. the
document was later confirmed genuine or fraudulent — so the engine learns from the
outcome. Tell it what happened; it sharpens future inspections for everyone.| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| verdict | Yes | ||
| warrant_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true, so no contradiction. The description adds behavioral context beyond annotations — this is the precision-flywheel label source and feedback sharpens future inspections for everyone — which helps an agent understand downstream effects.
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?
Two tightly written paragraphs with no filler. The first gives function and constraints; the second gives the when-to-use context. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter, 2-required feedback tool with an output schema and informative annotations, the description is close to complete. The only minor gaps are side effects like batching or timing of learning, but these are not required for a correct call.
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 0%, so the description must carry the semantic burden; it does. It tells the agent verdict must be 'up' or 'down', note is optional free text, and warrant_id refers to the warrant whose rating is being labeled. Without this description, the agent would have no way to know the only valid verdict values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Record thumbs up/down') on a specific resource ('a warrant's rating') and ties it to the engine's precision-flywheel label source. This distinguishes it from siblings like verify_document, which performs verification rather than outcome feedback.
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 gives an explicit trigger condition ('when the ground truth became known after a verify_document call'), concrete examples ('later confirmed genuine or fraudulent'), and the reason to use it ('so the engine learns from the outcome'). The when-to-use guidance is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tender_sourcesList tender data sourcesRead-onlyInspect
Every source we search, what it is allowed to do, and what the last run returned. FREE.
USE THIS WHEN someone asks where the data comes from, whether a particular portal is
covered, or why a search came back empty. It is the honesty surface: it names sources
behind login walls, sources whose robots.txt refuses us, and sources that returned
nothing on the last run and why.
Returns `{sources[], coverage}` — per source: id, tag, name, refresh mode,
jurisdiction, tier, how it is accessed, what its robots.txt says, how many tenders we
hold from it, and its status on the most recent run; its URL (`source_url`) with an API
key or a signed-in account only. Snapshot sources include their observed date and are
not presented as nightly feeds.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
verify_documentVerify a document's authenticityARead-onlyInspect
Forensically inspect a document (PDF or image) for authenticity: tampering signs, AI-generation indicators, arithmetic reconciliation (financial docs), and provenance.
USE THIS WHEN someone shares a payslip, bank statement, invoice, receipt, ID, certificate,
or contract and asks: is this genuine / real / authentic? has it been edited, doctored, or
photoshopped? can I trust this file? (For "did an AI *write* this prose" use
`detect_ai_text`; for "are this report's citations real" use `verify_references`. Both are
available in this canonical suite.)
Provide the document ONE way: `url` (a public http(s) link — fetched server-side, the
cheapest call: no need to download or encode anything) OR `bytes_b64` (inline base64, plus
`filename` so PDF-vs-image routing is right).
Returns the headline result — `risk_band` (low/medium/high/insufficient/error),
`inspection_quality` (coverage, orthogonal to risk), `recommended_action`, a `summary`, the
RISK-axis `risk_findings`, and a shareable `permalink`. This is a SIGNAL, not a fraud
verdict — a human or agent adjudicates. Use `get_warrant(warrant_id)` for the full evidence
bundle. Identical bytes are cached by content hash — `check_document` first skips a
redundant, paid inspection.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| fresh | No | ||
| filename | No | document.pdf | |
| bytes_b64 | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide `readOnlyHint`, yet the description voluntarily discloses server-side fetching, content-hash caching, the 'signal not a fraud verdict' limitation, and a downstream `get_warrant` path for full evidence. It meaningfully expands beyond annotations and is consistent with readOnlyHint.
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 clearly structured with purpose, when-to-use, input mechanisms, and output semantics, and it front-loads the most load-critical information. It is longer than minimal but uses that length for operational nuance such as caching and cost guidance, so the length 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 complexity, the description covers purpose, triggers, bypass path, document input choice, output semantics, and next-step evidence retrieval. The only notable completeness gap is the undocumented `fresh` parameter, but the description still gives strong guidance for an agent to invoke and trust the call.
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?
With 0% schema description coverage, the description provides real value by explaining `url` as a server-side-fetched http(s) link and `bytes_b64` plus `filename` as the inline-base64 route with PDF-vs-image routing. It omits `fresh` entirely, which is a minor but real gap given that parameter is otherwise undocumented.
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 leads with a specific verb and resource: 'Forensically inspect a document (PDF or image) for authenticity', and enumerates concrete checks like tampering signs, AI-generation indicators, and provenance. It also differentiates from siblings by naming `detect_ai_text` and `verify_references` as the tools for other question types, so an agent can disambiguate from related 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 'USE THIS WHEN' block gives concrete document types and user questions, making the trigger condition explicit. It also states when not to use it by pointing to `detect_ai_text` and `verify_references`, and it tells the agent to use `check_document` first to skip a redundant, paid inspection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_identityRun an Australian identity checkARead-onlyInspect
Run an Australian identity check over a SET of identity documents. A vision model reads each document (which ID it is, which fields it shows — name/photo/address/signature — and its issue date); a deterministic engine then tallies them against a scheme and reports whether identity is established, and exactly what's still missing if not.
USE THIS WHEN someone needs to verify a person's identity from their documents — KYC /
onboarding / "do these documents satisfy the 100-point check?" Pass ALL the person's
documents together (a passport alone is 70 points; the check needs >= 100).
`documents` is a list, each item ONE of: {"url": "https://..."} (public link, fetched
server-side) or {"bytes_b64": "...", "filename": "passport.pdf"} (inline). Up to 10.
`scheme`: "afp_100_point" (points, default) or "austrac_safe_harbour" (category combinations).
Returns `{established, points/target or satisfied_path, documents[] (per-document: type,
fields shown, whether it counted and why-not), reason, accepts, ...}`. This is identity
COVERAGE, not a forgery judgment — run verify_document for authenticity. Documents are
never stored.
| Name | Required | Description | Default |
|---|---|---|---|
| scheme | No | afp_100_point | |
| documents | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, meaning no mutation. The description goes beyond that by disclosing that documents are never stored, which is critical privacy context. It also reveals the deterministic engine behavior and that it returns a structured coverage result. However, it doesn't explicitly state whether the vision model introduces variable latency or potential failures, but that is minor given the strong context.
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 paragraph on the method, a 'USE THIS WHEN' section for usage, and inline parameter explanations. Every sentence provides value, and the critical distinction (coverage vs. forgery) is front-loaded. It is verbose but appropriately so for a complex 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 the purpose, usage, parameters, output structure, and privacy implications. It also routes to siblings when neededcars. Although an output schema exists, the description goes beyond by explaining semantics of the return fields (e.g., whether documents counted and why-not), which is rich enough for an agent to use the results effectively.
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 0%, so the description must fully compensate. It does: `documents` is described as a list of one of two forms (url or bytes_b64+filename) with exampleslor and a limit of 10. `scheme` is explained with its two possible values and defaults, and each is defined. This adds substantial meaning 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 clearly states a specific verb 'verify' and resource 'Australian identity check' over documents, and distinguishes it from siblings like verify_document and check_document by explaining it tallies documents against a scheme for coverage, not forgery. It also clarifies what it does not do, which helps an agent differentiate it immediately.
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: for KYC/onboarding and 100-point check queries, and when not to: it is not a forgery judgment, so use verify_document for authenticity. It also gives practical guidance to pass all documents together and explains the 100-point threshold, which is essential for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_referencesVerify a report's citationsARead-onlyInspect
Fact-check a document's REFERENCES and CLAIMS — built for AI-generated reports whose citations must be checked before they're trusted.
USE THIS WHEN someone shares a report, article, whitepaper, or deep-research export (or a
link to one) and asks: is this accurate / legit? are these citations real? fact-check this.
did the AI make this up? Also use it proactively before relying on any AI-written document.
Provide the document ONE way: `url` (a public http(s) link to a PDF or web page — fetched
server-side, the cheapest call: no need to download or encode anything), `text` (pasted
markdown/plain prose), OR `bytes_b64` (a base64 PDF; URLs are read from the PDF's link
annotations, so they're exact). Default (fast): provenance (is it a ChatGPT deep-research
export?), citation resolution (live / archived / dead, papers matched against arXiv/Crossref
to catch 'real ID, wrong paper'), and internal MATH (recompute the doc's own arithmetic).
Set `deep=true` to also fetch each cited source and judge whether it SUPPORTS or CONTRADICTS
the claim (slower, ~a minute).
Returns a trust summary, per-item tables, and a shareable `permalink` to the public
fact-check record. HONEST BOUNDARY: this reports verification COVERAGE, not truth —
'supported' means evidence-backed (not necessarily true) and 'unsupported' means no evidence
found (not necessarily false). It tells a reviewer WHERE to look; it does not bless the
document, and it never affects the fraud risk band.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| deep | No | ||
| text | No | ||
| filename | No | document.pdf | |
| bytes_b64 | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation is present, and the description adds substantial behavior beyond it: server-side fetching, the three default checks (provenance, citation resolution against arXiv/Crossref, internal math recomputation), the deep=true mode with a time estimate (~a minute), the return shape (trust summary, per-item tables, permalink), and an explicit 'HONEST BOUNDARY' disclaiming that it reports coverage, not truth. This is model-level transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Despite its length, every sentence earns its place: purpose, usage triggers, input modes with tradeoffs, default-vs-deep behavior, returns, and limitations are each in their own paragraph with helpful flags like 'USE THIS WHEN' and 'HONEST BOUNDARY'. The description is front-loaded with purpose and contains no filler or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (five parameters, three mutually exclusive input modes, no required params, zero schema coverage), the description is remarkably complete: it explains the mutual-exclusivity constraint, the deep-mode toggle, time cost, outputs, and interpretatin caveats. The output schema exists, so return values need not be spelled out. The only substantive gap is the undocumented filename parameter and the absence of any error-mode notes (e.g., failed URL fetch or malformed PDF).
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 0%, so the description carries the full burden, and it compensates well: url (public HTTP(S), text (pasted markdown/plain prose), bytes_b64 (base64 PDF with exact link-annotation URLs), and deep (default fast vs fetch-each-source mode) are all given meaningful semantics, including cost tradeoffs. However, the filename parameter is never mentioned anywhere in the description or schema, leaving one of five parameters undocumented.
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 opening line, 'Fact-check a document's REFERENCES and CLAIMS — built for AI-generated reports whose citations must be checked before they're trusted,' states a specific verb (fact-check), a specific resource (references and claims), and the target use case. There are no sibling tools to differentiate from, and the title 'Verify a report's citations' is reinforced rather than merely restated.
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 includes an explicit 'USE THIS WHEN' block with concrete trigger scenarios and example user questions ('is this accurate / legit?', 'did the AI make this up?'), plus proactive guidance ('use it proactively before relying on any AI-written document'). It also routes input selection by explaining when to choose url vs text vs bytes_b64, so an agent knows how to invoke it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
find_tenders1 field changed- added
Input schema / properties / kindAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Kind" +}
2 tool updates
- Added
buyer_awards - Added
find_signals
1 tool update
- Changed
find_tenders1 field changed- added
Input schema / properties / first_seen_afterAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "First Seen After" +}
1 tool update
- Added
check_source_overlap
3 tool updates
- Added
find_tenders - Added
match_tenders - Added
tender_sources
Related MCP Connectors
Document fraud detection for manipulated, fake and AI-generated PDF and image documents.
PDF, photo, email, and file comparison evidence checks with plain-language reports.
AI document intelligence: extract, summarize, claim-check, notarize, and signed action receipts.
Verify AI outputs against real sources. Returns a trust signal and permanent doc number.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables deterministic visual and structural analysis of PDF and DOCX documents, extracting measurable evidence such as blur, OCR confidence, and image anomalies for auditable forensic workflows.1-
- AlicenseNot gradedqualityBmaintenanceEnables automated forensic auditing of public procurement tenders by parsing RFQ specifications, detecting price drift against market baselines, flagging bidder collusion risks, and enforcing human officer approval before any decision is recorded.8,511 npmMIT
- AlicenseAqualityAmaintenanceInspects documents for tampering, ineffective redactions, and text aimed at language models before they enter an agent's context, and compares documents to confirm whether they are unchanged.447 npmMIT
- AlicenseAqualityBmaintenanceChecks documents against international standards (e.g., ICAO, Hague-Visby) to verify internal consistency and completeness, returning a machine-readable verdict for agent decision-making.263 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.