DocSlicer について
DocSlicerは、長いビジネス文書を扱う開発者やエージェント向けの決定論的な解析・分割ツールです。LLMを呼び出さずにPDF、Word、HTML、PowerPointの構造を抽出し、Pythonライブラリと、必要なセクションだけを選べるMCPサーバーを提供します。
主な機能
- 01PDF、Word、HTML、PowerPointの解析
- 02見出し階層と構造化ブロックの抽出
- 03見出し対応の重複しないチャンク生成
- 04複数形式でのテーブル表現
- 05複数カラムの読み順を保持
- 06スキャンページ向けの任意OCR
活用シーン
- 01エージェント向けに長文書から節を検索
- 02従来型RAG用の構造化チャンクを準備
- 03ビジネス文書を一括処理
MCP 対応
MCPサーバーを通じて、クライアントは文書のアウトラインを確認し、選択したセクションを読み取れます。文書全体をコンテキストに読み込まず、ベクトル検索なしで情報を取得できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
5掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| source | string | はい | |
| refresh | boolean | いいえ | |
| password | any | いいえ |
詳細
DocSlicer
ビジネス文書向けの、超高速(毎秒31ページ)、決定論的な文書パーサー兼チャンク分割ツールです。LLM の呼び出しや大規模な ML モデルは不要です。
DocSlicer は、PDF、Word 文書、HTML ページ、PowerPoint ファイルを、整ったチャンク、構造化ブロック、表、グラフ、Markdown、ナビゲーション可能な見出し階層に変換します。
BizDocBenchで最高スコアを獲得しています(総合0.88、次点のツールは0.70)。表の精度は0.80、コンテンツの忠実性は0.98、見出しの認識と階層の保持は0.85、RAG の検索性能は0.76です。
使い方は2通りです:
- Python ライブラリとして — 従来型の RAG。 レイアウトを考慮したチャンク分割ツールにより、重複のない整ったチャンクを作成できます。それぞれのチャンクには見出しの階層全体が含まれており、すぐに埋め込みに使えます。API に移動 ↓
- MCP サーバーとして — ベクトルレス RAG。 文書からすぐに回答を得たい場合に適しています。Claude、Cursor、または VS Code がアウトラインを取得し、必要なセクションを選んで、その部分だけを読み込みます。埋め込みは不要で、200ページの文書全体をコンテキストウィンドウに入れる必要もありません。セットアップに移動 ↓
クイックスタート
import docslicer
def main():
result = docslicer.parse_document("annual_report.pdf")
# Inspect the outline first
result.hierarchy.to_outline()
# - PART I — FINANCIAL INFORMATION
# - Item 1. Financial Statements
# - Notes to Condensed Consolidated Financial Statements
# - Note 4 – Financial Instruments
# - Derivative Instruments and Hedging
# - Foreign Exchange Rate Risk
# - Interest Rate Risk
# - Accounts Receivable
# - Trade Receivables
# - Item 2. Management's Discussion and Analysis
# - Liquidity and Capital Resources
# - PART II — OTHER INFORMATION
# ...
# Pull only the chunks you need
risk_section = result.find_heading("Risk Factors")[0]
chunks = result.chunks_under(risk_section)
# Tables come back structured, not as flat text
for table in result.tables_under(risk_section):
print(table.markdown)
if __name__ == "__main__":
main()
特長
- LLM、VLM、ML モデルは不要 — 完全に決定論的です。モデルの重みをダウンロードする必要も、GPU も不要で、コールドスタートの遅延もありません
- 軽量 — 約 630 KB のホイールで、重い ML 依存関係はありません
- エージェント向け — 長い文書のトークン消費を抑えます。まずエージェントにアウトラインを確認させ、500 ページの文書をそのまま入力する代わりに、関連するチャンクだけをコンテキストに取り込めます。法律文書、技術的な標準作業手順書(SOP)、財務報告書、コンプライアンス文書に適しています
- 階層を深く抽出 — 番号付き(
1.,1.2.,1.2.3)の見出しと自由形式の見出しの両方に対応します。推論ではなく、フォントサイズ、太字の強さ、文書構造を使用します。付録による中断後の再開や、ページをまたいで繰り返されるナビゲーション見出しにも対応します - 構造を考慮したチャンク分割 — 見出しと段落の境界で分割し、意味のまとまりを保ちます
- 文字の重複はゼロ — デフォルトではチャンクは重複しません。コンテキストウィンドウ内にトークンの重複はありません
- 統一された結果オブジェクト —
chunks、blocks、tables、charts、metadata、hierarchyを 1 か所にまとめます - 構造化テーブル — テーブルはフラットなテキストではなく、セルとして返されます。Markdown、JSONL、またはメルト形式でエクスポートできます
- 複数のエクスポート形式 — CSV、Markdown、JSONL、Parquet、JSON、プレーンテキスト、DataFrame
- 読み取り順序を保持 — 複数列の PDF レイアウトも含みます
pdf、docx、pptx、htmlに対応 — Playwright を介した JavaScript レンダリングページも含みます- 堅牢な URL 取得 — 常に実際のブラウザーでページをレンダリングし、Cookie バナーやボット対策に標準で対応します。また、太字など、生の HTML では失われるスタイル情報も保持するため、見出し検出とチャンク品質が向上します
- OCR フォールバック — スキャンされたページを自動検出し、追加機能がインストールされている場合は Tesseract にフォールバックします
ベンチマーク
BizDocBench を使用して測定しました。これは複数形式のビジネス文書解析を対象とするオープンベンチマークです。すべてのスコアは 0~1(高いほど良好)です。pages_per_sec_aggregate はコーパス全体のスループットです。
| ツール | スコア | カバレッジ | 速度 | 階層 | 忠実度 | テーブル | 検索 | ページ/秒 |
|---|---|---|---|---|---|---|---|---|
| docslicer | 0.8796 | 1.0000 | 0.8836 | 0.8466 | 0.9824 | 0.8047 | 0.7601 | 31.27 |
| docling | 0.7036 | 1.0000 | 0.3805 | 0.4905 | 0.8927 | 0.7467 | 0.7111 | 3.46 |
| markitdown | 0.5838 | 1.0000 | 0.8513 | 0.0604 | 0.7972 | 0.2584 | 0.5357 | 27.42 |
| unstructured | 0.5798 | 0.9091 | 0.1073 | 0.4327 | 0.9057 | 0.4812 | 0.6430 | 0.52 |
| opendataloader | 0.5359 | 0.5844 | 1.0000 | 0.3853 | 0.6484 | 0.2655 | 0.3317 | 117.26 |
| pymupdf4llm | 0.4519 | 0.5974 | 0.6492 | 0.1089 | 0.6456 | 0.3551 | 0.3552 | 11.84 |
| mineru | 0.4107 | 0.5974 | 0.1353 | 0.4220 | 0.6176 | 0.3012 | 0.3910 | 0.70 |
| marker | 0.3735 | 0.5974 | 0.1598 | 0.1926 | 0.6121 | 0.3012 | 0.3778 | 0.87 |
インストール
pip install docslicer
コアのインストールは依存関係が軽量です。追加機能は extras として利用できます。
pip install 'docslicer[html]' # HTML / URL parsing via Playwright
playwright install chromium # one-time browser install (Chromium only)
pip install 'docslicer[ocr]' # scanned PDF support via Tesseract + OpenCV
# The tesserocr wheel bundles libtesseract but NOT the language models,
# so install the Tesseract engine to provide them (docslicer auto-detects the path):
# Linux: apt install tesseract-ocr
# macOS: brew install tesseract
pip install 'docslicer[mcp]' # MCP server for LLM clients (Claude, Cursor, …)
pip install 'docslicer[llm]' # exact token counts via tiktoken (exact_tokens=True)
pip install 'docslicer[crypto]' # password-protected Office files (msoffcrypto-tool)
pip install 'docslicer[parquet]' # Parquet export support
extras は組み合わせて使用できます。pip install 'docslicer[html,ocr,llm]'。
Python 3.10 以降が必要です
返されるデータ(ParseResult)
parse_document は ParseResult を返します。
result.chunks # list[Chunk] — heading-aware text chunks, ready for embedding
result.blocks # list[Block] — paragraph/heading/table blocks before chunking
result.tables # list[Table] — structured tables with cells, spans, and markdown
result.charts # list[Chart] — charts as extracted data points (docx/pptx)
result.metadata # DocumentMetadata — title, author, language, page count, OCR flag
result.hierarchy # HierarchyTree — navigable tree of all headings
各 Chunk には次の情報が含まれます。
chunk.text # str — chunk text
chunk.path # list — full heading breadcrumb from root to nearest heading
chunk.heading # str — nearest heading above this chunk
chunk.section # str — body | toc | exhibit | header | footer | coverpage | …
chunk.page_number # int — 1-based physical page
chunk.page_label # str — "A-6", "iv", "F-3" — as printed on the page
chunk.table_ids # list — IDs of tables referenced in this chunk
chunk.chart_ids # list — IDs of charts referenced in this chunk (docx/pptx)
chunk.link_url # list — URLs found in this chunk
chunk.bbox # BBox — bounding box (PDF only)
すべてのチャンクには、階層の深さにかかわらず、見出しの完全なパンくずリストが含まれます。たとえば、財務報告書で 6 階層目にある段落の場合:
chunk.path == [
"# PART I — FINANCIAL INFORMATION",
"## Item 1. Financial Statements",
"### Notes to Condensed Consolidated Financial Statements (Unaudited)",
"#### Note 4 – Financial Instruments",
"##### Accounts Receivable",
"###### Trade Receivables",
]
これにより、後続のコードで文書を再解析することなく、階層の任意のレベルに基づいてチャンクをフィルターしたり、グループ化したりできます。
対応形式
| 形式 | 拡張子 | 備考 |
|---|---|---|
.pdf | テキストベースとスキャン形式(スキャン形式には OCR extra が必要) | |
| Word | .docx | スタイルとアウトラインの階層をすべて保持 |
| HTML | .html、URL | 静的ファイルと JavaScript レンダリングページ(URL には html extra が必要) |
| PowerPoint | .pptx | スライド、発表者ノート、グラフ |
非対応形式:.doc、.ppt(旧形式の Office ファイル)、.xlsx。
解析
parse_document はファイル拡張子またはマジックバイトから形式を自動検出します。ファイルパス、URL、生の bytes、またはファイルライクオブジェクトを渡してください。
result = docslicer.parse_document("contract.docx")
result = docslicer.parse_document("report.pdf")
result = docslicer.parse_document("https://www.sec.gov/Archives/edgar/data/.../10-K.htm")
result = docslicer.parse_document(file_bytes)
解析とコンテンツのオプション
parse_document(および形式固有の関数)は、チャンク化する前に解析対象と解析方法を制御するオプションを受け付けます。形式固有の切り替えオプションは、API を統一するためどの関数でも受け付けますが、該当する形式でのみ有効になります。
result = docslicer.parse_document(
"contract.docx",
password="admin123", # decrypt password-protected files; .docx and .pptx needs [crypto] extra
max_workers=4, # process-pool width for PDF extraction/OCR (default: auto by CPU cores)
include_headers_footers=True, # docx: include header/footer content (default False)
include_footnotes=True, # docx: include footnotes (default True)
include_comments=True, # docx: include review comments (default False)
include_speaker_notes=True, # pptx: include slide speaker notes (default True)
use_browser=True, # html/URL: render in a real browser (default True)
)
チャンク化のオプション
result = docslicer.parse_document(
"report.pdf",
max_chunk_size=2000, # hard cap, default 3200
optimal_chunk_size=800, # target size, default 1500
min_chunk_size=400, # soft floor, default 700
chunking=False, # skip chunking, return blocks only (faster)
merge_small_chunks=True, # merge chunks below min_chunk_size (default True)
table_representation="jsonl", # "markdown" (default) | "jsonl" | "melted"
exact_tokens=True, # exact tiktoken (cl100k_base) counts; needs [llm] extra, else char/4 estimate
extra_fields=["is_bold", "font_size", "font_name"], # surface internal pipeline columns on each chunk/block via .extra
)
merge_small_chunks の動作
DocSlicer は構造を認識するため、最初は見出しまたは段落の境界ごとにチャンクを生成します。短いセクションが多い文書では、小さなチャンクが大量にできることがあります。merge_small_chunks=True(デフォルト)の場合、同じ親見出しの下にある兄弟セクションは、min_chunk_size に達するまで結合されます。ただし、別の親見出しの配下へ、見出しの境界を越えて結合されることはありません。
たとえば、次の5つの短いセクションはすべて ## Products and Services Performance の配下にあります。
### Mac → "Mac net sales decreased …" (~120 chars)
### iPad → "iPad net sales increased …" (~180 chars)
### Wearables → "Wearables net sales decreased …" (~130 chars)
### Services → "Services net sales increased …" (~160 chars)
4つの小さなチャンクに分かれる代わりに、各段落の path を正しく保持したまま、1つのまとまりのあるチャンクに結合されます。サイズにかかわらずセクションごとに1つのチャンクが必要な場合は、merge_small_chunks=False を設定してください。
表現形式
table_representation は、表をチャンクテキストにシリアライズする方法を制御します。複数行の列ヘッダーを含む財務表の場合:
"markdown"(デフォルト) — 元の2次元レイアウトを保持します。
| | Three Months Ended | Three Months Ended |
| | December 27, 2025 | December 28, 2024 |
|-----------|----------------------:|----------------------:|
| iPhone ® | $85,269 | $69,138 |
| Mac ® | 8,386 | 8,987 |
| iPad ® | 8,595 | 8,088 |
| … | … | … |
"melted" — セルごとに1行とし、ヘッダーを > で結合します。疎な表やピボット形式の表で、個々のセルの取得が重要な場合に適しています。
iPhone ® | Three Months Ended > December 27, 2025 | $85,269
iPhone ® | Three Months Ended > December 28, 2024 | $69,138
Mac ® | Three Months Ended > December 27, 2025 | 8,386
Mac ® | Three Months Ended > December 28, 2024 | 8,987
iPad ® | Three Months Ended > December 27, 2025 | 8,595
iPad ® | Three Months Ended > December 28, 2024 | 8,088
…
"jsonl" — 行ごとに1つの JSON オブジェクトを出力し、複数行のヘッダーは _ で結合します。チャンクを構造化データ抽出やツール使用のパイプラインに入力する場合に便利です。
{"Metric": "iPhone ®", "Three Months Ended_December 27, 2025": "$85,269", "Three Months Ended_December 28, 2024": "$69,138"}
{"Metric": "Mac ®", "Three Months Ended_December 27, 2025": "8,386", "Three Months Ended_December 28, 2024": "8,987"}
{"Metric": "iPad ®", "Three Months Ended_December 27, 2025": "8,595", "Three Months Ended_December 28, 2024": "8,088"}
…
バッチ処理
parse_all にフォルダーを指定するか、パスまたは URL のリストを渡してください。(source, result) のペアを生成し、解析に失敗したファイルがあってもバッチ処理は中断せず、そのファイルについては Exception を返します。チャンクサイズや include_* など、parse_document のキーワード引数は各文書に引き継がれます。
for path, result in docslicer.parse_all("documents/", recursive=True, max_chunk_size=2000):
if isinstance(result, Exception):
print(f"Failed {path}: {result}")
else:
print(f"{path}: {len(result.chunks)} chunks")
複数の文書で設定を再利用する
DocumentParser は複数の文書で固定の ParseConfig を保持し、HTML/URL の入力間で1つのブラウザーを開いたままにします(最初の HTML 解析時に遅延起動します)。そのため、URL のバッチ処理では文書ごとに起動するのではなく、Chromium を1回だけ起動します。ブラウザーを必ず解放するために、コンテキストマネージャーとして使用してください。
from docslicer import DocumentParser, ParseConfig
config = ParseConfig(max_chunk_size=1500, optimal_chunk_size=600)
with DocumentParser(config) as parser:
for path, result in parser.parse_all(paths): # or parser.parse(path) for one
...
2 つのレベルの並列処理
独立した設定項目が 2 つあり、組み合わせて使用できます。
ParseConfig(max_workers=N)— 1 つのドキュメント内での処理:PDF の単語抽出、セルの構築、OCR をプロセス間で並列化します(デフォルト:CPU コア数に応じて自動設定)。ドキュメントが大きい場合に最適です。DocumentParser(config, workers=N)— ドキュメント間での処理:ドキュメント全体をN個のワーカープロセスに振り分け、各プロセスが独自の設定とブラウザーを使用します。ドキュメントが多数ある場合に最適です。結果は投入順に返されます(この方式ではドキュメントごとの遅延処理は行われません)。
workers だけを設定した場合、各ワーカーの max_workers は 1 になり、入れ子のプールがマシンの処理能力を超えないようにします。両方のレベルを同時に実行するには、両方を明示的に設定してください。workers を使用する方式では、ブラウザーセッションや on_stage コールバックをプロセス間で転送できません。これらが必要な場合は、workers を設定しないでください。
エントリーポイントを保護してください。 DocSlicer は、並列処理に実際の CPU 処理が必要な場合(約 50 ページを超える PDF、長さを問わないスキャン済み/OCR 対応 PDF、および上記の 2 つの並列処理設定の両方)に、
ProcessPoolExecutorを使用します。これはオプトインではありません。通常のdocslicer.parse_document("big.pdf")でも実行されます。macOS と Windows では、Python はスクリプトを最初から最後まで再インポートしてワーカーを起動します。そのため、モジュールレベルで実行される解析処理は各ワーカーでも再実行され、さらにワーカーが起動されてRuntimeError: An attempt has been made to start a new process before the current process ... bootstrapping phaseが発生します。解析コードは関数内に置き、if __name__ == "__main__":ガードの後ろに配置してください。def main(): with DocumentParser(config, workers=4) as parser: for path, result in parser.parse_all(paths): ... if __name__ == "__main__": main()
階層をたどる
多くのチャンク化ライブラリが返すのは、テキストセグメントのフラットなリストです。DocSlicer では、ドキュメント自体から決定論的に抽出した見出し構造を、たどることのできるツリーとしても取得できます。
これは、長いドキュメントを扱うエージェントや検索パイプラインで特に役立ちます。ドキュメント全体をコンテキストに渡す代わりに、エージェントはまずアウトラインを調べて構造を把握し、関連するセクションを判断してから、必要なチャンクだけを取得できます。これにより、トークンの使用量をタスクに応じた範囲に保てます。
アウトラインを調べる
# Print the full heading tree
result.hierarchy.to_outline()
# Walk all top-level sections and see how much content each contains
for node in result.hierarchy.level(1):
print(node.text, "→", len(result.chunks_under(node)), "chunks")
セクションを掘り下げる
.level(n) は深さ n にあるすべての見出しを返します。parent を渡すと、特定のサブツリーに対象を絞れます。これは、長いドキュメントをたどるエージェントでよく使われるパターンです。
# All top-level headings
l1 = result.hierarchy.level(1)
# Pick one, then list its subsections
section = result.find_heading("Financial Statements")[0]
for node in result.hierarchy.level(2, parent=section):
print(node.text, f"(p.{node.page_number})")
# Drill one level deeper
subsection = result.hierarchy.level(2, parent=section)[0]
for node in result.hierarchy.level(3, parent=subsection):
print(node.text)
見出しの下にあるコンテンツを取得する
find_heading は、テキストに検索語を含むノード(大文字と小文字を区別しません)を検索します。すべての取得メソッドは、デフォルトでサブセクションも再帰的に検索します。
node = result.find_heading("Financial Instruments")[0]
chunks = result.chunks_under(node) # text chunks, ready for embedding or prompting
chunks = result.chunks_under(node, recursive=False) # direct heading only, no subsections
tables = result.tables_under(node) # structured tables in this section
charts = result.charts_under(node) # charts (with extracted data points) in this section
blocks = result.blocks_under(node) # raw paragraph/heading blocks
ページで移動する
result.chunks_by_page(14) # by page number
result.chunks_by_page("F-3") # by printed page label
result.blocks_by_page(14)
result.tables_by_page(14)
result.charts_by_page(14)
一度解析して、何度も移動する
解析結果は通常のデータなので、保存して後で読み込めます。同じドキュメントについてエージェントが多くの質問をする場合、質問のたびに再解析する必要はありません。
from pathlib import Path
import docslicer
cache = Path("annual_report.json")
if cache.exists():
result = docslicer.ParseResult.load(cache)
else:
result = docslicer.parse_document("annual_report.pdf")
result.save(cache)
再読み込みした結果でも hierarchy、find_heading、chunks_under、tables などの完全な API を利用できます。そのため、長時間稼働するエージェントセッションやドキュメントサーバーは、再解析せずにリクエストをまたいでドキュメントを開いたままにできます。
エクスポート
save() は、指定されたパスに応じて書き込む内容を決定します。
# Save the whole result and reload it later — keeps the heading hierarchy
result.save("result.json") # same output as result.to_json()
result = docslicer.ParseResult.load("result.json")
# A single collection, in the format you name
result.save("chunks.csv")
result.save("charts.jsonl") # stems: chunks | blocks | tables | charts | metadata
result.export_chunks_jsonl("chunks.jsonl")
# One file per collection
result.save("output/")
# → output/chunks.parquet, blocks.parquet, tables.parquet, metadata.json
# (+ charts.parquet when the document has charts)
# Falls back to .csv unless the [parquet] extra is installed.
# Render as Markdown or plain text
md = result.export_to_markdown(include_tables=True)
txt = result.export_to_text()
# DataFrames
df = result.chunks_df()
往復読み込みができるのは result.json だけです。コレクション形式とディレクトリ形式では、見出し階層を含まないフラットな行が書き込まれるため、ParseResult.load() では読み戻せません。
デバッグモード
result = docslicer.parse_document("report.pdf", debug=True)
# result.pipeline_steps is an ordered dict of step name → DataFrame
for name, df in result.pipeline_steps.items():
print(name, df.shape)
df.to_csv(f"debug/{name}.csv", index=False)
# PDF steps: words → shapes → cells → lines → table_cells → blocks → chunks
# DOCX/PPTX steps: runs → chart_points → paragraphs → lines → table_cells → blocks → chunks
OCR
parse_document はスキャンされたページを自動的に検出し、[ocr] エクストラがインストールされている場合は OCR に切り替えます。設定は不要です。OCR が使用されたかどうかは result.metadata.has_ocr で確認できます。
pip install 'docslicer[ocr]'
# tesserocr binds libtesseract directly, so install the Tesseract dev libraries first:
# Linux: apt install tesseract-ocr libtesseract-dev libleptonica-dev pkg-config
# macOS: brew install tesseract leptonica
MCP サーバー
DocSlicer にはMCP サーバーが付属しているため、LLM クライアント(Claude Desktop、Claude Code、Cursor など)からドキュメントを直接解析して読み取ることができます。
pip install 'docslicer[mcp]'
docslicer-mcp # stdio — what desktop clients launch
docslicer-mcp --transport http --port 8000
Claude Desktop / Cowork — ワンクリックインストール
最新リリースからdocslicer-X.Y.Z.mcpbをダウンロードし、ダブルクリックするか、Claude Desktopのウィンドウにドラッグします。インストール時に、DocSlicerによる読み取りと書き込みを許可するフォルダーを選択します。設定ファイルは不要で、自分でPythonを用意する必要もありません。uvがインタープリターを用意します。
その他のクライアント
以下のクライアントはいずれも、stdio経由でサーバーを起動します。事前にインストールしておくものはuvxだけです。
{
"mcpServers": {
"docslicer": {
"command": "uvx",
"args": ["--from", "docslicer[mcp]", "docslicer-mcp"],
"env": { "DOCSLICER_MCP_ROOT": "/Users/you/Documents" }
}
}
}
毎回の起動時に依存関係を解決せず、一度だけインストールしたい場合は、pip install 'docslicer[mcp]'(またはuv tool install)を使用し、argsを指定せずに"command": "docslicer-mcp"を設定します。
| クライアント | 設定ファイルの場所 |
|---|---|
| Claude Code | claude mcp add docslicer -- uvx --from 'docslicer[mcp]' docslicer-mcp |
| Cursor | ~/.cursor/mcp.json、またはプロジェクトごとの.cursor/mcp.json |
| VS Code | .vscode/mcp.json(mcpServersではなくserversキーを使用) |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Zed | context_serversの下にあるsettings.json |
GUIから起動するクライアントでは、
.mcpbをおすすめします。 Dockから起動したアプリはシェルのPATHを引き継ぎません。macOSでは/opt/homebrew/binが含まれないため、ターミナルでは動作するuvxやdocslicer-mcpが、クライアントから起動すると失敗することがあります。この問題が発生した場合は、絶対パス(which uvx)を使用してください。拡張機能を使えば、この問題を回避できます。
仕組み
解析済みのドキュメントはモデルのコンテキストウィンドウよりはるかに大きいため、サーバーは1回の呼び出しでドキュメント全体を返すことはありません。parseはドキュメントを登録し、doc_idハンドルと見出しのアウトラインを返します。それ以外のツールはすべてこのハンドルを受け取り、サイズを制限した部分を返します。モデルは必要な部分だけを取り込みます。
| ツール | 戻り値 |
|---|---|
parse | doc_idハンドル、タイトル、ページ数、見出しのアウトライン |
get_outline | コンテキストから外れた場合に再確認できるアウトライン |
read | アウトラインに記載された見出しの下にあるテキスト |
search | readする見出しをランキング順に提示し、それぞれにスニペットを付与 |
to_markdown | ドキュメント全体をディスクに書き込み、パスを返す |
アウトラインの各行には、その項目を読む際のコストが表示されます。
- Financial statements ~48k
- Note 14 — Segment reporting ~900
- Note 15 — Income taxes ~2.1k
この数値はreadが返す見積もりと同じため、アウトラインから立てた予算は、実際に読み込んでもそのまま当てはまります。サイズは累積値です。つまり、親のコストがその下の子のコストを下回ることはありません。そのため、コンテキストを消費する前にモデルが「下の階層に進むか、そのまま読むか」を判断できます。
readには、アウトラインに表示された見出しテキストをそのまま指定します。同じ見出しが2回登場する場合は、任意の祖先見出しを先頭に付けると区別できます("Notes > Revenue")。階層をすべて指定する必要はありません。返されるテキストには、ドキュメント固有のページラベル(S-23、iv)を使った[Page X]マーカーが挿入されます。そのため、引用はセクションの開始位置ではなく、実際に引用元となったページを示せます。
アウトラインだけでは疑問が解決しない場合は、searchを使います。たとえば、役に立つ情報を示さない見出し(Note 14、Item 7A)や、どの見出しにも記載されていない表の中に埋もれた数値を探す場合です。searchは、単語全体のリテラル一致とチャンクに対するBM25を組み合わせ、答えではなく「場所」を返します。各ヒットは、readに渡す見出しです。ドキュメント内に存在しない検索語も返されるため、まれな単語1つで高得点になった検索が不適切だったと判断できます。
ユーザーがドキュメントから導いた答えではなく、ドキュメントそのものを求めている場合は、to_markdownを使います。ディスクに書き込んでパスを返すため、ドキュメントの内容がモデルのコンテキストに入ることはなく、ドキュメントのサイズを気にする必要もありません。
解析結果はディスクにキャッシュされるため、同じオプションで同じファイルを再解析する場合、コストはかかりません。キャッシュキーにはファイルのサイズとmtimeが含まれます。ドキュメントを編集すると、次のparseで自動的に再解析されます。
設定
| 変数 | 効果 |
|---|---|
DOCSLICER_MCP_ROOT | ファイルソースと書き込み先の両方を、このディレクトリツリー内に制限します。複数指定する場合は、:(Windows では ;)で区切ります |
DOCSLICER_MCP_ALLOW_CLAUDE_DIR | 0 に設定すると、Claude デスクトップアプリ独自のディレクトリを許可されたルートから除外します(デフォルトは 1) |
DOCSLICER_MCP_ALLOW_URLS | 0 に設定すると、http(s) ソースを拒否します |
DOCSLICER_MCP_CACHE | 解析結果を保存する場所です(デフォルトは ~/.cache/docslicer-mcp) |
DOCSLICER_MCP_CACHE_MAX_MB | キャッシュサイズの上限です。古いものから削除されます(デフォルトは 2048、0 で無効) |
サーバーを自分以外にも公開する場合は、DOCSLICER_MCP_ROOT を設定してください。
設定しない場合、マシン上で読み取り可能なすべてのパスが解析対象となり、to_markdown
はサーバープロセスが書き込み可能な場所であればどこにでも書き込めます。
チャットにドロップしたドキュメント。 Claude の会話にファイルを添付しても、
サーバーに渡されるのは、把握しているパスではありません。アプリはまず、そのファイルを
独自のデータディレクトリ内にあるセッションごとのワークスペース(macOS では ~/Library/Application Support/Claude、Windows では %APPDATA%\Claude)にコピーします。この場所は、
ルートとして選ぶであろうフォルダーとはまったく別の場所です。そのため、このディレクトリは
DOCSLICER_MCP_ROOT とともに許可され、選択したフォルダーとチャットにドロップしたファイルの
両方を処理できます。このディレクトリが追加されるのは、設定したルートに対してのみです。
DOCSLICER_MCP_ROOT を設定しない場合、サンドボックスがまったくない状態であり、
そのディレクトリだけのサンドボックスになるわけではありません。自分で指定したルートだけを
許可するには、DOCSLICER_MCP_ALLOW_CLAUDE_DIR=0 に設定してください。
to_markdown は、チャットにドロップしたドキュメントを除き、ソースドキュメントと同じ場所に
書き込みます。チャットにドロップしたドキュメントのコピーは移動できないセッションフォルダーに
保存されるため、Markdown は最初の DOCSLICER_MCP_ROOT に書き込まれます。
コマンドライン
docslicer は、ファイルの内容を手早く確認したり、jq にパイプしたりできるよう、
ドキュメントを解析して JSON を標準出力に出力します。
docslicer report.pdf # chunks as JSON
docslicer report.pdf -o chunks.json # write to a file
docslicer report.pdf --no-chunking # blocks instead of chunks
parse_document と同じ解析オプションとチャンク化オプションを指定できます。
すべてのオプションについては、docslicer --help を実行してください。
フォーマット固有の関数
あらかじめフォーマットがわかっていて、想定外の入力に対して明示的に失敗させたい場合は、
フォーマット固有のバリエーションを使用してください。parse_document と同じ引数を指定できます。
docslicer.parse_pdf("report.pdf")
docslicer.parse_docx("contract.docx")
docslicer.parse_pptx("deck.pptx")
docslicer.parse_html("filing.html")
プライバシーポリシー
ポリシー全文:https://docslicer.ai/privacy
収集する情報。 ありません。DocSlicer にはテレメトリー、分析、クラッシュレポート、使用状況の追跡機能はなく、アカウント、ライセンスキー、登録も必要ありません。
ドキュメントの使用方法。 解析はすべて、ご利用のマシン上のローカルプロセスで実行されます。ドキュメントの内容は、ご依頼のアウトライン、テキストスライス、検索結果、Markdown の生成にのみ使用され、呼び出し元にのみ返されます。ドキュメントが DocSlicer や第三者にアップロードされることはありません。MCP サーバーとして実行する場合、DOCSLICER_MCP_ROOT によって、読み取りと書き込みが許可されるディレクトリツリーが制限されます。
データの保存場所と保存期間。 解析結果はご利用のディスクにキャッシュされます。デフォルトの保存先は ~/.cache/docslicer-mcp で、DOCSLICER_MCP_CACHE で変更できます。キャッシュのサイズは上限(DOCSLICER_MCP_CACHE_MAX_MB、デフォルトは 2048 MB)まで削減されます。それ以外の場合、削除されるまで保持されます。ディレクトリを削除すると、他の場所にコピーが残ることなく完全に削除されます。キャッシュディレクトリと、指定した出力先以外には何も書き込まれません。
ネットワークアクセスと第三者。 ローカルファイルに対してネットワークリクエストは行われません。リクエストがご利用のマシンから外部に送信されるのは、http(s) ソースを指定した場合のみです。その URL は、指定したホストから直接取得されます。HTML ページの場合、Playwright はブラウザーと同様に、そのページが参照するサブリソースを読み込むことがあります。sec.gov へのリクエストには、SEC の公正なアクセスに関するポリシーで求められているとおり、クライアントを識別する User-Agent ヘッダーが送信されます。これらは DocSlicer ではなく、ご自身が選択した第三者のホストであり、ログの記録については各ホストのポリシーが適用されます。リモートソースをすべて拒否するには、DOCSLICER_MCP_ALLOW_URLS=0 を設定してください。
第三者のクライアント。 DocSlicer を MCP サーバーとして実行する場合、クライアント(Claude、Cursor、…)は独自のプライバシーポリシーに基づいて会話を処理します。DocSlicer はその処理に関与せず、クライアントから情報を受け取ることもありません。
お問い合わせ。 プライバシーに関するお問い合わせ:[email protected] · 課題: https://github.com/DocSlicer/DocSlicer/issues
ライセンス
DocSlicer はデュアルライセンスです。
- AGPL-3.0 — AGPL の条件に従うことを条件に、無料で使用、変更、配布できます。これには、DocSlicer を使用するアプリケーションの完全なソースコードを、そのユーザー(ネットワーク経由で利用するユーザーを含む)に提供することが含まれます。
- 商用ライセンス — DocSlicer をクローズドソースまたはプロプライエタリ製品に組み込む場合、またはソースを公開せずにホステッド/SaaS サービスの一部として提供する場合に利用できます。
詳細は LICENSE-COMMERCIAL.md をご覧ください。商用ライセンスについてはお問い合わせください。
mcp-name: io.github.DocSlicer/docslicer
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。