最近、LLMを使って設計や開発を進めることが増えました。

仕様書を書くにも、Claude Codeに指示するにも、コンテキストを渡すにも、.mdファイルが基本になってきています。

で、困るのが既存ドキュメントの扱いです。社内の仕様書はPDFだったり、要件はExcelで管理されていたり、設計書はWordだったりします。これをLLMに渡すとき、都度コピペしたり変換スクリプトを書いたりするのが地味に面倒でした。RAGを組むときもファイルの前処理で詰まります。

そんなとき、Microsoftが出している markitdown というツールを見つけて試してみました。RAGの前処理にも使えますし、単純にLLMへの入力を整えるだけでも便利です。

microsoft/markitdown – https://github.com/microsoft/markitdown

markitdownとは?

ざっくり言うと、PDFやWord・Excel・PowerPointなどをMarkdownに変換するPythonツールです。

LLMへの入力を想定して作られていて「MarkdownはLLMが自然に理解できてトークン効率も高い」という発想で設計されています。人間向けに整形されたファイルをそのままLLMに食わせるより、一度mdに変換してからの方がRAGの精度が上がりやすいです。

対応形式はこのあたりです。

  • PDF
  • PowerPoint
  • Word
  • Excel
  • 画像 (EXIFメタデータとOCR)
  • オーディオ(EXIFメタデータおよび音声文字起こし)
  • HTML
  • テキスト形式のフォーマット (CSV, JSON, XML)
  • ZIPファイル (内容を順に処理する)
  • YoutubeのURL
  • EPub
  • などなど

画像のOCRやYouTube URLまで対応している!

インストール

Python 3.10以上が必要です。

pip install 'markitdown[all]'

[all] をつけると全フォーマット対応の依存関係が入ります。PDFだけ使いたいなど絞る場合は [pdf][docx] のように個別指定もできます。

使い方

CLIから使う

markitdown path/to/file.pdf -o output.md

標準入力にも対応しています。

cat file.pdf | markitdown

Pythonから使う

from markitdown import MarkItDown

md = MarkItDown()
result = md.convert("report.xlsx")
print(result.text_content)

result.text_content にMarkdownの文字列が入ります。そのままベクトル化に渡せるので便利です。

画像の説明を自動生成したい場合

LLMクライアントを渡すと、画像が含まれているファイルの画像部分を自動的に説明テキストに変換してくれます。

from openai import OpenAI
from markitdown import MarkItDown

client = OpenAI()
md = MarkItDown(llm_client=client, llm_model="gpt-4o")
result = md.convert("slide_with_charts.pptx")
print(result.text_content)

図やグラフが多いPowerPointをRAGに使いたい場合はここが効いてきます。

実際に試してみた

議事録PDF変換

社内で共有されているPDFの議事録を変換してみました。

markitdown minutes_2026Q1.pdf -o minutes_2026Q1.md

結果はそれなりに読めるMarkdownになっていました。表やリストの構造もある程度保持されています。

ただ、スキャンされたPDFはOCRが走らないと文字が取得できないので注意が必要です。自分の環境では markitdown-ocr プラグインを別途入れることで対応できました。

pip install markitdown-ocr

Excelは列・行の構造をMarkdownのテーブルに変換してくれます。複数シートがある場合はシートごとに分けて出力されます。ここは少し想定と違って、シートをまたいだ情報の繋がりが分断されます。用途によっては工夫が必要だと思います。

RAGへの活用

変換したmdファイルをそのままBedrockのKnowledge BaseのデータソースにするS3バケットに置いています。PDFのまま突っ込んでいたときより検索精度が上がった気がします(ちゃんと計測はしていないですが)。

前処理パイプラインとしてはこんな感じです。

  1. 元ファイルをS3にアップロード
  2. Lambda でmarkitdownを呼んでmd変換
  3. 変換後のmdを別バケットに保存
  4. Bedrock Knowledge Base がmd側のバケットを参照

LambdaでmarkItDownを使う場合、パッケージサイズが少し気になります。[all] で入れると重いので、必要なフォーマットだけに絞った方がいいです。

MCPサーバーとしても使える

markitdown-mcp というパッケージも出ていて、MCPサーバーとして動かすことができます。

pip install markitdown-mcp

Claude Desktopに組み込む場合は claude_desktop_config.json にこれを追加するだけです。

{
  "mcpServers": {
    "markitdown": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "markitdown-mcp:latest"]
    }
  }
}

MCPサーバーが提供するツールは convert_to_markdown(uri) のみで、http://https://file:// などのURIを渡すとMarkdownに変換して返してくれます。

使い道のイメージ

Claude Desktopに組み込むと、こんな使い方ができます。

  • 「このPDFを要約して」とファイルパスを渡すと、変換→要約まで一気にやってくれる
  • 社内のExcel仕様書をClaudeに読み込ませて、コード生成の入力にする
  • 外部サイトのURLを渡してドキュメントをそのままコンテキストに取り込む

Claude Codeでも同様にMCPとして登録しておけば、file:// でローカルのPDFやWordを直接指定できます。設計書を読み込ませながらコードを書かせる、みたいな使い方が楽になります。

ただしセキュリティの注意点があります。このMCPサーバーは認証なしでローカルのファイルにアクセスできるので、外部に公開するのは想定外の設計です。ローカル or サンドボックス環境限定で使うのが前提です。

所感

CLIで一発変換できるのが地味にありがたいです。

MCPまで用意されているのは少し驚きました。Claude DesktopやClaude Codeと組み合わせると、ファイルを渡す→変換→そのままLLMが読む、という流れがほぼ自動になります。

精度は完璧ではないですし、スキャンPDFや複雑なレイアウトには限界もあります。でも「とりあえずRAGに突っ込める形に変換したい」という用途には十分だと思います。

ぜひ使ってみてください。

ここまで読んでいただき、ありがとうございます。もしこの記事の技術や考え方に少しでも興味を持っていただけたら、ネクストのエンジニアと気軽に話してみませんか。

  • 選考ではありません
  • 履歴書不要
  • 技術の話が中心
  • 所要時間30分程度
  • オンラインOK

エンジニアと話してみる

関連リンク

AI・クラウド・データ分析のご相談はネクスト株式会社までお問い合わせください。