flatmark

Document to Markdown MCP server: PDF, Word, PowerPoint, Excel and HTML, with OCR for large files.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
94%
Naming quality
100%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,182Tokens (tool definitions)
~2.4 KBTypical response size
Moderate attention impact (0.92% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "flatmark": {
      "url": "https://api.flatmark.dev/mcp/"
    }
  }
}

Remote endpoints

https://api.flatmark.dev/mcp/streamable-http

What it can do

Tool inventory

Tools (3)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢convert_document(filename, content_base64, file)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "filename": {
      "description": "The file name with its extension (.pdf, .docx, .pptx, .xlsx, .html, .htm or .txt). The extension decides how the file is read.",
      "type": "string"
    },
    "content_base64": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "The file content, base64-encoded. Up to 8 MB before encoding."
    },
    "file": {
      "properties": {
        "download_url": {
          "description": "A public https URL of the file.",
          "type": "string"
        },
        "file_id": {
          "description": "An identifier for the file. ChatGPT sets it; other clients may pass any label, such as the file name.",
          "type": "string"
        },
        "mime_type": {
          "type": "string"
        },
        "file_name": {
          "type": "string"
        }
      },
      "required": [
        "download_url",
        "file_id"
      ],
      "type": "object",
      "default": null,
      "description": "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."
    }
  },
  "required": [
    "filename"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟡submit_conversion_job(filename, content_base64, file, webhook_url)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "filename": {
      "description": "The file name with its extension (.pdf, .docx, .pptx, .xlsx, .html, .htm or .txt). The extension decides how the file is read.",
      "type": "string"
    },
    "content_base64": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "The file content, base64-encoded. Up to 25 MB before encoding."
    },
    "file": {
      "properties": {
        "download_url": {
          "description": "A public https URL of the file.",
          "type": "string"
        },
        "file_id": {
          "description": "An identifier for the file. ChatGPT sets it; other clients may pass any label, such as the file name.",
          "type": "string"
        },
        "mime_type": {
          "type": "string"
        },
        "file_name": {
          "type": "string"
        }
      },
      "required": [
        "download_url",
        "file_id"
      ],
      "type": "object",
      "default": null,
      "description": "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."
    },
    "webhook_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional. A public http or https URL that receives the job's final state."
    }
  },
  "required": [
    "filename"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟢get_conversion_job(job_id)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "job_id": {
      "description": "The `job_id` returned by `submit_conversion_job`.",
      "type": "string"
    }
  },
  "required": [
    "job_id"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded3 tools