Documents to Markdown inside your AI agent.

t0md ships a remote MCP server. Claude Code, Cursor, Windsurf, OpenClaw, Hermes — any agent that speaks Model Context Protocol can convert PDF, HTML, Word and PowerPoint to Markdown without leaving the chat.

Two transports, one server

Streamable‑HTTP recommended

https://t0md.com/mcp — current MCP spec transport. POST your JSON‑RPC, get a single JSON response. Works with Hermes, modern Claude Code, OpenAI‑compatible clients.

SSE (legacy)

https://t0md.com/mcp/sse — original MCP HTTP transport. Kept around for older Claude Code releases, early Cursor/Windsurf builds, and OpenClaw's default.

What's exposed

convert_to_markdown

The current tool. Convert PDF, HTML, Microsoft Word (.docx) or PowerPoint (.pptx) to clean Markdown. Format is auto-detected from filename + content. Returns Markdown inline plus a 10-minute download link.

convert_pdf_to_markdown

Deprecated alias kept for backward compatibility — only handles PDF. New integrations should call convert_to_markdown instead.

POST /mcp/upload

Out-of-band file upload. Returns an upload_id you can pass to either tool, so large files don't blow your model's output token budget on base64.

Roadmap

EPUB, XLSX, image OCR and URL-to-Markdown are queued. They'll appear here as they ship — no client reconfiguration needed; agents pick them up automatically.

Install in your agent

Pick your client. Each snippet uses the recommended transport for that agent.

Claude Code

claude mcp add --transport http t0md https://t0md.com/mcp

Restart Claude Code and it'll see convert_to_markdown in any session. If you're on an older Claude Code release that doesn't support --transport http yet, the legacy SSE form still works: claude mcp add --transport sse t0md https://t0md.com/mcp/sse.

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "t0md": {
      "url": "https://t0md.com/mcp",
      "transport": "streamable-http"
    }
  }
}

Cursor & Windsurf

Add to ~/.cursor/mcp.json (Cursor) or your Windsurf MCP config. Either transport works:

{
  "mcpServers": {
    "t0md": {
      "url": "https://t0md.com/mcp",
      "transport": "streamable-http"
    }
  }
}

OpenClaw

openclaw mcp set t0md '{"url":"https://t0md.com/mcp/sse"}'

Or, for the streamable-HTTP transport: openclaw mcp set t0md '{"url":"https://t0md.com/mcp","transport":"streamable-http"}'

Hermes (Nous Research)

Add to your Hermes config YAML:

mcp_servers:
  t0md:
    url: "https://t0md.com/mcp"
    tools:
      include: [convert_to_markdown]

Hermes uses streamable-HTTP — point it at /mcp, not /mcp/sse. The tools.include allow-list is optional but recommended for safety.

VS Code (with MCP extension)

{
  "mcp.servers": {
    "t0md": {
      "url": "https://t0md.com/mcp",
      "transport": "streamable-http"
    }
  }
}

Continue.dev

Add to ~/.continue/config.yaml:

mcpServers:
  - name: t0md
    url: https://t0md.com/mcp
    transport: streamable-http

Stdio fallback (any agent)

If your client only speaks stdio MCP, the local t0md-mcp binary forwards stdio JSON‑RPC to t0md.com. Build it:

git clone https://github.com/qed-am/t0md.git
cd t0md
go build -o /usr/local/bin/t0md-mcp ./cmd/mcp-server

Then point your client at /usr/local/bin/t0md-mcp as the command.

Pricing

Free for now while we figure out demand. We may introduce paid tiers for high-volume usage, but if you're calling it a few times a day from any of the clients above, it stays free.