Suparse MCP Server
OfficialSummary: Suparse MCP Server is a local stdio MCP server that uploads local documents to the Suparse API for structured extraction and lets you retrieve, save, or delete the results.
Extract a single document (
extract_file) — process one local file; defaultdeferreturns task/document IDs,return_jsonreturns the full extraction in the response, with optionaltemplate_id,split, andcleanup(only withreturn_json).Extract a folder (
extract_folder) — process all supported files in a local folder with the same options.Choose an extraction template (
list_templates) — list usableteam_templatesand discovery-onlysystem_templates(system ones must be added in the Suparse UI before use).Fetch JSON results in context (
fetch_json_results) — return validated JSON exports for given document IDs directly in the MCP response.Save exports to disk (
download_results) — write results to a local path asjson,csv,xlsx, orgoogle_sheets.Delete remote documents (
delete_documents) — remove documents from Suparse by ID, preferably after a confirmed export.Note: the README describes more tools (start-only extraction, task polling, task results, schema creation, export jobs,
download_export_job) that are not present in this schema; only the six tools above are exposed here.
Allows exporting document extraction results directly to Google Sheets via the download_results tool.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Suparse MCP Serverextract data from invoice.pdf"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Suparse MCP Server
MCP stdio server for the Suparse Document Processing API. Use it from local MCP clients such as Claude Code and Codex to extract structured data from documents into JSON, CSV, XLSX, or Google Sheets; process single files or folders, including encrypted PDFs; let Suparse auto-detect extraction schemas or apply your team templates; create schemas automatically; split mixed multi-page documents; and download or clean up results by document ID.
Security Boundary
This is a local stdio MCP server. Connected MCP clients can ask it to read local document paths and write export files wherever the server process has permission. Only connect it to MCP clients and workspaces you trust.
Related MCP server: Mineru MCP Server
Requirements
A Suparse API key
Node.js 20+
Authentication
The MCP server reads credentials from:
SUPARSE_API_KEY~/.config/suparse/config.json
Prefer passing SUPARSE_API_KEY through your client's environment or secret-input support. The fallback file is implemented by Suparse and contains { "apiKey": "your_api_key" }. Protect it as a credential file.
Replace your_api_key in the examples below. Client env settings and CLI --env options can save the key in client configuration; keep files containing real keys out of Git and shared workspaces. CLI commands containing a key may also appear in shell history. Use scoped API keys where available.
Local Installation
Install your chosen client first and ensure Node.js 20+ and npx are available to it. These setups launch @suparse/mcp as a local stdio process:
Merge JSON examples into existing configuration rather than replacing other servers. After connecting, use the template-listing check to verify Suparse authentication.
Claude Code
Install for all your projects with user scope:
claude mcp add --scope user --transport stdio suparse \
--env SUPARSE_API_KEY=your_api_key \
-- npx -y @suparse/mcpKeep the server name (suparse) before --env; Claude Code can otherwise parse it as another environment variable and report Invalid environment variable format.
To change an existing registration (for example, its API key or launch command), remove it before running the add command again:
claude mcp remove --scope user suparseUse the name and scope from your original installation. For a user-scoped local test registered as suparse-local, run claude mcp remove --scope user suparse-local. After adding the updated registration, fully exit Claude Code and start a fresh session to load the new configuration.
Check the configuration and connection:
claude mcp list
claude mcp get suparseInside Claude Code, use /mcp to inspect status and tools, then run the template-listing check. See the Claude Code MCP documentation.
Claude Desktop
Open your config file at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows. Add Suparse to the mcpServers section:
{
"mcpServers": {
"suparse": {
"command": "npx",
"args": ["-y", "@suparse/mcp"],
"env": {
"SUPARSE_API_KEY": "your_api_key"
}
}
}
}Fully quit and reopen Claude Desktop, confirm Suparse appears among the available tools, then run the template-listing check.
If Windows reports a process-start error for npx, replace the server's command and args with:
{
"command": "cmd",
"args": ["/c", "npx", "-y", "@suparse/mcp"]
}Keep the existing env block. This workaround is only needed for clients that cannot launch npx.cmd directly.
Codex
The preferred installation is through the CLI:
codex mcp add suparse \
--env SUPARSE_API_KEY=your_api_key \
-- npx -y @suparse/mcpAfter installation, add tool_timeout_sec = 300 inside the existing [mcp_servers.suparse] table in ~/.codex/config.toml. The CLI command does not set this timeout.
Alternatively, configure the server manually in ~/.codex/config.toml or a project-scoped .codex/config.toml:
[mcp_servers.suparse]
command = "npx"
args = ["-y", "@suparse/mcp"]
tool_timeout_sec = 300
[mcp_servers.suparse.env]
SUPARSE_API_KEY = "your_api_key"tool_timeout_sec gives Suparse extraction tools up to five minutes to finish; Codex defaults to 60 seconds. The CLI and IDE extension share this configuration. See the Codex MCP documentation.
Verify the configured server:
codex mcp listIn an interactive Codex session, use /mcp to inspect active servers, then run the template-listing check.
Cursor
Add this to ~/.cursor/mcp.json for all projects, or .cursor/mcp.json for the current project:
{
"mcpServers": {
"suparse": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@suparse/mcp"],
"env": {
"SUPARSE_API_KEY": "${env:SUPARSE_API_KEY}"
}
}
}
}Set SUPARSE_API_KEY in Cursor's environment before launching it; the ${env:SUPARSE_API_KEY} reference keeps the key out of the JSON file. Restart Cursor after changing its environment. Alternatively, put the key in an untracked personal configuration.
Open Cursor's MCP settings, confirm Suparse is enabled and its tools are available, then run the template-listing check in Agent chat. See the Cursor MCP documentation.
VS Code / GitHub Copilot
For Copilot CLI, install and verify with:
copilot mcp add suparse \
--env SUPARSE_API_KEY=your_api_key \
--timeout 300000 \
-- npx -y @suparse/mcp
copilot mcp listThe timeout is in milliseconds and allows up to five minutes for tool discovery and calls. Then run the template-listing check in Copilot CLI. See the Copilot CLI command reference.
For a portable Copilot setup, create .mcp.json in the workspace root. For a personal installation, use ~/.copilot/mcp-config.json (or $COPILOT_HOME/mcp-config.json if configured):
{
"mcpServers": {
"suparse": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@suparse/mcp"],
"env": {
"SUPARSE_API_KEY": "your_api_key"
},
"tools": ["*"]
}
}
}Keep any file with a real key untracked. For a workspace configuration using VS Code's password input, use .vscode/mcp.json instead:
{
"inputs": [
{
"id": "suparse-api-key",
"type": "promptString",
"description": "Suparse API key",
"password": true
}
],
"servers": {
"suparse": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@suparse/mcp"],
"env": {
"SUPARSE_API_KEY": "${input:suparse-api-key}"
}
}
}
}The VS Code format uses servers; the portable format uses mcpServers. Choose one setup to avoid duplicate servers. Interactive inputs are not forwarded to Copilot harness sessions; use the portable setup for those sessions.
Run MCP: List Servers from the Command Palette, select Suparse and start it, then run the template-listing check in agent chat. See the VS Code MCP configuration reference.
Gemini CLI
Install for your user account:
gemini mcp add --scope user \
--env SUPARSE_API_KEY=your_api_key \
suparse npx -y @suparse/mcpThis writes the server configuration to ~/.gemini/settings.json. Check connection status with:
gemini mcp listIn an interactive session, use /mcp list to inspect tools, then run the template-listing check. See the Gemini CLI MCP documentation.
Windsurf / Cascade
These instructions target the legacy Cascade agent. For the newer default Devin Local agent, follow the Devin CLI MCP configuration documentation; its configuration locations and migration behavior depend on the installed version, even where paths overlap with Cascade.
Open the MCP configuration from Cascade's MCP controls. Windsurf installations use ~/.codeium/windsurf/mcp_config.json (%USERPROFILE%\.codeium\windsurf\mcp_config.json on Windows). Cascade in current Devin Desktop releases uses ~/.config/devin/mcp_config.json (or $XDG_CONFIG_HOME/devin/mcp_config.json) on macOS/Linux and %APPDATA%\devin\mcp_config.json on Windows. Opening the file from Cascade selects the path for your installed version.
Add Suparse under mcpServers:
{
"mcpServers": {
"suparse": {
"command": "npx",
"args": ["-y", "@suparse/mcp"],
"env": {
"SUPARSE_API_KEY": "your_api_key"
}
}
}
}Save the file, refresh the MCP list or restart the client, and confirm Suparse and its tools are enabled in Cascade. Run the template-listing check. See the Cascade MCP documentation.
Verify Your Installation
In your client's agent chat, ask:
Use Suparse's
list_templatestool to list my team's available extraction templates.
Approve the tool call if prompted. A successful response confirms both the MCP connection and Suparse API authentication; an empty team_templates list is valid if your team has no templates. This check does not upload or process a document.
If the server fails to start, check that Node.js 20+ and npx are on the client's PATH, and inspect its MCP logs. For authentication errors, check the key passed to the server or the Suparse fallback file. Desktop applications may not inherit environment variables set in a terminal.
Verify Document Processing (Optional)
Processing may consume Suparse credits. Use a small sample invoice or receipt containing data you are comfortable uploading to Suparse.
Put the sample PDF somewhere accessible to the MCP server and use its absolute path (see local paths).
Ask your client: "Use Suparse's
start_file_extractionto extract structured data from/absolute/path/to/sample.pdf. Return the task ID and any document IDs or processing status provided. Do not delete the uploaded document."Call
wait_for_task_extractionwith the returned task ID. If processing is still running, retain the ID and poll again; do not upload the file again.Once processing completes, use a returned document ID to call
fetch_document_result. If necessary, useget_task_resultswith the task ID to discover document IDs.
This checks local file access, authentication, upload, processing, and result retrieval. Keep the uploaded document unless you explicitly want to delete it later.
Tools
Goal | Recommended tool |
Process a document, then obtain task/document IDs |
|
Start processing and return after upload confirmation |
|
Get JSON directly in the MCP response |
|
Start processing many documents |
|
Inspect intermediate results |
|
Save a CSV/XLSX/JSON file |
|
Download a completed export after reconnecting |
|
defer uploads and polls until processing reaches a terminal state or polling fails; it defers the result export, not the processing wait. The start-only tools return task IDs after upload confirmation without polling for processing completion. Use them when you need an ID promptly, especially for long jobs or human review.
return_json returns full results in both text and structured content. Large documents or batches can consume substantial assistant context; prefer download_results to save exports for those jobs.
Local Paths
Input and output paths must be accessible to the machine and operating-system process running Suparse MCP. Relative paths such as ./invoice.pdf resolve against the server process's current working directory, which the MCP client chooses at launch; this may differ from your open project or chat's directory. File paths pass directly to the Node SDK's filesystem operations, and folder paths are normalized with path.resolve against that same working directory. Relative export paths also use the process's working directory; omitted output paths default there. The server does not expand ~ in tool path arguments.
Prefer absolute paths when the working directory is uncertain. Use paths for the server's operating system: for example, C:\Users\you\invoice.pdf for a Windows process or /mnt/c/Users/you/invoice.pdf for a WSL2 process with that drive mounted. A path on another machine or outside the server's accessible filesystem cannot be read just because it appears in chat.
Credits, Deletion, and Retries
Document processing and automatic schema creation may consume Suparse credits. Uploading the same file again can create another processing submission. If a request times out, recover using the retained task ID, export job ID, or idempotency key before submitting new work.
delete_documents deletes documents from Suparse remotely; it does not just remove local temporary files. The cleanup option on combined extraction tools can also delete remote documents after a verified export. Request deletion only after confirming that the results you need are safely saved.
The server already supplies MCP annotations: status, template, and result inspection tools are read-only; upload/schema-creation tools are mutating and non-idempotent; combined extraction is marked potentially destructive because it can clean up; and delete_documents is marked destructive. Export submission tools are not advertised as universally idempotent: safe replay requires the same key and identical request options. Disk export tools can also write or overwrite local files. These hints help clients assess tool calls, but do not enforce permissions or make arbitrary retries safe.
Tool Reference
extract_file,extract_folder: Combined upload and processing.deferis the default and returns task/document IDs after polling; a task can bepartially_completed.return_jsonreturns exported groups with per-input task status and document IDs; partial tasks and empty exports are reported as incomplete.cleanupis best-effort and valid only withreturn_json.start_file_extraction,start_folder_extraction: Upload and return task IDs immediately, without polling or exporting. Folder scans are sorted, nonrecursive, and limited to 10 concurrent uploads.wait_for_task_extraction: Poll a remote task. Defaults to 2 seconds between polls and 3 attempts; retries and SDK backoff mean this is not a strict wall-clock deadline.get_task_results: Read one bounded page of partial task documents. The opaque cursor ends a snapshot, not task processing; a fresh call may show more documents.list_templates: List summary or full template records, grouped into directly usableteam_templatesand discovery-onlysystem_templates.start_quick_schema_creation,get_quick_schema_creation,wait_for_quick_schema_creation: Start and inspect automatic schema creation. The run ID is separate from task, document, and export job IDs.fetch_json_results: Return validatedTaskExport[]JSON by document ID. It does not unpack ZIP artifacts or accept arbitrary JSON schemas.fetch_document_result: Fetch one document's structured JSON result through the direct single-document endpoint.download_results: Export documents and save the response to a local path. Supports JSON, CSV, XLSX, and immediate Google Sheets. Existing output paths follow the SDK overwrite behavior.get_export_job,wait_for_export_job,download_export_job: Inspect, wait for, and download a known remote export job across MCP restarts. Downloads preserve original bytes, including ZIP, and verify the artifact before atomic publication.download_export_jobdefaults tooverwrite: false.delete_documents: Delete remote documents by ID. Use after confirming a successful export/download when cleanup is requested.
Export Formats
fetch_json_results accepts:
Input | Values | Default |
|
|
|
JSON exports are returned as structured results. fetch_json_results and download_results accept wait_timeout_ms (positive integer milliseconds, default 60000) and an optional UUID idempotency_key. The wait value bounds completion waiting, including polling retries; submission and transfer are separate phases, so MCP clients still need enough total tool time. If a response is lost, replay the same document IDs, format, export type, layout, and key.
download_results accepts json, csv, xlsx, and google_sheets, plus an optional output_path local file path or existing directory. XLSX exports additionally accept xlsx_layout: "standard" | "flat" and default to standard. It writes the export directly to disk and returns the saved output_path. Immediate Google Sheets responses work; background Google Sheets is unsupported. The disk tool saves the Sheets response metadata, including URLs, rather than a spreadsheet binary. MCP clients should use download_results for CSV, XLSX, Google Sheets, and saved JSON files; they should not fetch base64 data and decode it with shell or Python. A known-job download preserves raw artifact bytes and is the path for ZIP or exact JSON artifacts.
CSV/XLSX exports can return a ZIP containing several files (for example, invoices
and bank statements). Both download tools report requested_format,
artifact_format, and content_type, and correct the saved extension to match
the artifact. An explicit results.xlsx path therefore becomes results.zip
when the API returns an archive; check the returned output_path.
For separate local files, call download_results with unpack: true:
{"document_ids":["invoice-id","statement-id"],"format":"xlsx","output_path":"/absolute/path/results.xlsx","unpack":true}The ZIP is retained, and output_paths lists the extracted files in a fresh
results_files-* folder next to it. Existing extracted files are never replaced.
A single workbook stays .xlsx and appears directly in output_paths.
Unpacking defaults to false, applies only to CSV/XLSX, and rejects unsafe archive
paths, links, duplicate destinations, more than 1000 entries, or more than 512 MiB
of uncompressed data. Failed extraction removes partial files; error recovery
includes saved_artifact_path if the archive was already saved.
download_export_job always preserves the original artifact without unpacking.
CSV/XLSX download_results buffers the artifact through the SDK's raw-download
API; known-job recovery streams and verifies the artifact before publication.
result_mode controls whether extraction results in JSON format are returned directly. Use return_json only when you need the full JSON extraction in the MCP response. In all other cases you can retrieve the results in the format of your choice using download_results.
Explicit return_json requests return complete JSON in both text and structured content, including when cleanup is enabled. Its tasks records preserve each polled input’s task ID, status, and document IDs. Partial completion and empty exports increase failed_count while preserving any exported data; their parent tasks are retained during cleanup. Combined extraction accepts wait_timeout_ms for each JSON export, defaulting to 60000 milliseconds; it is ignored in defer mode. Its optional exports records associate generated idempotency keys and accepted job IDs with each local input. Combined extraction does not accept caller-supplied idempotency keys.
Cancelled folder responses account for all scanned files. Inputs that never started appear in failed with cancelled: true, unstarted: true, and code OPERATION_NOT_STARTED; failed_count includes them. These entries remain in source order and distinguish inputs safe to start from submitted tasks needing recovery. A known export job takes recovery priority, followed by replaying an identical export with its retained key, then task polling.
Important: cleanup on extract_file and extract_folder is only valid with result_mode: "return_json". Cleanup is best-effort and requires a fully completed task and a JSON export covering every requested document ID. Missing or unverifiable coverage produces an INCOMPLETE_EXPORT failure and retains the parent. It retains partial tasks, empty exports, and inputs whose backend work is uncertain. Folder cleanup waits for all extraction workers to settle and is skipped after cancellation. For CSV/XLSX/Google Sheets or saved JSON files, use start or combined extraction, wait for the task, download the result, then call delete_documents if requested. A local artifact write failure alone does not prove backend work is still running. When cleanup is requested, cleanup reports its status and deleted or retained document IDs in both text and structured results. Retained IDs include deletions that could not be confirmed. Combined extraction progress counts settled input files and increases with every notification.
extract_file, extract_folder, start_file_extraction, and start_folder_extraction accept template_id, split, pdf_password, folder_id, and auto_approve. Approval defaults to true. Set auto_approve: false only when human review is requested, and use the start-only tools so the task ID is returned before processing waits. MCP cannot perform human review or approve documents; retain the task ID and resume polling after review is complete. This does not create or report a backend awaiting_approval status. Treat pdf_password as sensitive input. MCP redacts it from returned errors, metadata, partial results, and progress, while an MCP client may retain submitted tool arguments according to its own behavior.
Google Sheets Requirements and Results
Connect Google Sheets in Suparse before requesting
format: "google_sheets"; the SDK requires a working Google integration.The Suparse integration supports creating a spreadsheet or appending to an existing one. This MCP tool exposes no target spreadsheet ID or append option, and the SDK does not specify which destination behavior its export endpoint chooses. Selecting a destination or explicitly appending rows is not supported through this MCP server.
Only immediate Google Sheets export responses are supported here; background Google Sheets jobs cannot be downloaded through this workflow.
download_resultssaves a JSON metadata file and returnsoutput_pathplus availablegoogle_sheets_metadata, which may include spreadsheet or folder URLs. It does not save a local.xlsxfile. Useformat: "xlsx"for that.
Recovery guide
Known information | Next action |
Export job ID |
|
Task ID |
|
Lost export response and retained UUID key | Replay the identical request with the same IDs, format, type, layout, and key. |
Unknown upload confirmation with an upload reference | Retain the reference and investigate. Do not submit a fresh upload. The MCP has no upload recovery endpoint. |
Typical workflows
Ordinary extraction and download:
extract_file(file_path="./invoice.pdf")
download_results(document_ids=["<document-id>"], format="csv", output_path="./exports")Long-running work and partial inspection:
start_file_extraction(file_path="./invoice.pdf")
wait_for_task_extraction(task_id="<task-id>", poll_interval=2, max_poll_attempts=3)
get_task_results(task_id="<task-id>", limit=25, cursor=null)poll_interval is seconds. Export wait_timeout_ms is milliseconds. A task may be partially_completed; retain its completed document IDs and inspect later pages. When a page returns next_cursor: null, that snapshot is exhausted but the task may still produce documents. Start a fresh page request later and track IDs to avoid duplicates.
Human review:
start_file_extraction(file_path="./contract.pdf", auto_approve=false)The returned task_id is a remote task ID, document_ids identify remote documents, run_id belongs to quick-schema creation, export_job_id identifies a remote export job, and output_path is a local filesystem path.
Recover an accepted export after a timeout or lost response:
get_export_job(export_job_id="<export-job-id>")
wait_for_export_job(export_job_id="<export-job-id>", wait_timeout_ms=60000)
download_export_job(export_job_id="<export-job-id>", output_path="./exports/result.zip")The 60000 millisecond SDK wait bound includes polling retries, but not submission or artifact transfer. Set a suitable timeout in the MCP client for the full operation. Parsed JSON tools return validated TaskExport[]; known-job downloads keep the raw artifact bytes, which may be ZIP or exact JSON. Do not expose base64/raw buffers to chat or decode artifacts with shell commands.
Automatic Schema Creation
Call start_quick_schema_creation with a local file, then pass its normalized run_id to get_quick_schema_creation or wait_for_quick_schema_creation. Terminal results preserve generated template IDs, saved documents, failed-document details, and retryability. The start tool also accepts pdf_password and folder_id.
upload_batch_id and source_upload_id are supported only for advanced workflows that obtain those IDs elsewhere; the MCP server does not create upload batches.
Template Selection for MCP Agents
MCP agents should use only team_templates when passing template_id to an extraction tool. Use the default summary view for normal selection and request view: "full" only when schema, prompt, validation, or creator metadata is needed.
When a user asks to process a document type such as a receipt:
Check
team_templatesfirst and use the matching team template if present.If no matching team template exists, call
list_templateswithinclude_system: trueand checksystem_templates.System templates are discovery-only. MCP cannot add them to the team or use their IDs directly for extraction.
If no matching team template exists, omit
template_idfor auto-detection, or usestart_quick_schema_creationand follow itsrun_idwhen the user authorized schema creation. Custom template editing and manual configuration are not exposed through MCP; explain that limitation if requested.
Development
Build the package:
pnpm buildTest with MCP Inspector:
npx @modelcontextprotocol/inspector node dist/index.mjsThe MCP server uses stdout for JSON-RPC protocol messages. Do not add console.log output to the server path; use stderr or MCP tool responses.
Available Tools
17 toolsdelete_documentsDelete DocumentsADestructiveIdempotent
Delete documents from Suparse remotely using document IDs, not task IDs, export job IDs, or local paths. Use only when deletion or cleanup is requested, after confirming any required results are safely saved. Deleted IDs cannot be used for later result retrieval or exports. Does not delete local input or exported files. Repeating deletion does not create new work, though its returned boolean may change.
| Name | Required | Description | Default |
|---|---|---|---|
| api_url | No | ||
| document_ids | Yes | Suparse document IDs to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes | |
| document_ids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint and idempotentHint, but the description adds real substance beyond them: deleted IDs cannot be reused for later retrieval or exports, local input/exported files are untouched, and repeat deletion is a no-op whose returned boolean may still change. That last note directly explains an idempotency nuance annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and the ID disambiguation, then layers preconditions, side effects, and idempotency. Five sentences, each carrying distinct information; nothing is redundant with the schema or annotations.
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?
An output schema exists so return values need no explanation, and the description covers everything else an agent needs: correct ID type, deletion preconditions, irreversibility for downstream retrieval, scope of deletion, and repeat-call behavior.
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 description sharply clarifies what document_ids must be (not task IDs, export job IDs, or paths), adding meaning beyond the schema's terse 'Suparse document IDs to delete.' However, api_url is undocumented in both schema and description, so with 50% coverage the description only partly compensates for the gap.
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 specific verb+resource ('Delete documents from Suparse') and immediately disambiguates the ID domain from siblings: 'using document IDs, not task IDs, export job IDs, or local paths.' An agent can distinguish this from get_task_results, download_results, or export tools without opening any 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 precondition gate: 'Use only when deletion or cleanup is requested, after confirming any required results are safely saved.' Clear on when to invoke, though it does not name a specific sibling alternative (e.g. 'to retrieve instead, use get_task_results') by name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_export_jobDownload Export JobADestructive
Save the artifact of an existing completed export_job_id to local disk, including after reconnecting. Preserves original bytes, including ZIP; does not parse JSON, unpack ZIP, wait for completion, or submit another export. Use get_export_job or wait_for_export_job first if needed. Verifies artifact size and SHA-256 before atomic publication. Returns output_path. overwrite defaults false; enable only when replacing a local file is intended. An expired artifact cannot be recovered by retrying this download.
| Name | Required | Description | Default |
|---|---|---|---|
| api_url | No | ||
| overwrite | No | Allow replacing an existing local file. Defaults to false. | |
| output_path | No | Optional local file path or existing directory on the server's machine. Prefer an absolute path; ~ is not expanded. Omit to save in the server's working directory using the artifact filename. Original bytes may be ZIP regardless of the requested export format. | |
| export_job_id | Yes | Remote Suparse export job ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| output_path | Yes | |
| content_type | Yes | |
| export_job_id | Yes | |
| artifact_format | Yes | |
| requested_format | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, but the description adds real behavioral context beyond them: byte fidelity including ZIP, no parsing/unpacking, size and SHA-256 verification before atomic publication, overwrite defaulting to false, and the irreversibility of an expired artifact. This is unusually complete disclosure for a write-to-disk tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and its boundaries are front-loaded in the first two sentences, followed by verification behavior and the two caveats (overwrite, expired artifact). Dense but every sentence carries operational information with no 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?
An output schema exists so return values need not be detailed, yet the description still notes it returns output_path. Combined with preconditions, failure modes (expired artifact), and byte-preservation behavior, nothing needed to invoke this tool 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 coverage is 75% and the schema already documents overwrite (with default) and output_path (with path semantics and ZIP caveat). The description restates overwrite's default and intent but adds no new syntax or format detail, so it largely duplicates structured data. 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?
States a specific verb+resource: 'Save the artifact of an existing completed export_job_id to local disk.' It also draws explicit boundaries against siblings by declaring it does not submit another export, wait for completion, or parse/unpack the artifact, which separates it from download_results, get_export_job, and wait_for_export_job.
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 explicit routing: 'Use get_export_job or wait_for_export_job first if needed,' and states the precondition that the job must already be completed. It also gives the condition for overwrite ('enable only when replacing a local file is intended') and warns that retrying cannot recover an expired artifact.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_resultsDownload ResultsADestructive
Export existing Suparse document IDs as JSON, CSV, XLSX, or Google Sheets to local disk. Returns output_path plus requested_format, artifact_format and content_type. Existing output files are overwritten: choose a new path unless replacement is intended. CSV/XLSX may return ZIP; its extension is corrected to .zip. Set unpack:true to also extract the separate files into a fresh folder and return output_paths. JSON is saved as parsed task groups. Google Sheets requires an immediate API response and saves metadata as JSON. For a known export_job_id use download_export_job to recover the original artifact. Does not delete remote documents.
| Name | Required | Description | Default |
|---|---|---|---|
| format | Yes | Export format to save locally. Use this tool for JSON, CSV, XLSX, or Google Sheets; google_sheets requires a working Google integration and saves response metadata and sheet URLs as JSON, not a spreadsheet binary. | |
| unpack | No | For CSV/XLSX only: extract a returned ZIP into a new folder next to the saved archive and return output_paths. Keeps the ZIP. A single workbook or CSV is returned directly. Defaults false. | |
| api_url | No | ||
| export_type | No | Export mode for CSV, XLSX, and Google Sheets. Defaults to unified. Accepted for JSON, which currently has the same task-group shape for either value. | |
| output_path | No | Optional local file path or existing directory on the server's machine. Existing files are overwritten. Prefer an absolute path; ~ is not expanded. Omit to use the server's working directory with an API-provided or generated filename; check the returned output_path for the actual artifact, which may be ZIP. | |
| xlsx_layout | No | XLSX layout. Applies only to xlsx exports and defaults to standard. | |
| document_ids | Yes | Suparse document IDs to export. | |
| idempotency_key | No | Optional UUID idempotency key. Retain this key and replay the identical document IDs, format, export type, and layout if submission confirmation is lost. | |
| wait_timeout_ms | No | Maximum time in milliseconds to wait for an accepted export job to complete; defaults to 60000. This bounds completion waiting, including polling retries, not submission or transfer. Allow enough total time in the MCP client for all phases. |
Output Schema
| Name | Required | Description |
|---|---|---|
| format | Yes | |
| export_type | Yes | |
| output_path | Yes | |
| xlsx_layout | No | |
| content_type | Yes | |
| document_ids | Yes | |
| output_paths | No | |
| export_job_id | No | |
| artifact_format | Yes | |
| idempotency_key | No | |
| requested_format | Yes | |
| google_sheets_metadata | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and openWorldHint=true, and the description sharpens that: it warns existing local output files are overwritten, explains CSV/XLSX may return a ZIP whose extension is corrected to .zip, notes Google Sheets needs an immediate API response and saves only metadata, and clarifies the destructive scope is local (does not delete remote documents). This adds real context beyond the annotation flags.
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?
Dense but front-loaded around the core export action, with overwrite and ZIP caveats in the middle and the alternative routing at the end. Nearly every sentence carries actionable detail, though the format/metadata sentences are somewhat packed and could be tightened.
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?
An output schema exists, so return-value explanation is not required, yet the description still summarizes output_path/artifact_format. For a 9-parameter destructive export tool it covers overwrite risk, ZIP behavior, Google Sheets constraints, and the sibling alternative, leaving nothing critical implied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 89%, so the schema already documents most parameters (baseline 3). The description still adds meaning on top: unpack extracting into a fresh folder with output_paths, JSON saved as parsed task groups, and CSV/XLSX ZIP behavior. It slightly exceeds the schema-only baseline but does not cover every parameter (e.g., idempotency_key, wait_timeout_ms).
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 specific verb and resource ('Export existing Suparse document IDs as JSON, CSV, XLSX, or Google Sheets to local disk') and the scope of the operation. It also distinguishes itself from the sibling download_export_job by naming that tool for the known-export_job_id case, so an agent can route without opening either 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 concrete when-to guidance (choose a new path unless replacement is intended; set unpack:true to also extract separate files) and one explicit alternative ('For a known export_job_id use download_export_job'). It also excludes delete_documents by stating it does not delete remote documents, but it does not explicitly contrast with the extraction/result siblings like get_task_results or fetch_json_results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_fileExtract FileADestructive
Process one local file through Suparse. Defaults to result_mode defer: upload, wait for terminal processing, and return task_id/document_ids for later export. A partially_completed task retains its status. For an immediate task ID, use start_file_extraction, then wait_for_task_extraction and get_task_results. auto_approve defaults true; false requests human review, and this combined tool may wait and time out while review is pending. return_json preserves per-input task status and document IDs, reports partial tasks and empty exports as incomplete, and preserves exported data. cleanup is best-effort, allowed only with return_json, and requires a completed task and an export covering every requested document.
| Name | Required | Description | Default |
|---|---|---|---|
| split | No | Enable auto-splitting of multi-page documents with mixed document types. | |
| api_url | No | ||
| cleanup | No | Defaults to false. Set true only when remote deletion is requested. Only valid with result_mode return_json. Deletes Suparse documents only for fully completed tasks with JSON exports covering every requested document, after all workers settle. Cleanup is skipped after cancellation. Later exports cannot use deleted document IDs. | |
| file_path | Yes | Path to a local document on the machine running this MCP server, not a URL or chat attachment. Supported extensions: .pdf, .jpg, .jpeg, .png, .heic, .heif. Prefer an absolute path; relative paths use the server's working directory and ~ is not expanded. | |
| folder_id | No | Optional remote Suparse folder ID to assign to uploaded documents. | |
| result_mode | No | Defaults to defer: upload and wait for processing, then return task status and document IDs without exporting. Defer does not mean background processing; use a start-only tool for that. return_json additionally exports full JSON into the MCP response and can consume substantial context. Use download_results to save large results or other export formats. | defer |
| template_id | No | Optional extraction template ID. Use only a non-system team template ID from list_templates. System template IDs are discovery-only and cannot be passed directly. Omit to let Suparse auto-detect, or use an authorized quick-schema workflow to create a team template. | |
| auto_approve | No | Automatically approve extracted documents. Defaults to true. Set false only when human review is requested; use a start-only extraction tool to retain the task ID. MCP cannot approve documents, and combined extraction may time out while review is pending. | |
| pdf_password | No | Optional password for an encrypted PDF. Treat this as a secret; it is used only for the upload and is not returned in results. | |
| wait_timeout_ms | No | For return_json, milliseconds to wait for each export to complete; defaults to 60000. Submission and transfer are separate phases. Ignored in defer mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tasks | No | |
| total | Yes | |
| failed | Yes | |
| cleanup | No | |
| exports | No | |
| guidance | No | |
| cancelled | No | |
| succeeded | Yes | |
| result_mode | Yes | |
| failed_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: partial tasks retain status, auto_approve=false can cause the combined tool to wait and time out during human review, return_json consumes context and reports partial/empty exports as incomplete, and cleanup is best-effort, return_json-only, and gated on a completed task with full export coverage. This explains the destructiveHint behavior (remote document deletion) rather than contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the default behavior before alternatives, and every sentence carries operational content. Sentences are long and dense for a 10-parameter tool, but there is little 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?
Covers the key ambiguities of a combined extract-and-wait tool (partial tasks, approval timeouts, export vs. defer, cleanup constraints), and an output schema exists so return-value detail is not needed. Minor gaps remain around resumed exports and how defer results feed later export steps.
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 90%, so the schema already documents most parameters; the description nonetheless adds meaning about result_mode defaults, the defer/return_json behavioral difference, wait_timeout_ms applying per-export in JSON mode, and cleanup's preconditions. It adds value but largely restates schema-documented 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?
States a specific verb+resource+scope: 'Process one local file through Suparse,' with the default flow spelled out (upload, wait for terminal processing, return task_id/document_ids). This cleanly separates it from extract_folder and the start_file_extraction/wait_for_task_extraction pipeline.
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 routes to alternatives: use start_file_extraction for an immediate task ID, and download_results for large results or other export formats. It also warns that result_mode defer 'does not mean background processing.' It stops short of a full when-to-prefer-this-over-the-start-only-pipeline statement, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_folderExtract FolderADestructive
Process sorted, immediate supported files in a local folder through Suparse (nonrecursive; directories are skipped). Defaults to result_mode defer: upload and wait for each task, retaining task status and document IDs. For task IDs before processing finishes, use start_folder_extraction. At most 10 files run concurrently. auto_approve defaults true; false requests human review, and this combined tool may wait and time out while review is pending. return_json preserves per-input task status and document IDs, reports partial tasks and empty exports as incomplete, and preserves exported data. cleanup is best-effort, allowed only with return_json, and requires a completed task and an export covering every requested document.
| Name | Required | Description | Default |
|---|---|---|---|
| split | No | Enable auto-splitting of multi-page documents with mixed document types. | |
| api_url | No | ||
| cleanup | No | Defaults to false. Set true only when remote deletion is requested. Only valid with result_mode return_json. Deletes Suparse documents only for fully completed tasks with JSON exports covering every requested document, after all workers settle. Cleanup is skipped after cancellation. Later exports cannot use deleted document IDs. | |
| folder_id | No | Optional remote Suparse folder ID to assign to uploaded documents. | |
| folder_path | Yes | Path to a local folder on the machine running this MCP server, not a remote Suparse folder ID. Scans supported files directly inside it, nonrecursively. Prefer an absolute path; relative paths use the server's working directory and ~ is not expanded. | |
| result_mode | No | Defaults to defer: upload and wait for processing, then return task status and document IDs without exporting. Defer does not mean background processing; use a start-only tool for that. return_json additionally exports full JSON into the MCP response and can consume substantial context. Use download_results to save large results or other export formats. | defer |
| template_id | No | Optional extraction template ID. Use only a non-system team template ID from list_templates. System template IDs are discovery-only and cannot be passed directly. Omit to let Suparse auto-detect, or use an authorized quick-schema workflow to create a team template. | |
| auto_approve | No | Automatically approve extracted documents. Defaults to true. Set false only when human review is requested; use a start-only extraction tool to retain the task ID. MCP cannot approve documents, and combined extraction may time out while review is pending. | |
| pdf_password | No | Optional password for an encrypted PDF. Treat this as a secret; it is used only for the upload and is not returned in results. | |
| wait_timeout_ms | No | For return_json, milliseconds to wait for each export to complete; defaults to 60000. Submission and transfer are separate phases. Ignored in defer mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tasks | No | |
| total | Yes | |
| failed | Yes | |
| cleanup | No | |
| exports | No | |
| guidance | No | |
| cancelled | No | |
| succeeded | Yes | |
| result_mode | Yes | |
| failed_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give safety hints (destructive, open-world, non-idempotent), and the description adds substantive context beyond them: concurrency cap of 10, the default defer behavior, the timeout risk while human review is pending, cleanup being best-effort and constrained, and that partial tasks/empty exports are reported as incomplete.
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?
Main purpose and scope are front-loaded in the first sentence, and each sentence carries distinct operational information. It is dense and clause-heavy for a 10-parameter tool, but little of it is wasted.
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 complex 10-parameter tool with an output schema and mutating side effects, the description covers modes, timing, approval, cleanup constraints, and separation of concerns. An agent has enough to invoke it correctly; return values are handled by the output schema.
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 already 90%, so the schema carries most burden (baseline 3). The description nonetheless adds cross-parameter meaning the schema doesn't fully convey, such as result_mode's defer-vs-background distinction and the fact that cleanup is only valid with return_json and a fully covering export.
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 specific verb (process), resource (sorted immediate supported files in a local folder), and scope (nonrecursive, directories skipped). It explicitly names the sibling start_folder_extraction and the condition that routes to it, so the agent can distinguish it without opening schemas.
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 when-to-use guidance: defer vs return_json semantics, use start_folder_extraction for task IDs before processing completes, and download_results for large results. It also states exactly when cleanup is permitted and when auto_approve=false applies, covering alternatives and conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_document_resultFetch Document ResultARead-onlyIdempotent
Read structured JSON for one processed Suparse document_id directly, without submitting an export job or saving a local file. Returns task_id, original_file, total_documents_extracted, and documents containing extracted_data. Get document IDs from extraction results or get_task_results (documents[].id); do not substitute a task_id. Use fetch_json_results for a multi-document JSON export or download_results to save an export. Does not wait for extraction to finish.
| Name | Required | Description | Default |
|---|---|---|---|
| api_url | No | ||
| document_id | Yes | Suparse document ID to fetch. |
Output Schema
| Name | Required | Description |
|---|---|---|
| task_id | Yes | |
| documents | Yes | |
| original_file | Yes | |
| total_documents_extracted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered. The description adds genuinely non-derivable behavior: it does not create an export job, does not write a local file, and does not block waiting for extraction to complete. It also names the returned fields, though with an output schema present that is somewhat redundant.
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?
Three sentences, each load-bearing: what it returns, where the ID comes from, and which siblings to use instead. The core capability and its non-blocking nature are front-loaded with no 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 single-resource read with an output schema, the description supplies everything an agent needs: ID sourcing, sibling alternatives, async behavior, and no side effects. Annotations cover the safety dimension and the output schema covers the return shape, so nothing material 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 coverage is only 50%, so the description must compensate, and it does for the required parameter by clarifying the provenance of document_id (extraction results / get_task_results documents[].id) and warning against passing a task_id. It does not cover the undocumented api_url parameter, leaving one gap.
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 specific verb and resource ('Read structured JSON for one processed Suparse document_id') and immediately scopes it ('directly, without submitting an export job or saving a local file'). This distinguishes it from fetch_json_results and download_results without the agent needing to open sibling schemas.
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 explicit when-to-use routing ('Use fetch_json_results for a multi-document JSON export or download_results to save an export') and a prerequisite for the ID ('Get document IDs from extraction results or get_task_results (documents[].id); do not substitute a task_id'). It also states the exclusion 'Does not wait for extraction to finish,' covering the alternative of waiting tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_json_resultsFetch JSON ResultsA
Export one or more existing Suparse document IDs as JSON into the MCP response, grouped by task in results (task_id, original_file, total_documents_extracted, documents). Use fetch_document_result for a direct single-document read without submitting an export; use download_results for large results, local files, CSV, XLSX, or Google Sheets. This tool only exports JSON and does not unpack ZIP artifacts. On export timeout, retain export_job_id for the export-job tools or replay the identical export with its retained idempotency_key. Does not delete documents; cleanup is explicit through delete_documents.
| Name | Required | Description | Default |
|---|---|---|---|
| api_url | No | ||
| export_type | No | Defaults to unified. JSON currently has the same task-group shape for original and unified. | |
| document_ids | Yes | Suparse document IDs to export. | |
| idempotency_key | No | Optional UUID idempotency key. Retain this key and replay the identical document IDs, format, export type, and layout if submission confirmation is lost. | |
| wait_timeout_ms | No | Maximum time in milliseconds to wait for an accepted export job to complete; defaults to 60000. This bounds completion waiting, including polling retries, not submission or transfer. Allow enough total time in the MCP client for all phases. |
Output Schema
| Name | Required | Description |
|---|---|---|
| format | Yes | |
| results | Yes | |
| export_type | Yes | |
| export_job_id | No | |
| idempotency_key | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnly=false, destructive=false, openWorld=true, so the description carries real weight and does: it discloses the timeout fallback (retain export_job_id or replay with the retained idempotency_key), confirms no document deletion, and points cleanup at delete_documents. This is behavioral context well beyond the annotations and consistent with 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?
Front-loaded with what the tool does before the routing guidance, and every sentence carries a distinct rule (alternatives, format limits, timeout recovery, deletion boundary). It is dense and runs long, but no sentence 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?
With an output schema present, the description needn't explain return values, and it doesn't. Between the annotations, the rich schema, and the description's coverage of alternatives, format limits, timeout recovery, and delete semantics, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 80% and the schema documents export_type defaults and wait_timeout_ms semantics thoroughly. The description adds meaning the schema does not, specifically the retention/replay contract for export_job_id and idempotency_key, which is the key parameter concern for this tool.
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 names a specific verb (export) and resource (existing Suparse document IDs) and states the output shape (grouped by task in results with named fields). It also explicitly contrasts itself with fetch_document_result and download_results, so an agent can distinguish this tool from its closest siblings without opening any 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?
It gives explicit routing rules: use fetch_document_result for a direct single-document read, use download_results for large results, local files, CSV, XLSX, or Google Sheets. It also states a negative boundary ('only exports JSON and does not unpack ZIP artifacts'), which prevents misselection for those cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_export_jobGet Export JobARead-onlyIdempotent
Check one existing export_job_id from an export response or error recovery; this is not an extraction task_id or document_id. Returns job status, generated/excluded counts, error details, expiry, and artifact metadata without waiting or downloading. Use wait_for_export_job if still running, then download_export_job for a completed artifact. Inspect exclusions and errors before claiming all requested documents were exported. Status and format strings may include values unknown to this client.
| Name | Required | Description | Default |
|---|---|---|---|
| api_url | No | ||
| export_job_id | Yes | Remote Suparse export job ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes | |
| export_job_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint, idempotentHint, openWorldHint), and the description adds concrete behavior beyond them: it does not wait or download, it enumerates return content, and it warns that status/format strings may contain client-unknown values. The forward-compatibility caveat is a genuine behavioral disclosure an agent needs.
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?
Every sentence carries routing or disambiguation value, and the primary identity of the tool is front-loaded in the first clause. Despite being information-dense, no sentence 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?
An output schema exists so return values need no elaboration, yet the description still summarizes them briefly for routing purposes. Combined with clear preconditions, alternates, and caveats, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% – export_job_id is documented but api_url is not. The description compensates by characterizing the ID's origin and explicitly excluding task_id/document_id, which is more valuable than a generic format hint. It does not explain api_url, keeping it just short of a 5.
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 one existing export_job_id') and immediately disambiguates the identifier type ('this is not an extraction task_id or document_id'), which is the key confusion risk given the sibling extraction tools. An agent can distinguish it from get_task_results and the export siblings without opening any 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?
It gives explicit routing: use wait_for_export_job if still running, then download_export_job once complete, and it warns to inspect exclusions/errors before assuming success. It also anchors the input to 'an export response or error recovery', telling the agent where the ID comes from.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_quick_schema_creationGet Quick Schema CreationARead-onlyIdempotent
Check an existing quick-schema run_id once without waiting. Returns result.status and available progress, template IDs, saved document IDs, or failure details. If processing, call again later or use wait_for_quick_schema_creation. For completed results, use template_id for future extraction and saved_document_id or saved_documents[].document_id to fetch/download existing results. Do not start another schema-creation run just to check status.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | run_id returned by start_quick_schema_creation; not an extraction task ID, document ID, or export job ID. | |
| api_url | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| run_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint, idempotentHint, and openWorldHint, so safety is covered. The description adds genuine behavioral context beyond that: it is non-blocking, it returns result.status plus progress/template IDs/saved document IDs or failure details, and it must not be substituted for starting a run. It does not describe rate limits or retry cadence, but the 'call again later' phrasing covers the polling model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and its non-blocking constraint, then routed answers about the result fields. Four sentences that each carry information, though the template_id/saved_document_id sentence is somewhat dense and could be tightened since an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description need not enumerate return values, yet it usefully summarizes status, progress, IDs, and failure. Combined with the sibling routing, exit conditions, and the do-not-start-another-run warning, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: run_id has a solid schema description (and the description reinforces its role), but api_url is effectively undocumented. The description's guidance about template_id/saved_document_id concerns return values rather than input parameters, so it does not compensate for the api_url gap. Baseline 3 fits.
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 (check) plus resource (quick-schema run_id) and a key behavioral constraint ('once without waiting'), which cleanly distinguishes it from wait_for_quick_schema_creation. An agent can tell this is the non-blocking poll variant without opening the 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?
Explicit routing: if processing, 'call again later or use wait_for_quick_schema_creation', and an explicit exclusion — 'Do not start another schema-creation run just to check status.' Both the alternative and the anti-pattern are named, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_task_resultsGet Task ResultsARead-onlyIdempotent
Inspect one page of documents already available for an extraction task_id, including while processing. Each documents[].id is a document ID usable by fetch_document_result, fetch_json_results, or download_results; extraction_data contains that document's current data. Pass next_cursor as cursor with the same task_id to get the next page. next_cursor null ends this snapshot, not task processing; use wait_for_task_extraction to determine completion. To refresh later, omit cursor and deduplicate by document ID. This returns a page, not a complete export.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum documents in this page: 1 to 100, default 25. | |
| cursor | No | Opaque next_cursor from a previous page of this task. Omit or pass null to start a fresh snapshot; never construct a cursor. | |
| api_url | No | ||
| task_id | Yes | Remote Suparse task ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| task_id | Yes | |
| documents | Yes | |
| next_cursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, and the description adds behavioral context those cannot: pages are snapshots, cursor is opaque and must not be constructed, refresh requires re-fetching and deduplicating by document ID, and a null cursor does not signal task completion. This is exactly the kind of subtle, non-structured behavior the description should carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then pagination, then completion routing, then refresh/dedup — a logical order. It is dense and every sentence carries information, but the final 'This returns a page, not a complete export' restates the opening scope somewhat, costing a little tightness.
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?
An output schema exists, so return shapes need not be spelled out, yet the description still orients the agent on key fields (documents[].id, extraction_data, next_cursor). For a paginated, read-only inspection tool the description covers invocation, pagination, refresh, and completion checks thoroughly.
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 75% and already documents limit (1-100, default 25), cursor (opaque, never construct), and task_id. The description reinforces how cursor works in practice ('same task_id', 'omit cursor to refresh'), adding operational meaning beyond the schema fields, though limit/task_id semantics add little new.
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 verb+resource (inspect a page of documents for a task_id) and immediately scopes it as one page rather than a full export. It distinguishes itself from siblings by naming fetch_document_result, fetch_json_results, download_results as consumers of the IDs it returns, and wait_for_task_extraction as the completion authority.
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 ('including while processing'), how to paginate (pass next_cursor as cursor with the same task_id), how to refresh (omit cursor), and where to go for completion status (wait_for_task_extraction). It also warns that next_cursor null ends the snapshot, not processing — a genuine usage pitfall removed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_templatesList TemplatesARead-onlyIdempotent
Discover extraction templates; defaults to compact summary view with team templates only. Prefer a matching active team template and pass its id as template_id to extraction tools. Use view full to inspect schema and prompts. include_system true adds discovery-only system templates; MCP cannot add them to the team or use their IDs directly. If no template matches, omit template_id for auto-detection or use start_quick_schema_creation when schema creation is authorized. This tool does not create or modify templates.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Template response view. Summary is compact and recommended for normal template selection; full includes schema, prompts, validation rules, and creator metadata. | summary |
| api_url | No | ||
| include_system | No | Defaults to false. Include discovery-only system templates in addition to team templates. Do not pass system template IDs to extraction tools. MCP cannot add system templates to the team; omit template_id for auto-detection or use an authorized quick-schema workflow instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
| templates | Yes | |
| agent_guidance | Yes | |
| team_templates | Yes | |
| system_templates | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/openWorld, and the description stays consistent with them ('does not create or modify templates'). It adds genuine behavioral context beyond annotations: system templates are discovery-only, MCP cannot add them to the team or use their IDs directly, and when authorized schema creation is the fallback path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and default behavior, then layers routing guidance and constraints. Every clause carries information, though the dense run of conditional instructions (auto-detection, quick-schema fallback, system-template caveat) is packed tightly for a small 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?
Output schema exists, so return-value explanation is unnecessary, and the description fully covers what an agent needs: selection workflow, the summary/full distinction, system-template limitations, and the no-match fallback. Complete for this tool's role as the entry point to the extraction workflow.
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 67% and the schema already documents view (summary vs full) and include_system fairly fully. The description reinforces with usage-oriented meaning ('Use view full to inspect schema and prompts', include_system adds discovery-only templates), but mostly restates rather than introducing 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?
States a specific verb+resource ('Discover extraction templates') plus scope ('defaults to compact summary view with team templates only'). Immediately distinguishes it from the sibling extraction/creation tools by framing it as discovery only, ending with 'This tool does not create or modify templates.'
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 logic: prefer a matching active team template and pass its id as template_id to extraction tools; if none matches, omit template_id for auto-detection or use start_quick_schema_creation when schema creation is authorized. It names specific alternatives and the conditions that select them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_file_extractionStart File ExtractionA
Start background extraction of one local file; return task_id after upload confirmation without waiting for processing or exporting results. This confirms submission, not successful extraction. Use wait_for_task_extraction, then fetch_document_result for a returned document ID or download_results to save an export; get_task_results can inspect partial documents. Uploads may consume credits. On timeout, use any returned recovery task_id rather than uploading again. auto_approve defaults true; false requests human review, which MCP cannot perform or approve. The returned auto_approve echoes the requested option, not backend approval status.
| Name | Required | Description | Default |
|---|---|---|---|
| split | No | Enable auto-splitting of multi-page documents with mixed document types. | |
| api_url | No | ||
| file_path | Yes | Path to a local document on the machine running this MCP server, not a URL or chat attachment. Supported extensions: .pdf, .jpg, .jpeg, .png, .heic, .heif. Prefer an absolute path; relative paths use the server's working directory and ~ is not expanded. | |
| folder_id | No | Optional remote Suparse folder ID to assign to uploaded documents. | |
| template_id | No | Optional extraction template ID. Use only a non-system team template ID from list_templates. System template IDs are discovery-only and cannot be passed directly. Omit to let Suparse auto-detect, or use an authorized quick-schema workflow to create a team template. | |
| auto_approve | No | Automatically approve extracted documents. Defaults to true. Set false only when human review is requested; use a start-only extraction tool to retain the task ID. MCP cannot approve documents, and combined extraction may time out while review is pending. | |
| pdf_password | No | Optional password for an encrypted PDF. Treat this as a secret; it is used only for the upload and is not returned in results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| task_id | Yes | |
| file_path | Yes | |
| auto_approve | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as non-read-only and non-idempotent, and the description adds substantial context beyond them: credits are consumed, submission is confirmed but not success, a recovery task_id should be reused rather than re-uploading, and the returned auto_approve echoes the request rather than backend approval status.
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 behavior is front-loaded in the first sentence and each subsequent clause carries distinct information (follow-ups, credits, timeout recovery, auto_approve). It is dense and semicolon-chained, which slightly hurts scanability, but little is wasted.
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 an async submission tool with annotations and an output schema already present, the description covers the async contract, downstream tool chain, cost, failure/recovery path, and the non-obvious auto_approve caveat. Nothing an agent needs to call 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 coverage is already 86%, so most parameters are self-documenting, but the description adds interpretation the schema does not: auto_approve=false triggers human review that MCP cannot perform or approve, and the echoed value is not approval status. It adds useful nuance above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first clause states a specific verb, resource, and scope: 'Start background extraction of one local file.' It also distinguishes itself from the async siblings by stating it returns task_id 'without waiting for processing,' making it clearly distinct from wait_for_task_extraction and extract_file.
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 maps the downstream workflow explicitly (wait_for_task_extraction, then fetch_document_result or download_results, with get_task_results for partials) and gives a recovery rule on timeout. It does not directly compare against extract_file/extract_folder, so the choice among the start/extract family is left partly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_folder_extractionStart Folder ExtractionA
Start background extraction of sorted supported files directly inside a local folder, skipping directories and subfolders. Returns one task_id per confirmed upload without waiting for processing or exporting. At most 10 uploads run concurrently. Use wait_for_task_extraction for each task, then fetch or download results using its document IDs. Uploads may consume credits. Inspect failed entries and recovery IDs before retrying; cancellation prevents new uploads, but submitted tasks may still run. Entries marked unstarted were not uploaded. auto_approve defaults true; false requests human review, which MCP cannot perform or approve.
| Name | Required | Description | Default |
|---|---|---|---|
| split | No | Enable auto-splitting of multi-page documents with mixed document types. | |
| api_url | No | ||
| folder_id | No | Optional remote Suparse folder ID to assign to uploaded documents. | |
| folder_path | Yes | Path to a local folder on the machine running this MCP server, not a remote Suparse folder ID. Scans supported files directly inside it, nonrecursively. Prefer an absolute path; relative paths use the server's working directory and ~ is not expanded. | |
| template_id | No | Optional extraction template ID. Use only a non-system team template ID from list_templates. System template IDs are discovery-only and cannot be passed directly. Omit to let Suparse auto-detect, or use an authorized quick-schema workflow to create a team template. | |
| auto_approve | No | Automatically approve extracted documents. Defaults to true. Set false only when human review is requested; use a start-only extraction tool to retain the task ID. MCP cannot approve documents, and combined extraction may time out while review is pending. | |
| pdf_password | No | Optional password for an encrypted PDF. Treat this as a secret; it is used only for the upload and is not returned in results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| failed | Yes | |
| cancelled | No | |
| succeeded | Yes | |
| failed_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations: 10 concurrent upload cap, non-blocking return of one task_id per confirmed upload, credit consumption, cancellation only preventing new uploads while submitted tasks may still run, unstarted entries meaning not uploaded, and the auto_approve/human-review limitation that MCP cannot approve. These are exactly the operational traits an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and return behavior, then packs concurrency, credits, retry, and cancellation caveats into few sentences with no filler. Dense but each sentence carries operational weight; minor strain from cramming several caveats into the tail.
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?
An output schema exists so return values need not be explained, yet the description still notes the async task_id-per-upload contract. Combined with annotations and near-complete schema coverage, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 86%, so baseline is 3, but the description adds real meaning for auto_approve (default true, false triggers human review MCP cannot perform) and reinforces folder_path/credit implications. It does not clarify split, template_id, or pdf_password beyond what the schema already documents.
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 specific verb and resource ('Start background extraction') plus the exact scope: supported files directly inside a local folder, skipping directories and subfolders. The nonrecursive local-folder framing distinguishes it from sibling file/folder extraction tools without needing the schema open.
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 follow-up workflow ('use wait_for_task_extraction for each task, then fetch or download results using its document IDs') and a retry precondition (inspect failed entries and recovery IDs before retrying). It does not explicitly contrast with extract_folder or start_file_extraction, so routing among the extraction starters still takes some inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_quick_schema_creationStart Quick Schema CreationA
Upload one local file to automatically create extraction schemas/templates; use when the user authorized schema creation, which may consume credits. Returns run_id for get_quick_schema_creation or wait_for_quick_schema_creation, not an extraction task_id or export_job_id. Completed runs return generated template IDs and saved document IDs; inspect those before submitting another extraction. Supply upload_batch_id and source_upload_id only when provided by an external batched-upload workflow; MCP does not create upload batches. Starting again can create duplicate work.
| Name | Required | Description | Default |
|---|---|---|---|
| api_url | No | ||
| file_path | Yes | Path to a local document on the machine running this MCP server, not a URL or chat attachment. Supported extensions: .pdf, .jpg, .jpeg, .png, .heic, .heif. Prefer an absolute path; relative paths use the server's working directory and ~ is not expanded. | |
| folder_id | No | Optional remote Suparse folder ID to assign to the source document. | |
| pdf_password | No | Optional encrypted-PDF password. Treat this as a secret. | |
| upload_batch_id | No | Optional existing upload batch ID from an external batch workflow. | |
| source_upload_id | No | Optional source upload ID from an external batch workflow. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| run_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare write/non-idempotent/open-world, and the description adds real behavioral context beyond them: credit consumption, the duplicate-work hazard, the fact that MCP does not create upload batches, and what a completed run returns (template IDs and saved document IDs) that should be inspected before another extraction.
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?
Purpose is front-loaded in the first clause and every sentence carries information (output routing, return contents, conditional params, duplicate warning). It is dense and clause-heavy, but no sentence 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?
For a write tool with an output schema, the description covers the trigger condition, the cost implication, the correct follow-up tools, and the idempotency hazard. Nothing an agent needs to invoke this 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 coverage is 83%, so the baseline is 3, and the description adds genuine meaning for two parameters: upload_batch_id and source_upload_id are only supplied by an external batched-upload workflow, and only one local file is accepted. It does not add detail for file_path, folder_id, or pdf_password 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?
States a specific verb and resource ('Upload one local file to automatically create extraction schemas/templates') and explicitly distinguishes its output from sibling artifacts ('not an extraction task_id or export_job_id'). An agent can separate this from start_file_extraction and the export tools without opening any 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 the triggering condition ('use when the user authorized schema creation, which may consume credits') and routes the agent to the correct polling siblings (get_quick_schema_creation / wait_for_quick_schema_creation). It also warns against re-invocation ('Starting again can create duplicate work').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_export_jobWait for Export JobARead-onlyIdempotent
Wait for an existing export_job_id; does not submit an export or download its file. On completion, use download_export_job to save the artifact. Defaults to a 60000-millisecond completion wait including polling retries, not the full MCP call. On polling timeout, keep the export_job_id and call get_export_job or wait_for_export_job again instead of submitting another export. Failed, expired, or unsupported jobs may produce errors; inspect recovery details.
| Name | Required | Description | Default |
|---|---|---|---|
| api_url | No | ||
| export_job_id | Yes | Remote Suparse export job ID. | |
| wait_timeout_ms | No | Milliseconds to wait for completion; defaults to 60000. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes | |
| export_job_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/idempotent, and the description adds behavior they cannot convey: the 60000ms default covers polling retries and is not the full MCP call, timeouts are recoverable (job id remains valid), and failed/expired/unsupported jobs surface errors with recovery details. That is real operational context beyond the structured 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?
Four sentences, all earning their place, with the what-it-does and what-it-does-not-do front-loaded before the completion workflow and timeout recovery. Slightly dense with three distinct guidance blocks, but nothing is 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?
An output schema exists so return values need no explanation, and the description still covers the complete lifecycle an agent needs: prerequisite job id, wait semantics, success next step, timeout recovery, and failure modes. Nothing required to invoke or recover 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 coverage is 67% (api_url undocumented) and the two described parameters already carry their own schema text, but the description clarifies the semantics of wait_timeout_ms as a polling-window budget including retries rather than a hard call timeout — meaning the schema alone does not convey.
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 specific verb (wait) on a specific resource (an existing export_job_id) and explicitly negates two adjacent behaviors: it does not submit an export and does not download its file. That negative framing separates it cleanly from start_file_extraction and download_export_job without needing their schemas.
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 the full workflow: call this to wait, then use download_export_job to save the artifact. It also covers the non-obvious branch — on polling timeout, retain the export_job_id and call get_export_job or this tool again rather than submitting another export, which directly prevents duplicate-job misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_quick_schema_creationWait for Quick Schema CreationARead-onlyIdempotent
Wait for an existing quick-schema run_id until result.status is completed, completed_with_errors, or failed. Terminal failure is returned in result, so inspect status and failed_documents rather than assuming a successful tool call means full success. Returns generated template IDs and saved document IDs for future extraction or result retrieval. SDK defaults are 5 seconds between polls and 300 attempts; choose a smaller max_poll_attempts for short client timeouts. On polling timeout, check or wait on the same run_id rather than starting another run.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | run_id returned by start_quick_schema_creation; not an extraction task ID, document ID, or export job ID. | |
| api_url | No | ||
| poll_interval | No | Seconds between status requests. SDK default: 5. | |
| max_poll_attempts | No | Maximum status requests before polling timeout. SDK default: 300. Set lower to fit the MCP client's tool timeout; resume with the same run_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| run_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare safe/idempotent read behavior, but the description adds substantial context beyond them: terminal failure is returned in result, so a successful tool call doesn't imply success; the agent must inspect status and failed_documents. It also discloses SDK polling defaults (5s/300 attempts) and the timeout/resume 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?
Front-loaded with the wait condition and terminal states, then progressively adds the failure caveat, return values, and polling guidance. Every sentence carries actionable information with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still usefully notes the return of template IDs and document IDs. Combined with the polling and timeout guidance, nothing an agent needs to call and correctly interpret this tool 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 coverage is 75%, so the schema already documents run_id and poll_interval formats. The description nonetheless adds real meaning for max_poll_attempts (set lower to fit client tool timeout, resume with same run_id), which goes beyond the schema's terse wording.
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?
Specific verb+resource: waits on an existing quick-schema run_id until a terminal status. It clearly distinguishes itself from sibling start_quick_schema_creation and get_quick_schema_creation by naming the run_id produced by the starter.
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 conditions plus failure-handling guidance: choose a smaller max_poll_attempts for short client timeouts, and on timeout re-check or wait on the same run_id rather than starting a new run. It routes the agent away from the wrong alternative action (starting another run).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_task_extractionWait for Task ExtractionARead-onlyIdempotent
Wait for an existing extraction task_id; returns status and document_ids, not extracted data. completed and partially_completed return successfully; failed and insufficient_credits produce errors. Partial completion is not success for every document. Use fetch_document_result or download_results with the returned document IDs. Defaults to poll_interval 2 seconds and max_poll_attempts 3; SDK backoff and retries mean this is not a strict wall-clock deadline. On polling timeout, call again with the same task_id rather than uploading again. This does not approve documents awaiting human review.
| Name | Required | Description | Default |
|---|---|---|---|
| api_url | No | ||
| task_id | Yes | Remote Suparse task ID, not a local path or document ID. | |
| poll_interval | No | Initial polling interval in seconds; defaults to 2. SDK backoff can increase the actual delay. | |
| max_poll_attempts | No | Maximum task polling attempts; defaults to 3. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| task_id | Yes | |
| document_ids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/idempotentHint/openWorldHint annotations by disclosing terminal-state semantics (completed and partially_completed succeed; failed and insufficient_credits error), the warning that partial completion is not success for every document, and that SDK backoff/retries mean the poll window is not a strict wall-clock deadline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the return contract and the success/failure states, then layers downstream routing, polling caveats and the review exclusion. Every sentence carries operational information; none is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers outcome semantics, error modes, retry-on-timeout behavior, downstream tooling and an explicit non-capability, and it need not explain return values since an output schema exists. An agent has everything needed to invoke and interpret this call 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 schema already documents task_id, poll_interval and max_poll_attempts at 75% coverage, and the description largely restates the defaults (2s, 3 attempts). It does add genuine meaning by explaining that backoff makes the effective delay larger than poll_interval, but the api_url parameter is left entirely unexplained.
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?
Names a specific verb+resource ('Wait for an existing extraction task_id') and immediately scopes the return value ('returns status and document_ids, not extracted data'), which separates it from get_task_results, fetch_document_result and download_results without opening any 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?
Explicitly routes the agent downstream ('Use fetch_document_result or download_results with the returned document IDs'), handles the timeout case ('call again with the same task_id rather than uploading again'), and states an exclusion ('does not approve documents awaiting human review'). This is when/when-not/alternatives guidance in full.
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.
17 tool updates
v1.5.0- Changed
delete_documents4 fields changed- removed
Input schema / properties / api_url / descriptionRemoved value: -"Optional API base URL. Defaults to SUPARSE_API_URL or Suparse production API." - removed
Input schema / properties / api_url / formatRemoved value: -"uri" - added
Input schema / properties / api_url / notAdded value: +{} - removed
Input schema / properties / api_url / typeRemoved value: -"string"
- Added
download_export_job - Changed
download_results20 fields changed- removed
Input schema / properties / api_url / descriptionRemoved value: -"Optional API base URL. Defaults to SUPARSE_API_URL or Suparse production API." - removed
Input schema / properties / api_url / formatRemoved value: -"uri" - added
Input schema / properties / api_url / notAdded value: +{} - removed
Input schema / properties / api_url / typeRemoved value: -"string" - changed
Input schema / properties / export_type / descriptionPrevious value: -"Export mode for csv, xlsx, and google_sheets. Defaults to unified."New value: +"Export mode for CSV, XLSX, and Google Sheets. Defaults to unified. Accepted for JSON, which currently has the same task-group shape for either value." - changed
Input schema / properties / format / descriptionPrevious value: -"Export format to write to local disk. Use this tool for csv and xlsx."New value: +"Export format to save locally. Use this tool for JSON, CSV, XLSX, or Google Sheets; google_sheets requires a working Google integration and saves response metadata and sheet URLs as JSON, not a spreadsheet binary." - added
Input schema / properties / idempotency_keyAdded value: +{ + "description": "Optional UUID idempotency key. Retain this key and replay the identical document IDs, format, export type, and layout if submission confirmation is lost.", + "format": "uuid", + "type": "string" +} - changed
Input schema / properties / output_path / descriptionPrevious value: -"Optional local output file path or existing directory. When omitted, writes to the current working directory using the API-provided or generated filename."New value: +"Optional local file path or existing directory on the server's machine. Existing files are overwritten. Prefer an absolute path; ~ is not expanded. Omit to use the server's working directory with an API-provided or generated filename; check the returned output_path for the actual artifact, which may be ZIP." - added
Input schema / properties / unpackAdded value: +{ + "default": false, + "description": "For CSV/XLSX only: extract a returned ZIP into a new folder next to the saved archive and return output_paths. Keeps the ZIP. A single workbook or CSV is returned directly. Defaults false.", + "type": "boolean" +} - added
Input schema / properties / wait_timeout_msAdded value: +{ + "description": "Maximum time in milliseconds to wait for an accepted export job to complete; defaults to 60000. This bounds completion waiting, including polling retries, not submission or transfer. Allow enough total time in the MCP client for all phases.", + "exclusiveMinimum": 0, + "type": "integer" +} - added
Input schema / properties / xlsx_layoutAdded value: +{ + "description": "XLSX layout. Applies only to xlsx exports and defaults to standard.", + "enum": [ + "standard", + "flat" + ], + "type": "string" +} - added
Output schema / properties / artifact_formatAdded value: +{ + "type": "string" +} - added
Output schema / properties / content_typeAdded value: +{ + "type": "string" +} - added
Output schema / properties / export_job_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / google_sheets_metadataAdded value: +{ + "additionalProperties": false, + "properties": { + "created_at": { + "type": "string" + }, + "folder_url": { + "type": "string" + }, + "message": { + "type": "string" + }, + "spreadsheet_id": { + "type": "string" + }, + "spreadsheet_url": { + "type": "string" + }, + "spreadsheets": { + "items": { + "additionalProperties": false, + "properties": { + "spreadsheet_id": { + "type": "string" + }, + "spreadsheet_url": { + "type": "string" + }, + "template_group_id": { + "type": [ + "string", + "null" + ] + }, + "template_name": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "spreadsheet_id", + "spreadsheet_url" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +} - added
Output schema / properties / idempotency_keyAdded value: +{ + "type": "string" +} - added
Output schema / properties / output_pathsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / requested_formatAdded value: +{ + "type": "string" +} - added
Output schema / properties / xlsx_layoutAdded value: +{ + "enum": [ + "standard", + "flat" + ], + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "format", - "export_type", - "output_path", - "document_ids" -]New value: +[ + "format", + "requested_format", + "artifact_format", + "content_type", + "export_type", + "output_path", + "document_ids" +]
- Changed
extract_file21 fields changed- removed
Input schema / properties / api_url / descriptionRemoved value: -"Optional API base URL. Defaults to SUPARSE_API_URL or Suparse production API." - removed
Input schema / properties / api_url / formatRemoved value: -"uri" - added
Input schema / properties / api_url / notAdded value: +{} - removed
Input schema / properties / api_url / typeRemoved value: -"string" - added
Input schema / properties / auto_approveAdded value: +{ + "description": "Automatically approve extracted documents. Defaults to true. Set false only when human review is requested; use a start-only extraction tool to retain the task ID. MCP cannot approve documents, and combined extraction may time out while review is pending.", + "type": "boolean" +} - changed
Input schema / properties / cleanup / descriptionPrevious value: -"Only valid with result_mode return_json. Deletes processed Suparse documents after JSON results are returned, so later exports cannot be fetched from those document IDs."New value: +"Defaults to false. Set true only when remote deletion is requested. Only valid with result_mode return_json. Deletes Suparse documents only for fully completed tasks with JSON exports covering every requested document, after all workers settle. Cleanup is skipped after cancellation. Later exports cannot use deleted document IDs." - changed
Input schema / properties / file_path / descriptionPrevious value: -"Local path to a supported document file."New value: +"Path to a local document on the machine running this MCP server, not a URL or chat attachment. Supported extensions: .pdf, .jpg, .jpeg, .png, .heic, .heif. Prefer an absolute path; relative paths use the server's working directory and ~ is not expanded." - added
Input schema / properties / folder_idAdded value: +{ + "description": "Optional remote Suparse folder ID to assign to uploaded documents.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / pdf_passwordAdded value: +{ + "description": "Optional password for an encrypted PDF. Treat this as a secret; it is used only for the upload and is not returned in results.", + "maxLength": 256, + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / result_mode / descriptionPrevious value: -"Controls whether extraction results in json format are returned directly. Use return_json only when you need the full JSON extraction in the MCP response. In all other cases you can retrieve the results in format of choice using download_results"New value: +"Defaults to defer: upload and wait for processing, then return task status and document IDs without exporting. Defer does not mean background processing; use a start-only tool for that. return_json additionally exports full JSON into the MCP response and can consume substantial context. Use download_results to save large results or other export formats." - changed
Input schema / properties / template_id / descriptionPrevious value: -"Optional extraction template ID. Use only a non-system team template ID from list_templates. Do not pass system template IDs directly; ask the user to add the matching system template to their templates first. Omit to let Suparse auto-detect."New value: +"Optional extraction template ID. Use only a non-system team template ID from list_templates. System template IDs are discovery-only and cannot be passed directly. Omit to let Suparse auto-detect, or use an authorized quick-schema workflow to create a team template." - added
Input schema / properties / wait_timeout_msAdded value: +{ + "description": "For return_json, milliseconds to wait for each export to complete; defaults to 60000. Submission and transfer are separate phases. Ignored in defer mode.", + "exclusiveMinimum": 0, + "type": "integer" +} - added
Output schema / properties / cancelledAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / cleanupAdded value: +{ + "additionalProperties": false, + "properties": { + "deleted_document_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "retained_document_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "enum": [ + "succeeded", + "failed", + "skipped" + ], + "type": "string" + } + }, + "required": [ + "status", + "deleted_document_ids", + "retained_document_ids" + ], + "type": "object" +} - added
Output schema / properties / exportsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "export_job_id": { + "type": "string" + }, + "file_path": { + "type": "string" + }, + "idempotency_key": { + "type": "string" + } + }, + "required": [ + "file_path" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / failed / items / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "error": { - "type": "string" - }, - "file_path": { - "type": "string" - }, - "task_id": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "file_path", - "task_id", - "error" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "type": "string" - }, - "file": { - "type": "string" - } - }, - "required": [ - "file", - "error" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "cancelled": { + "type": "boolean" + }, + "code": { + "type": "string" + }, + "error": { + "type": "string" + }, + "error_type": { + "type": "string" + }, + "file_path": { + "type": "string" + }, + "meta": { + "additionalProperties": {}, + "type": "object" + }, + "next_action": { + "type": "string" + }, + "partial_result": {}, + "reason": { + "type": "string" + }, + "recovery": { + "additionalProperties": false, + "properties": { + "export_job_id": { + "type": "string" + }, + "export_request": { + "additionalProperties": false, + "properties": { + "document_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "export_type": { + "enum": [ + "original", + "unified" + ], + "type": "string" + }, + "format": { + "enum": [ + "json", + "csv", + "xlsx", + "google_sheets" + ], + "type": "string" + }, + "xlsx_layout": { + "enum": [ + "standard", + "flat" + ], + "type": "string" + } + }, + "required": [ + "document_ids", + "format", + "export_type" + ], + "type": "object" + }, + "idempotency_key": { + "type": "string" + }, + "job": { + "additionalProperties": false, + "properties": { + "artifact": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "checksum_sha256": { + "type": "string" + }, + "content_type": { + "type": "string" + }, + "filename": { + "type": "string" + }, + "size_bytes": { + "type": "number" + } + }, + "required": [ + "filename", + "content_type", + "size_bytes", + "checksum_sha256" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "attempt_count": { + "type": "number" + }, + "created_at": { + "type": "string" + }, + "effective_artifact_format": { + "type": [ + "string", + "null" + ] + }, + "error": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "meta": { + "additionalProperties": {}, + "type": "object" + }, + "retry_after_seconds": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "expired_at": { + "type": [ + "string", + "null" + ] + }, + "expires_at": { + "type": [ + "string", + "null" + ] + }, + "export_job_id": { + "type": "string" + }, + "export_type": { + "type": "string" + }, + "generated_count": { + "type": "number" + }, + "initial_excluded_count": { + "type": "number" + }, + "initial_exportable_count": { + "type": "number" + }, + "replayed": { + "type": "boolean" + }, + "requested_by_user_email": { + "type": [ + "string", + "null" + ] + }, + "requested_by_user_id": { + "type": [ + "string", + "null" + ] + }, + "requested_by_user_name": { + "type": [ + "string", + "null" + ] + }, + "requested_count": { + "type": "number" + }, + "requested_format": { + "type": "string" + }, + "runtime_excluded_count": { + "type": "number" + }, + "status": { + "type": "string" + }, + "total_matching_count": { + "type": "number" + }, + "xlsx_layout": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "export_job_id", + "status", + "requested_format", + "effective_artifact_format", + "export_type", + "xlsx_layout", + "created_at", + "expired_at", + "requested_by_user_id", + "requested_by_user_name", + "requested_by_user_email", + "requested_count", + "total_matching_count", + "initial_exportable_count", + "initial_excluded_count", + "generated_count", + "runtime_excluded_count", + "attempt_count", + "expires_at", + "artifact", + "error", + "replayed" + ], + "type": "object" + }, + "last_status": { + "type": "string" + }, + "operation_may_be_running": { + "type": "boolean" + }, + "source_upload_id": { + "type": "string" + }, + "storage_status_code": { + "type": "number" + }, + "task_id": { + "type": "string" + }, + "upload_batch_id": { + "type": "string" + }, + "upload_reference_id": { + "type": "string" + } + }, + "type": "object" + }, + "retry_after_seconds": { + "type": [ + "number", + "null" + ] + }, + "status_code": { + "type": "number" + }, + "task_id": { + "type": [ + "string", + "null" + ] + }, + "unstarted": { + "type": "boolean" + } + }, + "required": [ + "file_path", + "task_id", + "error" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "cancelled": { + "$ref": "#/properties/failed/items/anyOf/0/properties/cancelled" + }, + "code": { + "$ref": "#/properties/failed/items/anyOf/0/properties/code" + }, + "error": { + "type": "string" + }, + "error_type": { + "$ref": "#/properties/failed/items/anyOf/0/properties/error_type" + }, + "file": { + "type": "string" + }, + "meta": { + "$ref": "#/properties/failed/items/anyOf/0/properties/meta" + }, + "next_action": { + "$ref": "#/properties/failed/items/anyOf/0/properties/next_action" + }, + "partial_result": { + "$ref": "#/properties/failed/items/anyOf/0/properties/partial_result" + }, + "reason": { + "$ref": "#/properties/failed/items/anyOf/0/properties/reason" + }, + "recovery": { + "$ref": "#/properties/failed/items/anyOf/0/properties/recovery" + }, + "retry_after_seconds": { + "$ref": "#/properties/failed/items/anyOf/0/properties/retry_after_seconds" + }, + "status_code": { + "$ref": "#/properties/failed/items/anyOf/0/properties/status_code" + }, + "unstarted": { + "$ref": "#/properties/failed/items/anyOf/0/properties/unstarted" + } + }, + "required": [ + "file", + "error" + ], + "type": "object" + } +] - added
Output schema / properties / failed_countAdded value: +{ + "type": "number" +} - added
Output schema / properties / guidanceAdded value: +{ + "type": "string" +} - changed
Output schema / properties / succeeded / items / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "document_ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "file_path": { - "type": "string" - }, - "task_id": { - "type": "string" - } - }, - "required": [ - "file_path", - "task_id", - "document_ids" - ], - "type": "object" - }, - { - "additionalProperties": true, - "properties": { - "documents": { - "items": {}, - "type": "array" - }, - "original_file": { - "type": "string" - }, - "task_id": { - "type": "string" - }, - "total_documents_extracted": { - "type": "number" - } - }, - "required": [ - "task_id", - "original_file", - "total_documents_extracted", - "documents" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "document_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "file_path": { + "type": "string" + }, + "status": { + "type": "string" + }, + "task_id": { + "type": "string" + } + }, + "required": [ + "file_path", + "task_id", + "document_ids" + ], + "type": "object" + }, + { + "additionalProperties": true, + "properties": { + "documents": { + "items": {}, + "type": "array" + }, + "original_file": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "total_documents_extracted": { + "type": "number" + } + }, + "required": [ + "task_id", + "original_file", + "total_documents_extracted", + "documents" + ], + "type": "object" + } +] - added
Output schema / properties / tasksAdded value: +{ + "items": { + "$ref": "#/properties/succeeded/items/anyOf/0" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "result_mode", - "total", - "succeeded", - "failed" -]New value: +[ + "result_mode", + "total", + "succeeded", + "failed", + "failed_count" +]
- Changed
extract_folder21 fields changed- removed
Input schema / properties / api_url / descriptionRemoved value: -"Optional API base URL. Defaults to SUPARSE_API_URL or Suparse production API." - removed
Input schema / properties / api_url / formatRemoved value: -"uri" - added
Input schema / properties / api_url / notAdded value: +{} - removed
Input schema / properties / api_url / typeRemoved value: -"string" - added
Input schema / properties / auto_approveAdded value: +{ + "description": "Automatically approve extracted documents. Defaults to true. Set false only when human review is requested; use a start-only extraction tool to retain the task ID. MCP cannot approve documents, and combined extraction may time out while review is pending.", + "type": "boolean" +} - changed
Input schema / properties / cleanup / descriptionPrevious value: -"Only valid with result_mode return_json. Deletes processed Suparse documents after JSON results are returned, so later exports cannot be fetched from those document IDs."New value: +"Defaults to false. Set true only when remote deletion is requested. Only valid with result_mode return_json. Deletes Suparse documents only for fully completed tasks with JSON exports covering every requested document, after all workers settle. Cleanup is skipped after cancellation. Later exports cannot use deleted document IDs." - added
Input schema / properties / folder_idAdded value: +{ + "description": "Optional remote Suparse folder ID to assign to uploaded documents.", + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / folder_path / descriptionPrevious value: -"Local folder containing supported document files."New value: +"Path to a local folder on the machine running this MCP server, not a remote Suparse folder ID. Scans supported files directly inside it, nonrecursively. Prefer an absolute path; relative paths use the server's working directory and ~ is not expanded." - added
Input schema / properties / pdf_passwordAdded value: +{ + "description": "Optional password for an encrypted PDF. Treat this as a secret; it is used only for the upload and is not returned in results.", + "maxLength": 256, + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / result_mode / descriptionPrevious value: -"Controls whether extraction results in json format are returned directly. Use return_json only when you need the full JSON extraction in the MCP response. In all other cases you can retrieve the results in format of choice using download_results"New value: +"Defaults to defer: upload and wait for processing, then return task status and document IDs without exporting. Defer does not mean background processing; use a start-only tool for that. return_json additionally exports full JSON into the MCP response and can consume substantial context. Use download_results to save large results or other export formats." - changed
Input schema / properties / template_id / descriptionPrevious value: -"Optional extraction template ID. Use only a non-system team template ID from list_templates. Do not pass system template IDs directly; ask the user to add the matching system template to their templates first. Omit to let Suparse auto-detect."New value: +"Optional extraction template ID. Use only a non-system team template ID from list_templates. System template IDs are discovery-only and cannot be passed directly. Omit to let Suparse auto-detect, or use an authorized quick-schema workflow to create a team template." - added
Input schema / properties / wait_timeout_msAdded value: +{ + "description": "For return_json, milliseconds to wait for each export to complete; defaults to 60000. Submission and transfer are separate phases. Ignored in defer mode.", + "exclusiveMinimum": 0, + "type": "integer" +} - added
Output schema / properties / cancelledAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / cleanupAdded value: +{ + "additionalProperties": false, + "properties": { + "deleted_document_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "retained_document_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "enum": [ + "succeeded", + "failed", + "skipped" + ], + "type": "string" + } + }, + "required": [ + "status", + "deleted_document_ids", + "retained_document_ids" + ], + "type": "object" +} - added
Output schema / properties / exportsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "export_job_id": { + "type": "string" + }, + "file_path": { + "type": "string" + }, + "idempotency_key": { + "type": "string" + } + }, + "required": [ + "file_path" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / failed / items / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "error": { - "type": "string" - }, - "file_path": { - "type": "string" - }, - "task_id": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "file_path", - "task_id", - "error" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "type": "string" - }, - "file": { - "type": "string" - } - }, - "required": [ - "file", - "error" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "cancelled": { + "type": "boolean" + }, + "code": { + "type": "string" + }, + "error": { + "type": "string" + }, + "error_type": { + "type": "string" + }, + "file_path": { + "type": "string" + }, + "meta": { + "additionalProperties": {}, + "type": "object" + }, + "next_action": { + "type": "string" + }, + "partial_result": {}, + "reason": { + "type": "string" + }, + "recovery": { + "additionalProperties": false, + "properties": { + "export_job_id": { + "type": "string" + }, + "export_request": { + "additionalProperties": false, + "properties": { + "document_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "export_type": { + "enum": [ + "original", + "unified" + ], + "type": "string" + }, + "format": { + "enum": [ + "json", + "csv", + "xlsx", + "google_sheets" + ], + "type": "string" + }, + "xlsx_layout": { + "enum": [ + "standard", + "flat" + ], + "type": "string" + } + }, + "required": [ + "document_ids", + "format", + "export_type" + ], + "type": "object" + }, + "idempotency_key": { + "type": "string" + }, + "job": { + "additionalProperties": false, + "properties": { + "artifact": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "checksum_sha256": { + "type": "string" + }, + "content_type": { + "type": "string" + }, + "filename": { + "type": "string" + }, + "size_bytes": { + "type": "number" + } + }, + "required": [ + "filename", + "content_type", + "size_bytes", + "checksum_sha256" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "attempt_count": { + "type": "number" + }, + "created_at": { + "type": "string" + }, + "effective_artifact_format": { + "type": [ + "string", + "null" + ] + }, + "error": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "meta": { + "additionalProperties": {}, + "type": "object" + }, + "retry_after_seconds": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "expired_at": { + "type": [ + "string", + "null" + ] + }, + "expires_at": { + "type": [ + "string", + "null" + ] + }, + "export_job_id": { + "type": "string" + }, + "export_type": { + "type": "string" + }, + "generated_count": { + "type": "number" + }, + "initial_excluded_count": { + "type": "number" + }, + "initial_exportable_count": { + "type": "number" + }, + "replayed": { + "type": "boolean" + }, + "requested_by_user_email": { + "type": [ + "string", + "null" + ] + }, + "requested_by_user_id": { + "type": [ + "string", + "null" + ] + }, + "requested_by_user_name": { + "type": [ + "string", + "null" + ] + }, + "requested_count": { + "type": "number" + }, + "requested_format": { + "type": "string" + }, + "runtime_excluded_count": { + "type": "number" + }, + "status": { + "type": "string" + }, + "total_matching_count": { + "type": "number" + }, + "xlsx_layout": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "export_job_id", + "status", + "requested_format", + "effective_artifact_format", + "export_type", + "xlsx_layout", + "created_at", + "expired_at", + "requested_by_user_id", + "requested_by_user_name", + "requested_by_user_email", + "requested_count", + "total_matching_count", + "initial_exportable_count", + "initial_excluded_count", + "generated_count", + "runtime_excluded_count", + "attempt_count", + "expires_at", + "artifact", + "error", + "replayed" + ], + "type": "object" + }, + "last_status": { + "type": "string" + }, + "operation_may_be_running": { + "type": "boolean" + }, + "source_upload_id": { + "type": "string" + }, + "storage_status_code": { + "type": "number" + }, + "task_id": { + "type": "string" + }, + "upload_batch_id": { + "type": "string" + }, + "upload_reference_id": { + "type": "string" + } + }, + "type": "object" + }, + "retry_after_seconds": { + "type": [ + "number", + "null" + ] + }, + "status_code": { + "type": "number" + }, + "task_id": { + "type": [ + "string", + "null" + ] + }, + "unstarted": { + "type": "boolean" + } + }, + "required": [ + "file_path", + "task_id", + "error" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "cancelled": { + "$ref": "#/properties/failed/items/anyOf/0/properties/cancelled" + }, + "code": { + "$ref": "#/properties/failed/items/anyOf/0/properties/code" + }, + "error": { + "type": "string" + }, + "error_type": { + "$ref": "#/properties/failed/items/anyOf/0/properties/error_type" + }, + "file": { + "type": "string" + }, + "meta": { + "$ref": "#/properties/failed/items/anyOf/0/properties/meta" + }, + "next_action": { + "$ref": "#/properties/failed/items/anyOf/0/properties/next_action" + }, + "partial_result": { + "$ref": "#/properties/failed/items/anyOf/0/properties/partial_result" + }, + "reason": { + "$ref": "#/properties/failed/items/anyOf/0/properties/reason" + }, + "recovery": { + "$ref": "#/properties/failed/items/anyOf/0/properties/recovery" + }, + "retry_after_seconds": { + "$ref": "#/properties/failed/items/anyOf/0/properties/retry_after_seconds" + }, + "status_code": { + "$ref": "#/properties/failed/items/anyOf/0/properties/status_code" + }, + "unstarted": { + "$ref": "#/properties/failed/items/anyOf/0/properties/unstarted" + } + }, + "required": [ + "file", + "error" + ], + "type": "object" + } +] - added
Output schema / properties / failed_countAdded value: +{ + "type": "number" +} - added
Output schema / properties / guidanceAdded value: +{ + "type": "string" +} - changed
Output schema / properties / succeeded / items / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "document_ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "file_path": { - "type": "string" - }, - "task_id": { - "type": "string" - } - }, - "required": [ - "file_path", - "task_id", - "document_ids" - ], - "type": "object" - }, - { - "additionalProperties": true, - "properties": { - "documents": { - "items": {}, - "type": "array" - }, - "original_file": { - "type": "string" - }, - "task_id": { - "type": "string" - }, - "total_documents_extracted": { - "type": "number" - } - }, - "required": [ - "task_id", - "original_file", - "total_documents_extracted", - "documents" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "document_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "file_path": { + "type": "string" + }, + "status": { + "type": "string" + }, + "task_id": { + "type": "string" + } + }, + "required": [ + "file_path", + "task_id", + "document_ids" + ], + "type": "object" + }, + { + "additionalProperties": true, + "properties": { + "documents": { + "items": {}, + "type": "array" + }, + "original_file": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "total_documents_extracted": { + "type": "number" + } + }, + "required": [ + "task_id", + "original_file", + "total_documents_extracted", + "documents" + ], + "type": "object" + } +] - added
Output schema / properties / tasksAdded value: +{ + "items": { + "$ref": "#/properties/succeeded/items/anyOf/0" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "result_mode", - "total", - "succeeded", - "failed" -]New value: +[ + "result_mode", + "total", + "succeeded", + "failed", + "failed_count" +]
- Added
fetch_document_result - Changed
fetch_json_results9 fields changed- removed
Input schema / properties / api_url / descriptionRemoved value: -"Optional API base URL. Defaults to SUPARSE_API_URL or Suparse production API." - removed
Input schema / properties / api_url / formatRemoved value: -"uri" - added
Input schema / properties / api_url / notAdded value: +{} - removed
Input schema / properties / api_url / typeRemoved value: -"string" - changed
Input schema / properties / export_type / descriptionPrevious value: -"Export mode for JSON results. Defaults to unified."New value: +"Defaults to unified. JSON currently has the same task-group shape for original and unified." - added
Input schema / properties / idempotency_keyAdded value: +{ + "description": "Optional UUID idempotency key. Retain this key and replay the identical document IDs, format, export type, and layout if submission confirmation is lost.", + "format": "uuid", + "type": "string" +} - added
Input schema / properties / wait_timeout_msAdded value: +{ + "description": "Maximum time in milliseconds to wait for an accepted export job to complete; defaults to 60000. This bounds completion waiting, including polling retries, not submission or transfer. Allow enough total time in the MCP client for all phases.", + "exclusiveMinimum": 0, + "type": "integer" +} - added
Output schema / properties / export_job_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / idempotency_keyAdded value: +{ + "type": "string" +}
- Added
get_export_job - Added
get_quick_schema_creation - Added
get_task_results - Changed
list_templates15 fields changed- removed
Input schema / properties / api_url / descriptionRemoved value: -"Optional API base URL. Defaults to SUPARSE_API_URL or Suparse production API." - removed
Input schema / properties / api_url / formatRemoved value: -"uri" - added
Input schema / properties / api_url / notAdded value: +{} - removed
Input schema / properties / api_url / typeRemoved value: -"string" - changed
Input schema / properties / include_system / descriptionPrevious value: -"Include discovery-only system templates in addition to team templates. System templates returned here are not directly usable for extraction through MCP until the user adds them to their templates in the Suparse UI."New value: +"Defaults to false. Include discovery-only system templates in addition to team templates. Do not pass system template IDs to extraction tools. MCP cannot add system templates to the team; omit template_id for auto-detection or use an authorized quick-schema workflow instead." - added
Input schema / properties / viewAdded value: +{ + "default": "summary", + "description": "Template response view. Summary is compact and recommended for normal template selection; full includes schema, prompts, validation rules, and creator metadata.", + "enum": [ + "summary", + "full" + ], + "type": "string" +} - removed
Output schema / properties / system_templates / items / $refRemoved value: -"#/properties/templates/items" - added
Output schema / properties / system_templates / items / anyOfAdded value: +[ + { + "$ref": "#/properties/templates/items/anyOf/0" + }, + { + "$ref": "#/properties/templates/items/anyOf/1" + } +] - removed
Output schema / properties / team_templates / items / $refRemoved value: -"#/properties/templates/items" - added
Output schema / properties / team_templates / items / anyOfAdded value: +[ + { + "$ref": "#/properties/templates/items/anyOf/0" + }, + { + "$ref": "#/properties/templates/items/anyOf/1" + } +] - removed
Output schema / properties / templates / items / additionalPropertiesRemoved value: -false - added
Output schema / properties / templates / items / anyOfAdded value: +[ + { + "additionalProperties": false, + "properties": { + "created_at": { + "type": "string" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "id": { + "type": "string" + }, + "is_active": { + "type": "boolean" + }, + "is_system_template": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "parent_template_id": { + "type": [ + "string", + "null" + ] + }, + "team_id": { + "type": [ + "string", + "null" + ] + }, + "template_group_id": { + "type": "string" + }, + "template_language": { + "type": "string" + }, + "version": { + "type": "number" + } + }, + "required": [ + "id", + "name", + "template_language", + "template_group_id", + "version", + "is_active", + "is_system_template", + "created_at" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "created_at": { + "$ref": "#/properties/templates/items/anyOf/0/properties/created_at" + }, + "created_by_user_id": { + "type": "string" + }, + "description": { + "$ref": "#/properties/templates/items/anyOf/0/properties/description" + }, + "id": { + "$ref": "#/properties/templates/items/anyOf/0/properties/id" + }, + "is_active": { + "$ref": "#/properties/templates/items/anyOf/0/properties/is_active" + }, + "is_system_template": { + "$ref": "#/properties/templates/items/anyOf/0/properties/is_system_template" + }, + "name": { + "$ref": "#/properties/templates/items/anyOf/0/properties/name" + }, + "parent_template_id": { + "$ref": "#/properties/templates/items/anyOf/0/properties/parent_template_id" + }, + "prompt_set": { + "additionalProperties": {}, + "type": "object" + }, + "saved_document_id": { + "type": [ + "string", + "null" + ] + }, + "schema_definition": { + "additionalProperties": {}, + "type": "object" + }, + "team_id": { + "$ref": "#/properties/templates/items/anyOf/0/properties/team_id" + }, + "template_group_id": { + "$ref": "#/properties/templates/items/anyOf/0/properties/template_group_id" + }, + "template_language": { + "$ref": "#/properties/templates/items/anyOf/0/properties/template_language" + }, + "validation_rules": { + "additionalProperties": {}, + "type": "object" + }, + "version": { + "$ref": "#/properties/templates/items/anyOf/0/properties/version" + } + }, + "required": [ + "id", + "name", + "template_language", + "template_group_id", + "version", + "is_active", + "is_system_template", + "created_at", + "schema_definition", + "prompt_set", + "validation_rules", + "created_by_user_id" + ], + "type": "object" + } +] - removed
Output schema / properties / templates / items / propertiesRemoved value: -{ - "created_at": { - "type": "string" - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "id": { - "type": "string" - }, - "is_active": { - "type": "boolean" - }, - "is_system_template": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "template_language": { - "type": "string" - }, - "version": { - "type": "number" - } -} - removed
Output schema / properties / templates / items / requiredRemoved value: -[ - "id", - "name", - "template_language", - "version", - "is_active", - "is_system_template", - "created_at" -] - removed
Output schema / properties / templates / items / typeRemoved value: -"object"
- Added
start_file_extraction - Added
start_folder_extraction - Added
start_quick_schema_creation - Added
wait_for_export_job - Added
wait_for_quick_schema_creation - Added
wait_for_task_extraction
6 tool updates
v1.3.0- First observed
delete_documents - First observed
download_results - First observed
extract_file - First observed
extract_folder - First observed
fetch_json_results - First observed
list_templates
TDQS
Scored across 17 tools
The set follows three clear async pipelines (extraction, quick-schema, export) with start/get/wait roles, and descriptions explicitly contrast overlapping tools like fetch_json_results vs fetch_document_result vs download_results. However, the combined extract_file/extract_folder vs start_file_extraction/start_folder_extraction pairs and the three result-fetching tools still require careful reading to tell apart.
All names are snake_case verb_noun with a predictable start/get/wait/get_task pattern across workflows. Minor deviations exist: 'file_extraction' is noun-first in start_file_extraction while the combined tool is extract_file, and the verb set spreads across start/wait_for/get/fetch/download/extract/list/delete.
17 tools is on the heavier side, but the domain genuinely requires separate start/wait/inspect/download stages for three distinct async pipelines plus template discovery and deletion. Each tool appears to earn its place, with little obvious redundancy.
The surface covers extraction, schema/template creation, result fetching, export job management, downloads, and deletion—a full lifecycle. Minor gaps remain, such as no explicit cancel-task tool (cancellation is mentioned only in descriptions) and no template editing beyond quick-schema creation.
Maintenance
Related MCP Connectors
Convert documents to structured JSON (invoices, receipts, contracts) in 2 seconds
Turn documents into structured data: parse, extract, classify, split, and fill PDF forms.
Turn any PDF into structured JSON via AI + OCR: invoices, bank statements, contracts.
Invoices and other financial documents to rows: upload, say what to extract, read the rows.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables extraction of text, tables, and structured data from PDFs, images, and office documents using LandingAI's Agentic Document Extraction API. Supports both direct parsing and background job processing for large files with privacy-focused processing.-
- FlicenseNot gradedqualityDmaintenanceEnables document parsing through the Mineru API with support for multiple formats (PDF, DOC, DOCX, PPT, images), OCR, formula recognition, and table extraction in multiple languages.1-
- AlicenseAqualityAmaintenanceEnables document parsing and extraction from PDFs and other formats using the MinerU API. Supports batch processing, page range selection, OCR in 109 languages, and VLM/pipeline models for high-accuracy content extraction.8133 npm10MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to extract structured JSON from invoices and receipts in PDF and image formats using Claude Vision. Supports full document parsing, line item extraction, validation, and batch CSV export with API key or cryptocurrency payment options.MIT