プロトタイプ · プレビュー版:公式レジストリのすべてのサーバーを掲載し、30分ごとに同期しています。レビューとアカウント機能は今後のステップで始まります。
PopNx MCPAIを使う人のためのMCPサーバー · やさしい言葉で解説

Sezzlee PDF

作者:sezzleeバージョン 0.1.2i★ –iパソコンで動く
レジストリ名io.github.sezzlee/pdf

インストール

概要

作者による説明(英語の原文)

Extract text from local PDF documents with optional pluggable OCR. Read-only, no network.

PopNx MCPの3つの柱

この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。

できること

このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。

  • 接続方法: パソコンで動く
  • トランスポート: stdio
  • カテゴリ: 文書・表計算・事務作業

インストール

使っているAIアプリを選んで、設定をコピーしてください。

インストールの前に

  • 基本チェック:1項目中1項目に合格
  • あなたのパソコンで、あなたのユーザーと同じ権限(ファイル、ネットワーク、アプリ)で動きます。
  • レジストリには、入力が必要なキーは載っていません。

必要なもの

  • npmNode.jsのインストール(npxコマンドに必要)

どのアプリを使っていますか?

上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。

Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます

{
  "mcpServers": {
    "pdf": {
      "command": "npx",
      "args": [
        "-y",
        "@sezzlee/pdf-mcp"
      ]
    }
  }
}

ターミナルでこれを実行します

claude mcp add pdf -- npx -y @sezzlee/pdf-mcp

このサーバーは起動コマンドに値を入れる必要があるので、設定をコピーして入力してください。

または、設定を自分でコピーする

プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます

{
  "mcpServers": {
    "pdf": {
      "command": "npx",
      "args": [
        "-y",
        "@sezzlee/pdf-mcp"
      ]
    }
  }
}

ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。

このサーバーは起動コマンドに値を入れる必要があるので、設定をコピーして入力してください。

または、設定を自分でコピーする

プロジェクトの .vscode/mcp.json に貼り付けます

{
  "servers": {
    "pdf": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@sezzlee/pdf-mcp"
      ]
    }
  }
}

ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。

これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。

選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。

この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。

できること

パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。

基本チェックi

誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月6日にチェック

  • ✓ 合格

    作者とリポジトリが一致

    レジストリ名は、リポジトリを所有するGitHubアカウント sezzlee で確認済みです

  • … 未チェック

    今もメンテナンスされている

    このリポジトリはまだGitHubから読み取っていません

  • … 未チェック

    ライセンスがある

    このリポジトリはまだGitHubから読み取っていません

  • – 対象外

    エンドポイントが応答する

    これはパソコンで動くため、インターネット上のエンドポイントはありません

  • – 対象外

    OAuthでサインイン

    パソコンで動き、代わりにローカルの設定を使います

  • … 未チェック

    ツールの説明に隠れた指示がない

    パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです

文書・表計算・事務作業のほかのサーバーとの比較i

  • このカテゴリのほかの2174件のうち0%よりスターが多い
  • このカテゴリのほかの2174件のうち53%より最近レジストリに公開
  • 基本チェックの結果が、このカテゴリのほかの2174件のうち100%と同じかそれ以上

レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。

よくある質問

Sezzlee PDFは安全ですか?

当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。

どんなキーやコードが必要ですか?

レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。

パソコンで動きますか、それともクラウドですか?

あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。

今もメンテナンスされていますか?

GitHubリポジトリの最終更新は–、最新バージョン(0.1.2)がレジストリに届いたのは26 日前です。

どのアプリで使えますか?

Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにNode.jsも必要です。

代わりに使えるものは?

同じカテゴリには:Agent-Native Calendar, Excel MCP Server, MCP Server for Excel

代わりの候補

同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。

カードの見方:★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i

Excel MCP Server

作者:haris-musa

Create and edit Excel files with AI: charts, PivotTables, formulas. No Excel needed.

パソコンで動く★ 4,276MIT6 日前更新
インストール

MCP Server for Excel

作者:sbroenne

Excel automation for AI - Sheets, Power Query, DAX, VBA, Tables, Ranges and more. Windows only.

パソコンで動く★ 847MIT3 日前更新
インストール

作者のREADME

READMEを開く

作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。

@sezzlee/pdf-mcp

A read-only, sandboxed MCP server for local PDF documents. It builds on @sezzlee/file-core, which supplies sandbox path resolution, the response budget, the error envelope, cursors and the document cache. Text extraction uses @firecrawl/pdf-inspector. The server never reaches the network: OCR is optional, and when it is enabled, the connection decision belongs entirely to whoever supplies the two injected ports.

Quick start

{

"mcpServers": { "pdf": { "command": "npx", "args": ["-y", "@sezzlee/pdf-mcp", "/path/to/documents"] } } }

To enable OCR, point --ocr at a module whose default export is an OcrBinding (see Configuration and OCR):

{

"mcpServers": { "pdf": { "command": "npx", "args": [ "-y", "@sezzlee/pdf-mcp", "/path/to/documents", "--ocr", "/path/to/ollama-binding.js" ] } } }

Tools

ToolWhat it doesKey arguments
list_documentsLists readable PDF candidates under the root; never opens a filesubdirectory, pattern, maxResults
describe_documentPage count, document type, per-page OCR need, server capabilitiesfilePath
read_pagesReads selected pages as Markdown, page numbers 1-basedfilePath, pages, maxPages, ocr, cursor
find_in_documentLiteral search over extracted text, with page number and match contextfilePath, query, matchMode, caseSensitive, ocr, cursor

If the file path is already known, describe_document is optional: read_pages and find_in_document work from filePath alone.

Configuration

CLI (sezzlee-pdf [--ocr ]):

ArgumentDefaultMeaning
requiredSandbox root; every readable path is resolved and checked against it.
--ocr nonePath or package specifier to a module whose default export is { rasterizer, provider }. Absent means no OCR: read_pages/find_in_document refuse ocr: true and describe_document reports capabilities.ocr: false.

Programmatic (createPdfMcpServer(root, options)):

OptionDefaultMeaning
documentCacheSize2Extracted documents held in memory at once, 1–16. A budget, not a guard: each cached document holds every page's Markdown on the heap.
maxConcurrentListings4Concurrent list_documents calls before a request is refused.
maxConcurrentExtractions2Concurrent PDF extractions before a request is refused.
ocrnoneAn OcrBinding ({ rasterizer, provider, dpi?, maxPagesPerCall?, timeoutMs? }). Neither port is a dependency of this package.

OCR

The server does not perform OCR; it supports it. Two ports are injected — neither the raster library nor the model client is a dependency of this package.

interface PageRasterizer {

render(job: { bytes: Buffer; pages: readonly number[]; dpi: number; signal?: AbortSignal; }): Promise ; // { page, image, mediaType } }

interface OcrProvider { readonly name: string; recognize(job: { pages: readonly RenderedPage[]; signal?: AbortSignal; }): Promise ; // { page, markdown, confidence? } }

The server does exactly this: it renders the pages the text layer could not answer, recognizes the resulting images, substitutes the result for that page, and marks it source: "ocr".

Programmatic binding:

createPdfMcpServer(root, {

ocr: { rasterizer: pdfjsRasterizer, provider: ollamaProvider, dpi: 200 }, });

CLI binding — a module whose default export matches OcrBinding, loaded with --ocr (see examples/ollama-binding.ts in this package for a working example built from @sezzlee/pdf-raster-pdfjs and @sezzlee/ocr-ollama):

import { createPdfjsRasterizer } from "@sezzlee/pdf-raster-pdfjs";

import { createOllamaOcrProvider } from "@sezzlee/ocr-ollama"; import type { OcrBinding } from "@sezzlee/pdf-mcp";

const binding: OcrBinding = { rasterizer: createPdfjsRasterizer(), provider: createOllamaOcrProvider({ baseUrl: process.env["SEZZLEE_PDF_OCR_URL"] ?? "http://127.0.0.1:11434", model: process.env["SEZZLEE_PDF_OCR_MODEL"] ?? "deepseek-ocr:3b", }), dpi: 200, };

export default binding;

OCR rules
  • `ocr: true` with no provider bound is an error (ocr_unavailable), never a silent fall back to the text layer. Otherwise an agent that asked for OCR could mistake "nobody transcribed this document" for "no match". describe_document → capabilities.ocr reports whether one is bound.
  • An empty transcription does not count as an answer. If the provider returns empty text, the page stays needsOcr — "the model returned nothing" is not the same as "this page is blank".
  • An unrequested page is ignored. The ports may reorder, skip, or invent pages; results are matched to the page number that was requested, so a provider cannot overwrite a page the text layer already trusted.
  • Bytes leave the process. Binding a provider means those pages' pixels go somewhere else. OCR therefore defaults to off and is requested explicitly on every call.
  • A page is not re-transcribed on every call. Transcriptions are cached by document fingerprint plus page number. The cache is not a progress log: a search sends only the pages after the cursor to OCR and carries coverage forward in the cursor, so even a large document is eventually walked to the end from cache.
  • An expired job does not release its slot. Neither the engine nor an injected port can cancel work that has already started; the slot stays held until the work actually finishes. A provider that never returns can only be recovered by restarting the server — reclaiming the slot on a timer would only postpone the limit.

Rules

  • Every page number on the public surface is 1-based. The underlying library returns some fields 0-based and others 1-based within the same result object. The whole conversion lives in src/engine/, and lint bans importing @firecrawl/pdf-inspector outside that folder — a second import site would reintroduce the bug (measured on 1.23.0: PageMarkdownResult.page is 0-based, sibling pagesNeedingOcr is 1-based).
  • Page selection is validated before it reaches the library. An out-of-range index otherwise comes back as a phantom page marked needsOcr; a negative index wraps through u32. Both would look like a real page to the agent.
  • `describe_document` never builds its OCR page list from the classifier. classifyPdf marks every page of a document that contains a single scanned page. The list comes from the per-page extraction instead. classificationConfidence is confidence in the classifier's own verdict, not in any extracted text's accuracy.
  • An unreadable page is never presented as an empty one. A scanned page returns `needsOcr:

true; empty is true` only for a page the engine trusted and found genuinely blank.

  • Search coverage is reported on every response. When any page needs OCR, coverageComplete is false, and an empty match list is not proof the query is absent from the whole document.
  • A document is extracted once, in full; the response is paginated. Measurement showed that requesting a single page cuts extraction cost by a third, not 200-fold — the fixed cost dominates. Cursor identity depends on document content and OCR mode, not page size. An explicit pages selection is preserved across a cursor: it carries forward the rest of that selection and never wanders into unselected pages. A cursor resuming inside a page carries that page's text fingerprint; if the text changed since transcription, the response is stale_cursor rather than silently skipping content.
  • The server never reaches the network. fetch, node:http, node:net and their siblings are lint-banned inside src/, and the ban is repeated in every layer's override — a later oxlint override replaces no-restricted-imports rather than merging with it, so a single top-level ban would not apply everywhere.
  • Platform support is narrow. The engine ships no darwin-x64 binary and its wasm fallback is unpublished. On an unsupported host the server stops at startup with a one-line message (exit code 3).

Development

pnpm turbo run build --filter=@sezzlee/pdf-mcp

node packages/servers/pdf-mcp/dist/cli.js /path/to/documents

Tests: pnpm turbo run test --filter=@sezzlee/pdf-mcp (Vitest). A live-Ollama suite (test/ocr-live.spec.ts) is skipped unless SEZZLEE_PDF_OCR_URL is set; it also reads SEZZLEE_PDF_OCR_MODEL (default deepseek-ocr:3b). Everything else in test/ocr.spec.ts runs against fake ports; the live suite only proves the two real adapters compose.

PopNxに聞く