MarkItDown-MCP

Microsoft's MCP wrapper for MarkItDown: turn files, web pages and data URIs into Markdown

Official · Microsoft Python Local · stdio Files and storageBrowser automation

78 popularity score ★ 194k ↓ 90k/mo

Connect your client

Local (PyPI)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

FirstTerminal
pip install markitdown-mcp
Claude CodeTerminal
claude mcp add markitdown -- markitdown-mcp
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "markitdown": {
      "command": "markitdown-mcp",
      "args": []
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "markitdown": {
      "command": "markitdown-mcp",
      "args": []
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "markitdown": {
      "type": "stdio",
      "command": "markitdown-mcp",
      "args": []
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.markitdown]
command = "markitdown-mcp"
args = []
Gemini CLITerminal
gemini mcp add --scope user markitdown markitdown-mcp
Local (container)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

FirstTerminal
git clone https://github.com/microsoft/markitdown.git
cd markitdown/packages/markitdown-mcp
docker build -t markitdown-mcp:latest .
Claude CodeTerminal
claude mcp add markitdown -- docker run --rm -i markitdown-mcp:latest
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "markitdown": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "markitdown-mcp:latest"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "markitdown": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "markitdown-mcp:latest"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "markitdown": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "markitdown-mcp:latest"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.markitdown]
command = "docker"
args = ["run", "--rm", "-i", "markitdown-mcp:latest"]
Gemini CLITerminal
gemini mcp add --scope user markitdown docker -- run --rm -i markitdown-mcp:latest

Settings 2

MARKITDOWN_ENABLE_PLUGINS Optional: Set to true, 1 or yes to load installed third-party MarkItDown plugins; the repository's Docker image sets it to True. Default false.
EXIFTOOL_PATH Optional: Path to the exiftool program used for file metadata; read by the MarkItDown library, which otherwise looks for exiftool in well-known system folders. For file metadata.

In a container, a setting goes in with -e NAME=value after docker run.

What it does

MarkItDown-MCP puts Microsoft's MarkItDown conversion library behind a single MCP tool. Given an http:, https:, file: or data: URI, it fetches or opens the resource and hands back its content as Markdown, so an assistant can read a PDF, Word, PowerPoint or Excel file, an HTML page, a CSV or JSON file, a ZIP archive or a YouTube link as plain structured text.

It speaks STDIO by default. With --http it serves Streamable HTTP (at /mcp) and SSE (at /sse) on 127.0.0.1:3001 unless --host or --port says otherwise; --sse is kept as a deprecated alias for --http. The package installs MarkItDown 0.1.x with all of its optional format dependencies and is built on version 2 of the Python MCP SDK.

Some things the package README leaves out, all in the server's source: third-party MarkItDown plugins stay off unless MARKITDOWN_ENABLE_PLUGINS is set to true, 1 or yes, while the repository's Dockerfile switches them on and runs the server as the unprivileged nobody user. Failures come back as short tool errors (an HTTP status, "File conversion failed.", or the operating system's error text for a file) that leave out the resolved file path. The tool builds a plain MarkItDown converter with no LLM client and no Azure endpoint, so the Azure Document Intelligence settings in the MarkItDown README (AZURE_API_KEY, the DefaultAzureCredential fallback, model ID, features and query fields) and its Content Understanding, LLM image description and OCR options apply to the library and its command line, not to this server.

What it needs

RuntimePython 3.10+
Runs onmacOS, Windows, Linux
Also
  • ffmpeg and exiftool for audio and file metadata (optional; the Docker image brings both)

pip install markitdown-mcp puts the markitdown-mcp command on PATH. For the Docker way, Docker plus a clone of the repository: the image is built locally from packages/markitdown-mcp and is not pulled from a registry. No account or API key.

Limits

  • Not covered One tool only: it converts a URI to Markdown and does nothing else.
  • Early release The package is an alpha release (0.0.1a8 on PyPI).
  • Limit No authentication on the HTTP and SSE transports; its makers say it is meant for local use with trusted agents.
  • Not covered Azure Document Intelligence, Azure Content Understanding, LLM image descriptions and LLM OCR are not reachable: the tool passes no Azure endpoint or LLM client, and AZURE_API_KEY is not read by it.
  • Limit In the Docker image, local files are visible only when a directory is mounted (for example at /workdir).

One tool only: it converts a URI to Markdown and does nothing else. The package is an alpha release (0.0.1a7 on PyPI). There is no authentication on the HTTP and SSE transports; its makers say it is meant for local use with trusted agents. LLM image descriptions, the markitdown-ocr plugin and the Azure conversion services in the MarkItDown library are not wired up, since the tool passes no LLM client or Azure endpoint. Inside the Docker image, local files are visible only when a directory is mounted (for example at /workdir).

Who it suits

Suits a developer who wants an assistant to read local documents or web pages as Markdown on their own machine, with no account and no cloud service involved. It reads files and the network but changes nothing. Pick something else when the server must be shared over a network (it has no sign-in), when you need OCR, image descriptions from an LLM or Azure Document Intelligence output, or when you want more than conversion, such as editing or saving files.

Tools 1

1 only reads. A ? marks an optional parameter.

convert_to_markdown
Fetches or opens an http, https, file or data URI and returns its content as Markdownuri: string

Similar servers