kordoc
Reads, checks, fills and generates Korean HWP, HWPX, PDF and Office documents as Markdown
Local converter that turns PDFs, Office files, EPUB, web pages, images and media into Markdown
By Sylphx Rust Local · stdio Files and storageMedia
70 popularity score ★ 1.1k ↓ 7.5k/wk
Opens the app, which asks before it adds the server.
claude mcp add anymd -- npx -y @sylphx/anymd{
"mcpServers": {
"anymd": {
"command": "npx",
"args": [
"-y",
"@sylphx/anymd"
]
}
}
}{
"mcpServers": {
"anymd": {
"command": "npx",
"args": [
"-y",
"@sylphx/anymd"
]
}
}
}{
"servers": {
"anymd": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@sylphx/anymd"
]
}
}
}[mcp_servers.anymd]
command = "npx"
args = ["-y", "@sylphx/anymd"]gemini mcp add --scope user anymd npx -- -y @sylphx/anymdOpens the app, which asks before it adds the server.
claude mcp add anymd -- docker run -i --rm ghcr.io/sylphxai/anymd{
"mcpServers": {
"anymd": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/sylphxai/anymd"
]
}
}
}{
"mcpServers": {
"anymd": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/sylphxai/anymd"
]
}
}
}{
"servers": {
"anymd": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/sylphxai/anymd"
]
}
}
}[mcp_servers.anymd]
command = "docker"
args = ["run", "-i", "--rm", "ghcr.io/sylphxai/anymd"]gemini mcp add --scope user anymd docker -- run -i --rm ghcr.io/sylphxai/anymdMCP_PDF_ALLOWED_DIRS |
Optional: Directories it may read, split by the OS path separator or commas; same as --allow-dir. Unset, any file the process can open is readable. |
|---|---|
ANYMD_CACHE_DIR |
Optional: Where extracted images and downloaded models go; the platform cache folder plus anymd when unset. |
MCP_PDF_ALLOW_PRIVATE_IPS |
Optional: Set to true to let URL sources reach private or loopback addresses. |
| Set together: http | |
MCP_TRANSPORT |
Optional: Set to http for the HTTP transport; stdio otherwise. |
MCP_HTTP_HOST |
Optional: Address the HTTP transport binds to. |
MCP_HTTP_PORT |
Optional: Port of the HTTP transport. |
MCP_API_KEY secret |
Optional: Key each HTTP request must send as X-API-Key; needed for a non-loopback bind. |
MCP_CORS_ORIGIN |
Optional: Origin allowed for browser requests to the HTTP transport. |
MCP_ALLOW_UNAUTHENTICATED_REMOTE |
Optional: Set to true to allow a non-loopback bind without MCP_API_KEY. |
In a container, a setting goes in with -e NAME=value after docker run.
anymd is a Rust program from Sylphx that serves as both a command-line converter and a stdio MCP server. An assistant hands it a file path, a folder or a web address and gets back Markdown: PDFs come out in reading order with tables rebuilt and page markers for citing, Word and PowerPoint files keep headings, tables, notes and tracked changes, spreadsheets become one table per sheet, EPUB books one section per chapter, and web pages are cut down to the main article. Images give their EXIF data and, once an OCR engine is set up, their text; audio and video give duration, streams, chapters and subtitles, with a local speech-to-text transcript on request.
The server has four tools: read for conversion, outline for a document's heading tree, search for text across files, folders and URLs (falling back to ranked passages when there is no exact hit), and inspect for deeper PDF work such as rendering a page, OCR or a geometry-level JSON structure. Long documents are returned within a token budget of 20000 by default, with a cursor to continue.
It used to be published as pdf-reader-mcp and later as Citra. The old tool names read_pdf, search_pdf, pdf_evidence and pdf_compare are no longer listed but still answer for this major version (lib.rs at v8.5.5). Besides stdio there is an opt-in HTTP transport (MCP_TRANSPORT=http) that the README leaves out. It listens on 127.0.0.1:8080 unless MCP_HTTP_HOST and MCP_HTTP_PORT say otherwise, and it will not start on another address without MCP_API_KEY unless MCP_ALLOW_UNAUTHENTICATED_REMOTE=true is set.
| Runtime | Node.js 18+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Also |
|
Node.js 18 or later runs the npx command, and npm fetches the prebuilt native binary for your platform. Docker (amd64 or arm64) is the other way. The README also gives winget, Homebrew and Scoop installs of the same binary. No account or API key. OCR needs tesseract on PATH or a one-time `anymd setup ocr` (about 2 GB of local models). Transcripts need the Qwen3-ASR weights (about 2.2 GB), fetched only when a call sets download_asr_model.
Spreadsheets are capped at 2,000 rows per sheet. Embedded images over 50 megapixels are refused. Without an OCR engine, scanned pages and images yield no text; the project's own OCR benchmark score is described as historical. Video subtitle extraction can drop a repeated caption, and video understanding is not offered. Video timelines and the cite_check operation need anymd Pro, a one-time US$29 licence. Web fetches block private and loopback addresses unless MCP_PDF_ALLOW_PRIVATE_IPS=true. Run through Docker, it sees only folders you mount into the container.
Suits developers who want an assistant to read local documents, scans, slide decks, spreadsheets or e-books as Markdown without sending them to a cloud service, and who need page-anchored output for citing. It only reads and converts, so pick another server if you need to edit documents or write files. Those who already run pdf-reader-mcp or Citra are on the same program under an old name and can switch the command to @sylphx/anymd. Shared or remote deployments should use the HTTP transport only with MCP_API_KEY and a directory allowlist.
4 only read. A ? marks an optional parameter.
readsource: stringpages?: stringmax_tokens?: integercursor?: stringnode?: stringocr?: anyimages?: enumrevisions?: enumtranscript?: booleandownload_asr_model?: booleantimeline?: objectoutlinesource: stringformat?: enumocr?: anyimages?: enumrevisions?: enumtimeline?: objectsearchquery: stringsources?: arraymode?: enumglob?: stringcase_sensitive?: booleanwhole_word?: booleanmax_results?: integercontext_chars?: integerinspectoperation: enumsources: arrayprofile?: stringscale?: numbermax_pages?: integerinclude_image?: booleanlanguages?: arrayocr?: enumcitations?: arraytimestamps_ms?: array