独立系ガイド — IBM および Docling プロジェクトとは無関係です。 すべてのコマンドを Docling 2.143.1 で検証済み。
  1. ホーム
  2. docling-serve API
docling-serve と MCP

Docling をサービスとして動かす——docling-serve、API、MCP

docling-serve は Docling を FastAPI サーバーで包み、どの言語からでも HTTP で文書を変換できるようにします。Web UI、非同期ジョブ、S3/Azure/GCS ソース、API キーにも対応。エンドポイントと既定値はすべて 1.38.2 のソースから読み取りました。

Docling で検証済み 2.143.1更新日 2026年10月27日11 分で読めます
要点
  • pip install "docling-serve[ui]" のあと docling-serve run --enable-ui → API はポート 5001、ドキュメントは /docs、UI は /ui。
  • 小さなジョブ:POST /v1/convert/source(URL)または /v1/convert/file(アップロード)。同期呼び出しは最大 120 秒待ちます。
  • 大きなジョブ:/async 版は task_id を返します。/v1/status/poll/{id} をポーリングし、終わったら /v1/result/{id} を一度だけ取得。
  • DOCLING_SERVE_API_KEY で保護します(クライアントは X-Api-Key を送信)。エージェントは docling-mcp 経由で同じサーバーを使えます。

1 分でサーバーを起動#

bashPython
pip install "docling-serve[ui]"
docling-serve run --enable-ui          # API:http://127.0.0.1:5001 · ドキュメント:/docs · UI:/ui
bashコンテナ(CPU イメージ)
docker run -p 5001:5001 -e DOCLING_SERVE_ENABLE_UI=1 \
  quay.io/docling-project/docling-serve-cpu

docling-serve run はすべてのインターフェース(ホスト 0.0.0.0)で待ち受けます。docling-serve dev は 127.0.0.1 にバインドし、開発用に自動リロードします。イメージの選び方と GPU 版は Docker のページへ。

リクエストの流れ#

アプリcurl · Python · n8nX-Api-Key (optional)POST /v1/convert/source同期:最大 120 秒待機→ document JSONPOST …/source/asyncすぐに task_id を返す→ task_idGET /v1/status/poll/{id}または WebSocketGET /v1/result/{id}1 回取得・300 秒保持ワーカープール(ローカル、既定 2)RQ + Redis / Ray でスケールアウト
エンドポイントと既定値は docling-serve 1.38.2(app.py・settings.py)から確認。

エンドポイント#

メソッドとパス用途
POST /v1/convert/sourceURL やクラウドのソースから変換し、結果を待つ
POST /v1/convert/fileアップロードしたファイル(multipart)を変換し、結果を待つ
POST /v1/convert/source/async・/v1/convert/file/asyncジョブを開始し、すぐに task_id を返す
POST /v1/convert/source/batch複数のソースを 1 つのバッチとして送信
POST /v1/chunk/{hybrid|hierarchical}/{source|file}[/async]変換とチャンク化を 1 回の呼び出しで
GET /v1/status/poll/{task_id}ジョブの状態(pending・started・success・failure など)
WS /v1/status/ws/{task_id}WebSocket で状態の更新をプッシュ
GET /v1/result/{task_id}完了した結果を取得
GET /health・/ready・/version・/v1/capabilitiesヘルス、準備状態、バージョン、有効な機能
GET /docs・/scalar・/uiSwagger ドキュメント、Scalar ドキュメント、プレイグラウンド UI

パスは 1.38.2 の docling_serve/app.py から取得。管理用エンドポイント(/v1/clear/*・/v1/memory/*)もありますが、DOCLING_SERVE_ENABLE_MANAGEMENT_ENDPOINTS を設定しない限り無効です。

URL を変換する#

bash
curl -X POST http://localhost:5001/v1/convert/source \
  -H 'Content-Type: application/json' \
  -d '{
    "sources": [{"kind": "http", "url": "https://arxiv.org/pdf/2408.09869"}],
    "options": {"to_formats": ["md", "json"], "do_ocr": false}
  }'

レスポンスは ConvertDocumentResponse です:document(要求した形式に応じて md_content・json_content・html_content・text_content・doctags_content)、status・errors・processing_time・timings・confidence。

2.143.1 のリクエストモデルが受け付けるソースの種類:http・file(base64)・s3・azure_blob・google_cloud_storage・google_drive。

ファイルをアップロードする#

bash
curl -X POST http://localhost:5001/v1/convert/file \
  -F 'files=@report.pdf' \
  -F 'to_formats=md' \
  -F 'do_ocr=false' \
  -F 'table_mode=fast'

オプションは JSON 本体と同じ名前のフォームフィールドになります。リストはフィールドを繰り返します(-F to_formats=md -F to_formats=json)。設定ジェネレーターがこれらのリクエストを書いてくれます。

長い文書:非同期ジョブ#

pythonasync_convert.py
import time, requests

BASE = "http://localhost:5001"
job = requests.post(f"{BASE}/v1/convert/source/async", json={
    "sources": [{"kind": "http", "url": "https://arxiv.org/pdf/2408.09869"}],
    "options": {"to_formats": ["md"]},
}).json()

task_id = job["task_id"]
while True:
    status = requests.get(f"{BASE}/v1/status/poll/{task_id}").json()
    if status["task_status"] in ("success", "partial_success", "failure"):
        break
    time.sleep(2)

result = requests.get(f"{BASE}/v1/result/{task_id}").json()
print(result["document"]["md_content"][:300])

実際によく使うオプション#

JSON の options オブジェクトは ConvertDocumentsOptions です。2.143.1 でよく使うフィールドと既定値:

フィールド既定値メモ
to_formats["md"]md・json・html・text・doctags など
image_export_modeplaceholderCLI の既定は embedded なので異なる
do_ocr / force_ocrtrue / false
ocr_preset / ocr_langauto / なしプリセット ID は CLI のエンジン名と同じ。ocr_engine も動きますが非推奨です。pip でインストールしたサーバーには onnxruntime がないため rapidocr プリセットは失敗し、auto は動きます。tesseract では必ず ocr_lang を指定してください(eng と iso:en は動作、en だけでは不可)。
pipelinestandardvlm は vlm_pipeline_preset と併用
table_modeaccuratefast のほうが速い
page_range全ページ[1, 10]
document_timeoutなし文書ごとの秒数
images_scale2.0サーバー側の上限は DOCLING_SERVE_MAX_IMAGES_SCALE(2.0)
do_formula_enrichment・do_code_enrichment・do_picture_description・do_chart_extractionfalse拡張モデル

サーバー設定#

設定はすべて DOCLING_SERVE_ で始まる環境変数です(または DOCLING_SERVE_CONFIG_FILE で指定する YAML/JSON ファイル)。Uvicorn の設定は UVICORN_ を使います。

変数既定値効果
DOCLING_SERVE_ENABLE_UIfalse/ui でプレイグラウンドを提供
DOCLING_SERVE_API_KEY空(認証なし)X-Api-Key を必須にする
DOCLING_SERVE_MAX_SYNC_WAIT120同期リクエストが待つ秒数
DOCLING_SERVE_ENG_KINDlocallocal・rq(Redis キュー)・ray
DOCLING_SERVE_ENG_LOC_NUM_WORKERS2ローカルエンジンの並列ジョブ数
DOCLING_SERVE_MAX_NUM_PAGES・…_MAX_FILE_SIZE無制限大きすぎる文書を拒否
DOCLING_SERVE_MAX_SOURCES_PER_REQUEST31 回の呼び出しあたりのソース数
DOCLING_SERVE_LOAD_MODELS_AT_BOOTtrue起動時にモデルを読み込む
DOCLING_SERVE_ARTIFACTS_PATHなし事前ダウンロードしたモデル(オフライン)
DOCLING_SERVE_ENABLE_REMOTE_SERVICESfalseAPI ベースのモデルを許可
DOCLING_SERVE_SINGLE_USE_RESULTS・…_RESULT_REMOVAL_DELAYtrue・300取得後に結果を削除
DOCLING_SERVE_CORS_ORIGINS["*"]ブラウザから使うなら絞り込む

既定値は docling_serve/settings.py(1.38.2)から取得しました。

Python クライアント#

Docling には専用のクライアントが付属しています。DocumentConverter と同じ形なので、ローカル変換とリモート変換の切り替えは 1 行の変更で済みます。

python
from docling.datamodel.service.options import ConvertDocumentsOptions
from docling.service_client import DoclingServiceClient

with DoclingServiceClient(url="http://localhost:5001") as client:   # 設定済みなら api_key="..."
    result = client.convert(
        "https://arxiv.org/pdf/2408.09869",
        options=ConvertDocumentsOptions(do_ocr=False, to_formats=["md"]),
    )
    print(result.document.export_to_markdown()[:300])

PyTorch なしで pip install "docling-slim[service-client]" としてインストールできます。同じエクストラで docling convert-remote コマンドも加わります(CLI リファレンス参照)。

MCP:AI エージェントのための Docling#

docling-mcp は変換と文書操作のツールを Claude Desktop や LM Studio などの MCP クライアントに提供します。3.x の既定の変換モードは remote なので、docling-serve インスタンスを指定するか、local エクストラを入れてください。

jsonMCP クライアント設定——remote モード
{
  "mcpServers": {
    "docling": {
      "command": "uvx",
      "args": ["--from=docling-mcp", "docling-mcp-server"],
      "env": {
        "DOCLING_MCP_CONVERSION_MODE": "remote",
        "DOCLING_MCP_SERVICE_URL": "http://localhost:5001"
      }
    }
  }
}
bashlocal モード、サーバー不要
uvx --from "docling-mcp[local]" docling-mcp-server --transport stdio
# 環境変数 DOCLING_MCP_CONVERSION_MODE=local を設定

トランスポート:stdio(デスクトップクライアント)、sse と streamable-http(コンテナ)。docling-mcp 3.x は MCP SDK 2.x が必要です。移行していないクライアントでは docling-mcp<3.0.0 に固定してください。

本番運用チェックリスト#

  • DOCLING_SERVE_API_KEY を設定し、DOCLING_SERVE_CORS_ORIGINS を絞る。
  • 数ページを超える文書は非同期エンドポイントで。同期呼び出しは 120 秒が上限です。
  • DOCLING_SERVE_MAX_NUM_PAGES と DOCLING_SERVE_MAX_FILE_SIZE で入力を制限する。
  • モデルをイメージに事前ダウンロード(DOCLING_SERVE_ARTIFACTS_PATH)して、Pod がインターネットなしで起動できるようにする。
  • 1 台で足りなければ DOCLING_SERVE_ENG_KIND=rq と Redis ワーカーでスケールアウト。

よくある質問

docling-serve のポートは?

既定は 5001 です。API は http://127.0.0.1:5001、対話的な API ドキュメントは /docs、--enable-ui または DOCLING_SERVE_ENABLE_UI=1 で有効にすると /ui にプレイグラウンド UI があります。

docling-serve に認証を付けるには?

DOCLING_SERVE_API_KEY に秘密の値を設定します。クライアントはそれを X-Api-Key ヘッダーで送る必要があります。

docling-serve の同期リクエストがタイムアウトするのはなぜ?

同期エンドポイントは最大 DOCLING_SERVE_MAX_SYNC_WAIT 秒(既定 120)待ちます。長い文書は /async エンドポイントを使って結果をポーリングするか、上限を上げてください。

docling-serve の結果を 2 回取得できる?

既定ではできません。DOCLING_SERVE_SINGLE_USE_RESULTS が true のため、結果は取得後(300 秒の猶予のあと)削除されます。クライアントが再試行する可能性があるなら false にします。

Docling を Claude Desktop などの MCP クライアントにつなぐには?

docling-mcp を使い、uvx --from docling-mcp docling-mcp-server を実行するサーバー設定を追加します。docling-mcp 3.x 以降は既定が remote モードなので、DOCLING_MCP_SERVICE_URL を docling-serve に向けるか、docling-mcp[local] を入れて DOCLING_MCP_CONVERSION_MODE=local を設定します。

出典