Skip to main content
Glama
devrobotlabs

@devrobotlabs/visionapi-mcp

Official
by devrobotlabs

Extract structured data from an image or PDF

vision_analyze

Extract structured data from one image or PDF using a preset or custom schema. Missing fields and confidence levels are reported, and failed calls cost nothing.

Instructions

Extract structured data from ONE image or PDF (JPEG, PNG, WebP, TIFF, PDF — detected by magic bytes, the extension is ignored).

Cost: 1 credit per image, 2 per selected PDF page. Failures cost NOTHING — every non-2xx releases the reservation in full, so a failed call is safe to fix and repeat, and there is no cleanup to do.

Choose ONE way to say what you want:

  • preset — a catalogue name, or "auto" to have the API classify the file first, for free. "auto" is the right default when you do not already know the document type. Do not call vision_list_presets just to guess a preset; the classifier is better at it and free.

  • schema — your own fields, {"field_name": "what to extract"}. The description IS the prompt: "the invoice number exactly as printed, without the #" extracts better than "invoice number". A schema can be passed alongside a preset to add fields to it.

  • schema_name — a schema saved in the account's dashboard. Not combinable with the others.

Reading what comes back:

  • Fields the document did not carry are NOT printed as values — they are listed at the end under "Not found". A preset always defines every one of its fields, so an absent value means "this document does not have it", never "the call failed".

  • A "(mid)" or "(low)" after a value is its confidence; no marker means high. Decide deliberately what to do with a low-confidence number rather than treating it as fact.

  • Never hardcode a preset's field names from memory. Call vision_get_preset first if the names are going into code.

Long documents: leave mode at "auto". The server kills a synchronous request at 60 seconds; this tool then re-submits it to the queue and polls, and you are charged exactly once because the timed-out attempt refunded itself. Pass mode:"async" up front for anything over ~10 pages.

One file per call. To process a folder, call this once per file — and if you get too_many_tasks, wait for your own in-flight tasks rather than sleeping.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
modeNoauto (default) — try synchronously, and if the server times out at 60 s, resubmit to the queue and poll. The timed-out attempt refunds itself, so this costs one charge, not two. sync — fail rather than fall back. async — go straight to the queue. Pass this up front for anything over roughly 10 pages.auto
pagesNoPDF page selection, e.g. "1-3,7". You are charged for selected pages only, so this is the cheap way to sample a long document.
detailNo"high" renders pages at higher resolution for dense or low-quality scans. Same credit cost, slower.
formatNomarkdown (default) — compact, readable, absent fields summarised rather than repeated. compact_json — the same information as data, with _not_found and _low_confidence arrays, for when you will parse it. json — the API response verbatim; use it when you are writing HTTP code against the contract.markdown
outputNo"text" returns the raw transcription and nothing else. Cannot be combined with a preset or a schema.
presetNoA catalogue name, or "auto" to have the API classify the file first, for free. "auto" is the right default when you do not already know the document type.
schemaNoYour own fields, as {"field_name": "what to extract"}. The description IS the prompt — "the invoice number exactly as printed, without the #" extracts better than "invoice number". Can be passed alongside a preset to add fields to it.
file_urlNoPublic HTTPS URL the API fetches itself. Private and internal addresses are refused by the server.
file_pathNoAbsolute or relative path to a file on the user's disk. Must be inside a directory this server was given access to — the error names them if it is not.
max_charsNoCeiling on transcription text in the response. Raise it only if you truly need more than 20 000 characters.
schema_nameNoA schema saved in the account dashboard. Not combinable with preset or schema.
language_hintNoISO 639-1 code, e.g. "es". Auto-detected when omitted; only worth setting when detection is getting it wrong.
min_confidenceNoValues below this level come back null with their confidence preserved. Default low, which filters nothing.
include_raw_textNoAlso return the full transcription alongside the fields. Expensive in context — leave it off unless you need the prose.

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. First observedv1.0.0

TDQS

A5/5.0
Behavior5/5

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

Annotations only flag readOnlyHint=false, non-idempotent, and non-destructive; the description adds substantial behavior beyond that: credit costs, failure refunds with no cleanup, magic-byte detection, 60-second timeout with queue resubmission, absent-field reporting, and confidence markers. No contradiction with annotations.

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

Conciseness5/5

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

The description is long but deliberately organized into labeled sections: cost, selection modes, reading output, long documents, and per-file limits. Every sentence carries operational information; there is no filler or repetition beyond what is needed for a 14-parameter tool with no output schema.

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

Completeness5/5

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

For a complex 14-param, 0-required tool with no output schema, the description covers input selection, costs, failure/refund semantics, output interpretation (Not found, mid/low confidence), timeout behavior, page selection, formatting choices, and folder-processing guidance. An agent has enough to call it correctly without external docs.

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

Parameters5/5

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

Schema coverage is 100%, so the schema already documents parameters, but the description adds critical semantics: the exclusivity rule ('Choose ONE way'), schema_name not being combinable, schema descriptions acting as prompts, mode fallback/refund behavior, and the meaning of the format options. This goes well beyond the structured schema.

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

Purpose5/5

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

Opens with 'Extract structured data from ONE image or PDF' — a specific verb plus objects and file types. It distinguishes the tool's role from vision_list_presets by telling users not to call that sibling just to guess a preset, and clearly separates the preset/schema/schema_name configuration paths.

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

Usage Guidelines5/5

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

Gives explicit when-to-use guidance: use 'auto' when the document type is unknown, call vision_get_preset before hardcoding field names, pass async for anything over ~10 pages, and process one file per call while waiting on too_many_tasks. It also names exclusions, such as 'Do not call vision_list_presets just to guess a preset.'

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

Latest Blog Posts

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/devrobotlabs/visionapi-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server