Markdownify MCP

Markdownify MCP

Serveur MCP en TypeScript, conversion déléguée à markitdown

Markdownify MCP est un serveur Model Context Protocol écrit en TypeScript. Une application de bureau compatible MCP le lance, et l'agent IA y trouve onze outils qui rendent en Markdown un fichier local, une page web ou un dépôt Git.

La conversion se fait ailleurs. Neuf de ces outils appellent la commande markitdown, le convertisseur Python de Microsoft présenté dans la fiche MarkItDown, et git-repo-to-markdown passe la main à repomix. Seul get-markdown-file travaille lui-même : il lit un fichier .md existant. Markdownify ajoute la couche MCP, le téléchargement des URL et une liste blanche de dossiers. Microsoft publie de son côté markitdown-mcp, un serveur à outil unique, convert_to_markdown.

Le comparatif des outils d'OCR open source confronte Markdownify MCP aux moteurs OCR et aux autres convertisseurs vers Markdown.

Un dépôt Git entier tient en un seul document

  • Un outil par format : PDF, DOCX, XLSX, PPTX, image et audio par chemin absolu, page web, vidéo YouTube et recherche Bing par URL. Tous portent l'annotation de lecture seule readOnlyHint.
  • Un dépôt Git en un seul document : git-repo-to-markdown accepte une URL GitHub ou la forme owner/repo, avec une branche, un tag ou un commit. L'option compress fait passer le code par Tree-sitter, qui réduit la sortie d'environ 70 % selon la description de l'outil. La liste d'outils du README l'oublie.
  • Une liste blanche sur tous les fichiers : depuis la v1.1.0, MD_ALLOWED_PATHS s'applique à chaque outil qui lit un fichier. Sans la variable, le serveur lit tout ce que son processus a le droit de lire.
  • Des contrôles sur les URL : http et https seulement, hôte refusé s'il désigne une IP privée, chaque redirection vérifiée à nouveau. Quand markitdown rend du HTML brut, cas typique d'une page rendue en JavaScript, le serveur renvoie une erreur.

Python obligatoire, failles signalées toujours ouvertes

Python et markitdown sont obligatoires. bun install crée un environnement virtuel .venv et y installe markitdown[all], qui tire pandas, SpeechRecognition et les SDK Azure. Le serveur ne parle que STDIO ; le transport HTTP attend dans une pull request ouverte en août 2026 (#133). Pour se passer de Python, anydoc convertit les fichiers bureautiques avec un binaire Rust lancé par npx, et s'installe comme Agent Skill plutôt que comme serveur MCP.

Pas d'OCR, et l'audio part chez Google. Appelé sans client LLM, le convertisseur d'images de markitdown ne rend que les métadonnées d'un JPEG ou d'un PNG (dimensions, auteur, date, position GPS), et seulement si exiftool est installé. Le texte d'une photo ou d'un PDF scanné n'en sort pas : markitdown confie l'OCR à un plugin qui exige un client LLM, ou aux services Azure, et Markdownify n'active ni l'un ni les autres. L'audio est transcrit par la bibliothèque SpeechRecognition, qui l'envoie à l'API Google Speech Recognition avec une clé générique et la langue fixée à l'anglais américain.

Les trois outils web n'en font qu'un. Page web, YouTube ou Bing, l'URL est téléchargée dans un fichier temporaire, puis ce fichier passe à markitdown. Or ses convertisseurs YouTube et Bing ne se déclenchent que sur une URL : c'est la conversion HTML générique qui tourne. Pour YouTube, les pull requests #100 (mai 2026) et #131 (août 2026) décrivent le résultat, le pied de page du site au lieu de la transcription. Aucune n'est fusionnée.

L'image Docker est incomplète. Depuis la v1.0.4, elle n'installe que markitdown[pdf], pour corriger un plantage sur ARM. Le README prévient que l'audio et les images y échouent ; d'après les dépendances optionnelles de markitdown, DOCX, XLSX et PPTX y manquent aussi des leurs.

Des failles signalées restent ouvertes. Le contrôle des URL porte sur le nom d'hôte, pas sur l'adresse résolue : le ticket #112 (juin 2026) fait passer une requête vers http://[::1]. La liste blanche se contourne par un lien symbolique (#108) ou par un dossier voisin au nom proche (#123), et le correctif du mainteneur (#104) attend sa fusion depuis le 18 mai 2026. Le ticket #112 juge le risque plus faible sur un poste local à un seul utilisateur que derrière une passerelle MCP distante.

Plus rien sur main depuis le 1er mai 2026. Cinq versions sont sorties entre le 27 mars (v1.0.1) et cette date (v1.1.0, publiée aussi sur npm sous le nom mcp-markdownify-server). Zach Caceres signe 89 des 123 commits. La pull request #88, qui remplace markitdown par un portage TypeScript pour se passer de Python, attend depuis mars 2026 que ce portage paraisse sur npm.