flatmark
Server Details
Document to Markdown MCP server: PDF, Word, PowerPoint, Excel and HTML, with OCR for large files.
- Status
- Healthy
- Uptime
- 100.0% over 22 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- flatmark-dev/flatmark
- GitHub Stars
- 0
- Server Listing
- flatmark
TDQS
Scored across 3 tools
convert_document and submit_conversion_job both convert documents, so there is surface overlap, but the descriptions draw a crisp line between synchronous conversion (≤8 MB, no OCR) and queued conversion with OCR/tables, and explicitly cross-reference each other. get_conversion_job is unambiguously the polling counterpart to submit_conversion_job.
All three names follow a clean verb_noun snake_case pattern: convert_document, submit_conversion_job, get_conversion_job. The job-related pair shares the 'conversion_job' noun, making the workflow legible at a glance.
Three tools is a tight, well-scoped set for a document conversion service: one synchronous entry point and an async submit/poll pair. Every tool earns its place with no filler or redundancy.
The core conversion lifecycle (sync convert, queue job, poll status, webhook callback) is fully covered, including error and result-expiry reporting. Minor gaps exist for ancillary operations like canceling a job or listing/deleting past jobs, but agents can work around these.
Available Tools
3 toolsconvert_documentConvert a document to Markdown in one callARead-onlyInspect
Convert a document up to 8 MB to Markdown and return it directly.
Pass the file as base64 in content_base64, or as a download link in
file, and its name in filename. The extension decides the type: .pdf,
.docx, .pptx, .xlsx, .html, .htm or .txt. Returns markdown and meta
(filename, length in characters). PDFs come back as plain text
without headings and without OCR. For scans, tables and page numbers,
use submit_conversion_job. Works without an API key at the anonymous
rate limit.
Credits: 1 per call.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | The file as a download link, instead of `content_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL. | |
| filename | Yes | The file name with its extension (.pdf, .docx, .pptx, .xlsx, .html, .htm or .txt). The extension decides how the file is read. | |
| content_base64 | No | The file content, base64-encoded. Up to 8 MB before encoding. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations: states the 8 MB cap, that PDFs return plain text without headings or OCR, the 1-credit cost per call, and the anonymous rate-limit behavior. These are exactly the operational facts 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 the core action and size limit, then input methods, then limitations, then cost. Every sentence carries distinct information; no repetition of schema text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't enumerate return fields, yet it still mentions `markdown` and `meta`, and covers the size cap, format limits, alternatives and cost. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real value by framing the either/or of `content_base64` vs `file` and explaining that the extension in `filename` decides the type and the supported extensions.
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 (convert a document to Markdown), plus scope (up to 8 MB) and behavior (return it directly), which distinguishes it from the async submit_conversion_job sibling 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: use submit_conversion_job 'for scans, tables and page numbers', and notes this tool works at the anonymous rate limit without an API key. Both a when-to-use and a when-to-use-something-else are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conversion_jobCheck a queued conversionARead-onlyInspect
Check a queued conversion job you submitted.
Returns job_id and status (queued, running, succeeded or
failed). A succeeded job includes the markdown when it is under
100 KB, otherwise a result_url to download it (also free). A failed job
includes error, one sentence with the reason. Results are deleted
7 days after submission. An expired result is reported in error.
Requires an API key.
Credits: free. This tool is not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The `job_id` returned by `submit_conversion_job`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the readOnlyHint annotation: the full status enum, the 100 KB inline-vs-result_url branch, the 7-day retention with expiry surfaced in error, the API key requirement, and the free/non-metered billing note. This is exactly the behavioral detail structured fields do not 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 purpose, then organized into short paragraphs covering return values, retention, and cost/auth. Every sentence carries operational information; nothing 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?
Despite an output schema existing, the description enriches it with the semantics of each status branch, the size threshold behavior, and expiry handling, plus auth and billing constraints. An agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single job_id parameter is documented as coming from submit_conversion_job, so the description adds nothing parameter-specific. Baseline 3 is appropriate when the schema carries the full burden.
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 ('Check a queued conversion job') and pins it to the job the caller previously submitted, which cleanly separates it from submit_conversion_job (which creates the job) and convert_document (which presumably runs synchronously). An agent can identify the polling role 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?
Usage is implied rather than stated: the phrase 'you submitted' signals this is the follow-up poll to submit_conversion_job, but the description never explicitly says when to call it, how often to poll, or that it should not be used instead of convert_document. Adequate but inferential.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_conversion_jobQueue a document for conversion with OCR and tablesAInspect
Queue a document up to 25 MB and 200 pages for conversion with OCR and tables.
Pass the file as base64 in content_base64, or as a download link in
file, and its name in filename (.pdf, .docx, .pptx, .xlsx, .html,
.htm or .txt). Returns job_id, status and result_url. Call
get_conversion_job with the job_id until status is succeeded or
failed. A conversion may take up to about 2 minutes.
Optional webhook_url: a public http or https URL that receives a POST
with the job's final state. The request carries
X-Appkit-Signature: sha256=<hex>, an HMAC-SHA256 of the raw body keyed
with the returned webhook_secret (shown only once). 3 delivery attempts.
Requires an API key. The credits are refunded if the job fails. The uploaded file is deleted when the job finishes. Results are kept for 7 days after submission.
Credits: 10 per call.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | The file as a download link, instead of `content_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL. | |
| filename | Yes | The file name with its extension (.pdf, .docx, .pptx, .xlsx, .html, .htm or .txt). The extension decides how the file is read. | |
| webhook_url | No | Optional. A public http or https URL that receives the job's final state. | |
| content_base64 | No | The file content, base64-encoded. Up to 25 MB before encoding. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the mutation/open-world profile; the description adds substantial behavior beyond that: 25 MB / 200 page caps, API-key requirement, credit cost and refund-on-failure, file deletion on completion, 7-day result retention, and webhook signature/retry semantics including the one-time webhook_secret exposure. This is exactly the operational context an agent needs before invoking.
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 hard limits, then the input alternatives and async workflow, then webhook and lifecycle details. Dense and largely waste-free, though the returned fields (job_id, status, result_url) restate an output schema that already exists, and the extension list appears twice.
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 4-parameter mutation with nested file object and an output schema, the description covers limits, auth, cost, async polling, webhook contract, data lifecycle and failure handling. 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 100%, so the schema already documents file, filename, webhook_url and content_base64. The description nonetheless reinforces the critical semantics: the extension determines how the file is read, base64 size is measured before encoding, and webhook_url must be public. Marginal but genuine added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Queue a document ... for conversion with OCR and tables') and immediately names the polling companion get_conversion_job. It never distinguishes itself from the sibling convert_document, so an agent choosing between the two queued-vs-sync likely paths gets no help from the text.
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?
Clear operational context: call get_conversion_job with the returned job_id until status is succeeded or failed, and it states the ~2 minute expected duration. It also clarifies the two mutually exclusive input paths (content_base64 vs. file). No explicit when-not-to-use guidance and no differentiation from convert_document.
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.
3 tool updates
- First observed
convert_document - First observed
get_conversion_job - First observed
submit_conversion_job
Related MCP Connectors
Document-to-Markdown MCP server — convert PDF, Office and HTML into LLM-ready Markdown.
Document conversion MCP server: PDF to Markdown, image OCR, spreadsheet parsing.
PDF, Word, PowerPoint, Excel, HTML, EPUB to Markdown: OCR, page ranges, tables, RAG chunking
Documents to Markdown: PDF, DOCX, PPTX, XLSX, HTML. Scanned PDF pages read by AI.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceConverts PDF, Word, and Excel documents to Markdown with image extraction and header/footer removal via MCP or REST API.51MIT
- FlicenseNot gradedqualityCmaintenanceConverts .docx files to Markdown, with optional image extraction and HTML table conversion, accessible via MCP server or Python API.-
- FlicenseNot gradedqualityDmaintenanceConverts documents (PDF, DOCX, images, etc.) to Markdown using Microsoft's Markitdown library, with no local setup required. Integrates with AI agents via MCP for seamless document conversion.1-
- AlicenseNot gradedqualityCmaintenanceMCP server for converting various file formats (PDF, DOCX, images, audio, etc.) to Markdown using Microsoft MarkItDown, with support for large files and Cyrillic text.1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.