MCP 默认开启且无身份验证,需保持 3000 端口不对外暴露;Ask 功能需另行启用本地 Ollama 模型;也可改为连接自建的 Docling Serve 服务器而非容器内置解析。
docling-Studio
scub-franceMIT活跃维护可视化文档解析工作台,基于 Docling 在浏览器里配置抽取流程、查看文本表格和边界框,再切分、向量化并写入 OpenSearch 和 Neo4j,方便搭 RAG 和知识图谱。
Visual document analysis studio powered by Docling — configure the extraction pipeline, inspect text, tables and bounding boxes in the browser, then chunk, embed and index into OpenSearch and Neo4j.
docker run -p 3000:3000 ghcr.io/scub-france/docling-studio:latest-localREADME 明确说明无需 GPU,可在容器内直接运行 Docling;未列出具体显存或 GPU 型号要求。
基于 Docling 的可视化文档解析工作台,在浏览器里看清 PDF 抽出的每个元素
可视化文档解析工作台,基于 Docling 在浏览器里配置抽取流程、查看文本表格和边界框,再切分、向量化并写入 OpenSearch 和 Neo4j,方便搭 RAG 和知识图谱。
核心能力
- 在页面上画出每个标题、段落、表格和图片的边界框
- 点击文档树元素即显示其文本或表格内容,可隐藏指定元素类型
- 用本地 Ollama 模型对文档提问并展示推理步骤
- 把解析结果导出为 Markdown 或 Docling JSON
- 通过 MCP 让 AI 代理读取并引用文档内容
容易踩的坑
- v0.7.3最新正式版2026-11-02 · 2026-11-02 16:05 UTC
This release opens your parsed documents to AI agents. A built-in MCP server lets Claude Code, Claude Desktop or any MCP client read a document the way it is structured: the agent reads the map, then only the sections a question needs, and cites passages the server verifies. There are no chunks and no embeddings. Around it, Studio learns to import Docling analyses and to analyse documents in batches, and the document workspace moves onto the analysis viewer.
✨ Added
MCP document server — Chunkless RAG (#327, #363, #364)
Studio now serves its parsed documents over MCP. It is on by default over HTTP at
/mcp, and also available over stdio throughmcp_stdio.py.An agent finds a document with
find_documentsand reads its map withget_outline, where each entry carries its reading cost in tokens. It then reads one section at a time withread_element, under a token budget. Every element comes back with adstudio://anchor pinned to the parse it was read from.verify_citationchecks each quote server-side before it is published, and a citation's deep link opens the analysis on the cited element.- The
chunkless_ragprompt runs that loop in at most 5 rounds, the same cap as Studio's own Ask. Each round reads one section, says why it was read, and says what it found. - The answer ends on one MCP Apps card,
show_sources. It shows a strip of the document's pages with each quote's place marked, and the real page with the quoted lines highlighted, found in the PDF's text layer. Each quote is marked as verified or not. A details tab adds the rounds, the tokens and the share of the document that was read. - Settings → MCP server turns the server off and on with no restart (when it is off,
/mcpanswers503). It also edits the round cap, the read ceiling and the deep-link base live, gives ready-to-copy client configs, and lists what the running server publishes. New routes:GET,PUTandDELETE /api/config/mcp, andGET /api/mcp/server.
The server has no authentication, like the rest of the app: anyone who can reach
/mcpcan read every document.MCP_ALLOWED_HOSTSblocks DNS rebinding from a browser, but it does not control network access. Keep port 3000 private, put an authenticating proxy in front, or setMCP_ENABLED=false. A Hugging Face Space keeps the server off unlessMCP_ENABLED=trueis set. Client configs and the full tool contract are indocs/mcp-server.md.Import a Docling analysis (#359)
A Docling JSON made elsewhere, by the
doclingCLI, Docling Serve or another Studio, can now be attached to a document without converting it again. Import analysis, in a document's actions menu, takes a.jsonfile, and the upload area takes a PDF and its Docling JSON together. The JSON is validated against theDoclingDocumentschema, then stored as a completed analysis with its Markdown, HTML, page details and History entry, as if Studio had converted it. New route:POST /api/analyses/import.Batch analysis (#354)
Analysing a corpus meant opening each document and clicking New analysis. The documents library now has a checkbox per row and a select-all checkbox. Analyze starts one analysis per selected document and opens the Analyses page. That page refreshes the statuses until the analyses end, and shows the percentage of the batched ones. The statuses come from a new, light
GET /api/analyses/summaries, polled every 3 s, because the full list carries every analysis's content.Parse view — Show all and Hide boxes (#338, #343)
Selecting an element dims every other bbox, and nothing in the UI led back out. Show all in the LAYERS bar now clears the selection, so every visible bbox is drawn at full strength again. Seeing the bare page meant clicking every LAYERS chip. Hide boxes now hides every element type in one click, and Show boxes brings them back.
🔧 Changed
- **The document workspace uses the ana
- The
- v0.7.22026-09-22 · 2026-09-22 12:12 UTC
查看更新说明
A hotfix for 0.7.1. No backend or API change.
🐛 Fixed
The preview scrolls to the focused element once, without the page collapsing (#336).
Selecting a node in the structure tree made the stacked preview flicker and land somewhere other than the element. The preview only mounts the raster of pages inside its render window, and nothing reserved the box of the others: an off-window card collapsed to its header and re-inflated once its image decoded. Every scroll target was computed against a layout changing underneath it.
Each page frame now holds the page's own aspect ratio and natural raster width, so a card keeps its height with no image mounted. On top of that stable layout:
- the focus scroll measures the frame rather than the image, so a bbox on a page far outside the window is centred on the first click, not on a later
loadevent; - the three watchers a single focus wakes (highlight, focus tick, current page) coalesce into one scroll per flush instead of three competing smooth scrolls;
- the page carrying the highlight keeps its raster — and its overlay — for as long as it is the target.
🛠️ Development
Worktree-friendly development stack (#324).
docker-compose.dev.ymlno longer binds fixed host ports or named volumes, so several worktrees can run their stack side by side: the parser is reached over the compose network, uploads and SQLite state are bind-mounted underdocument-parser/, and the frontend host port comes fromFRONTEND_HOST_PORT(default3000). A new.development_scripts/worktree_setup.shprepares dependencies and copies local state into a fresh worktree;paseo.jsonwires it up for Paseo users.Heads-up for existing dev setups: the dev parser no longer publishes port
8000on the host, and its data moved from theuploads_data/db_datanamed volumes todocument-parser/uploadsanddocument-parser/data. Documents stored in the old volumes are not migrated. Published images anddocker-compose.ymlare unaffected.Trying it
docker run -p 3000:3000 ghcr.io/scub-france/docling-studio:0.7.2-localFull changelog:
CHANGELOG.md· Compare: v0.7.1...v0.7.2 - the focus scroll measures the frame rather than the image, so a bbox on a page far outside the window is centred on the first click, not on a later
- v0.7.12026-08-24 · 2026-08-24 20:24 UTC
查看更新说明
A packaging fix for 0.7.0. No feature changes.
🐛 Fixed
The published
localimage now contains the reasoning stack.release.ymlnever passed theWITH_REASONINGbuild argument, sodocling-agentandmelleawere excluded fromghcr.io/scub-france/docling-studio:0.7.0-local. On that image,POST /api/documents/{docId}/reasoninganswered503and the Ask panel stayed hidden — 0.7.0's headline feature was unreachable from the image people actually pull. The runtime configuration panel added in #317 can toggle reasoning, but it cannot install packages.release.ymlnow passesWITH_REASONING=trueon thelocaltarget. The lightweightremoteimage is unchanged — its build stage does not declare the ARG and stays deliberately slim — and builds from source keep the opt-in default (--build-arg WITH_REASONING=true).README reasoning section corrected. It still described the v1 graph overlay that 0.7.0 removed, and still called the stack "disabled by default". It now documents the Parse-view timeline, what the published image contains, and two upstream limits that had never been written down: docling-agent 0.6.0's chunkless loop emits only
READsteps (the other kinds are reserved wire-contract values), and it reports no per-step duration, so the timeline renders in "step-order" mode by design rather than as a fallback.⚠️ Known gap
The release gate has no reasoning coverage at all: no workflow builds a
WITH_REASONINGimage, andrelease-gate.ymlcontains no reasoning job. A fully green gate says nothing about this feature — which is precisely how 0.7.0 shipped without it. Thee2e-ui-reasoningjob specified indocs/design/303-reasoning-trace-v2-parse-view.mdwas never created. Recorded here rather than quietly carried; worth landing before the next release that touches reasoning.Trying it
docker run -p 3000:3000 ghcr.io/scub-france/docling-studio:0.7.1-localFor reasoning, add a reachable Ollama with your model already pulled:
docker run -p 3000:3000 \ --add-host=host.docker.internal:host-gateway \ -e REASONING_ENABLED=true \ -e OLLAMA_HOST=http://host.docker.internal:11434 \ -e REASONING_MODEL_ID=gpt-oss:20b \ ghcr.io/scub-france/docling-studio:0.7.1-localOn native Linux Docker,
--network=hostwithOLLAMA_HOST=http://localhost:11434also works.Full changelog:
CHANGELOG.md· Compare: v0.7.0...v0.7.1 - v0.7.02026-08-24 · 2026-08-24 20:04 UTC
查看更新说明
This release replaces the standalone reasoning page with a trace surface built into the Parse view, where every citation resolves to a real element of your PDF. It also makes the reasoning stack configurable at runtime, and considerably slims down what the app tries to be.
✨ Added
Reasoning Trace v2 — timeline + Ask panel in the Parse view (#303)
Reasoning runs inside the Parse view of an analysis (Analyses → open a run), replacing the standalone
/reasoningpage.- A conversational Ask panel (composer + turn cards) drives the runs.
- Each step carries a typed kind. The wire contract defines
PLAN,RETRIEVE,RERANK,READ,VERIFY,ANSWERandMAP, reserved end-to-end so future agent phases render without a contract change. docling-agent 0.6.0's chunkless RAG loop emits onlyREAD, so today every step in a real trace is aREAD. - Timing: the run's wall-clock total is captured server-side and is real. Per-step durations are not reported by docling-agent 0.6.0, so the timeline renders in its uniform "step-order" mode with an explicit footnote rather than drawing bars that would be fiction. Per-step bars light up automatically once docling-agent#42 lands.
- The part that works today, and is the point of the release: focusing a step reveals and scrolls the linked element across the PDF preview, the document tree and the Parse view — page flip, bbox highlight, ancestor auto-expand, and reverse selection. Citations are anchored in the document, not printed beside it.
Backend trace projection (#303)
A pure
domain.trace_builderprojects the raw docling-agentReasoningResultonto a debugger-facingReasoningTrace. A newReasoningServiceowns the run (query validation, latest-analysis lookup, wall-clock timing), soapi/documents/{id}/reasoningno longer reaches intoapp.statedirectly.Runtime reasoning configuration from the admin panel (#317)
A Reasoning section in
/settingsenables/disables reasoning and sets the Ollama URL, default model and RAGmax_iterations— without a backend restart. The runner and service are rebuilt in place and/api/healthfollows, so the Ask surface appears and disappears live.- Overrides persist in a new SQLite
app_settingstable. Env vars become bootstrap defaults; each field reports whether its value came fromenvordb, and reset to environment drops the overrides. - A test connection action probes the host and turns the model field into a select of the models actually installed.
- Read-only diagnostics (docling-agent version + import path, provider, availability) make boot failures visible from the UI instead of the container logs.
- New endpoints:
GET/PUT/DELETE /api/config/reasoningandPOST /api/config/reasoning/test. On HuggingFace deployments onlyGETis served —PUT,DELETEand the connection probe return403, the probe included because it is a server-side request to a user-supplied URL. max_iterationsis now actually threaded intoDoclingRAGAgent(newREASONING_MAX_ITERATIONS, default5).
Analyses workspace
A dedicated Analyses section lists every run and opens its saved visualization independently of the document preview. A document can carry several analyses, and this is where the Parse view (and therefore reasoning) now lives.
🔧 Changed
- The document workspace is preview-only.
/docs/:idrenders the document header and page preview. Chunking and ingestion controls are gone from it, related analyses are listed separately, and deleting a document explicitly confirms the analysis cascade. - Reasoning backend ported to the public
run_with_trace()surface (#303). docling-agent is pinned to0.6.0and the adapter binds to a public, version-asserted API instead of the private_rag_loop(). A missing or unusable agent is detected *
- v0.6.22026-06-09 · 2026-06-09 08:23 UTC
查看更新说明
0.6.2 — audit-driven release. Closes the 4 CRIT + 4 MAJ flagged by the 0.6.1 audit and the 0.6.2 release-gate audit.
Highlights
- Image size cut by ~half —
latest-localdrops from 6.04 GB to 3.11 GB (-48%), and a new slimlatest-remoteships at 547 MB. Details below. docling-servecontainer added under theremotecompose profile — the backend now ships a slim image that delegates conversion toquay.io/docling-project/docling-serve-cpu:v1.21.0over HTTP. Zero HuggingFace Hub dependency in build or runtime.- Backend + embedding-service migrated from pip to
uv. Single source of truth is nowpyproject.toml+uv.lock. BREAKING for anyone bootstrapping fromrequirements*.txt. BAKE_MODELSdefault flipped fromtruetofalsein both Dockerfiles. The only sanctioned HF touch in the project is now thelatest-localGHCR build inrelease.yml. BREAKING for operators building from source — pass--build-arg BAKE_MODELS=trueexplicitly to restore the old behaviour. Seedocs/architecture/huggingface-dependency-map.md.- Reasoning stack made opt-in via
--build-arg WITH_REASONING=true(#254). BREAKING — without the flag,/api/reasoningresponds503.
Pre-built images — major size reduction
The
latest-localimage dropped by ~48% (-2.93 GB) versus 0.5.1, and the newremotevariant ships at 547 MB — about an order of magnitude smaller than 0.5.1's only published variant. Pulls are faster, hosts use less disk, and cold starts are quicker.Image 0.5.1 0.6.2 Δ latest-local(Docling + models baked in)6.04 GB 3.11 GB -2.93 GB (-48%) latest-remote(talks to docling-serve over HTTP)— 547 MB new — -91% vs 0.5.1 local Where the bytes went:
uvmigration (#254) — smaller resolved venv vs pip, deterministic lockfile, no transitive bloat that nobody noticed under pip's resolver.- Explicit CPU-only torch via
[tool.uv.sources]— drops ~3 GB of useless CUDA wheels that used to come along for the ride onlatest-local. - Reasoning made opt-in —
docling-agent+mellea+ their LLM SDK transitive weight move out of the default image. Rebuild with--build-arg WITH_REASONING=trueto keep them. BAKE_MODELSopt-in for non-release builds — onlyrelease.ymlbuilds thelocaltarget with the ~1.3 GB Docling checkpoint bake; theremotevariant carries none.- Hardened
.dockerignore— leaner build context, no spurious layer churn on every rebuild.
Tags published
Both targets are tagged three ways for pinning flexibility:
ghcr.io/scub-france/docling-studio:0.6.2-remote/0.6-remote/latest-remoteghcr.io/scub-france/docling-studio:0.6.2-local/0.6-local/latest-local
Added
- Docling Serve container wired into compose (
#audit-10,dd1962e,bc9b4f8): newdocling-serveservice under theremotecompose profile, pinned toquay.io/docling-project/docling-serve-cpu:v1.21.0. Pairs withCONVERSION_MODE=remoteso the backend image stays slim and talks to a Docling Serve container over HTTP — no HF Hub dep on the build or runtime path. CI/release-gate E2E jobs now use this combo. - HuggingFace dependency map (
docs/architecture/huggingface-dependency-map.md): exhaustive list of every HF call site in the project, the single sanctioned touch point (release.yml→latest-local), and the maintenance rule that every new HF dep must be opt-in.
Changed
- Backend + embedding-service migrated from pip to uv (#254,
4d9bcf6):document-parser/requirements*.txtandembedding-service/requirements.txtremoved;uv.lockplus `pyp
- Image size cut by ~half —
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Docling Studio
See what Docling extracts from your PDFs: every title, paragraph, table and picture, with its box drawn on the page.

Run it
docker run -p 3000:3000 ghcr.io/scub-france/docling-studio:latest-local
Open http://localhost:3000 and import a PDF. No GPU needed.
To build from source with Docker Compose, or to turn on Ask with a local model, see Get started.
What it does
- Runs Docling on your PDFs, in the container or on your own Docling Serve server.
- Draws the box of every element on the page, next to the document tree.
- Shows the text or the table of the element you click. Element types can be hidden.
- Answers questions about a document with a local model (Ollama), and shows the steps it took.
- Exports the result as Markdown or Docling JSON.
- Lets AI agents read and cite your documents over MCP (on by default, no authentication: keep port 3000 private; switchable in Settings).
Documentation
| Page | What is in it |
|---|---|
| Get started | Docker image, Docker Compose, turning on Ask |
| User guide | The screens, step by step |
| Configuration | Settings and optional services |
| MCP server | Letting agents read and cite your documents |
| Troubleshooting | Common problems |
| Architecture | How the code is organized |
| Contributing | Dev setup, tests, branches, pull requests |
The same pages are online at https://scub-france.github.io/Docling-Studio/.